在多项式中运行glmnet时出错


9

在R包glmnet的1.7.3版本中解决了此问题中提到的问题。

我在使用family = multinomial运行glmnet时遇到一些问题,并且想知道是否遇到了类似的问题,或者是否能够告诉我我在做什么错。

当我放入自己的虚拟数据时,运行时会报告错误“ apply(nz,1,中位数):dim(X)必须具有正长度的错误” cv.glmnet,除了说“它没有用”之外,对我来说并没有提供太多信息。

y=rep(1:3,20) #=> 60 element vector
set.seed(1011)
x=matrix(y+rnorm(20*3*10,sd=0.4),nrow=60) # 60*10 element matrix
glm = glmnet(x,y,family="multinomial")   #=> returns without error
crossval = cv.glmnet(x,y,family="multinomial")   #=> Error in apply(nz, 1, median) : dim(X) must have a positive length
crossval = cv.glmnet(x,y,family="multinomial",type.measure="class")   #=> Error in apply(nz, 1, median) : dim(X) must have a positive length
crossval = cv.glmnet(x,y,family="multinomial",type.measure="mae")   #=> Error in apply(nz, 1, median) : dim(X) must have a positive length
cvglm = cv.glmnet(x,y,family="multinomial",lambda=2)   #=> Error in apply(nz, 1, median) : dim(X) must have a positive length

这是我试图让glmnet解决的问题的直观描述,如果有帮助的话:

my_colours = c('red','green','blue')
plot(x[,1],x[,2],col=my_colours[y])

我能够从软件包文档中运行示例代码,这使我怀疑是我误解了某件事,还是glmnet中存在一个错误。

library(glmnet)
set.seed(10101)
n=1000;p=30
x=matrix(rnorm(n*p),n,p) #=> 1000*30 element matrix
beta3=matrix(rnorm(30),10,3)
beta3=rbind(beta3,matrix(0,p-10,3))
f3=x%*% beta3
p3=exp(f3)
p3=p3/apply(p3,1,sum)
g3=rmult(p3) #=> 1000 element vector
set.seed(10101)
cvfit=cv.glmnet(x,g3,family="multinomial")

尽管我可以在R 2.14.1上产生相同的问题,但它使用的是R版本2.13.1(2011-07-08)和glmnet 1.7.1。有什么想法的人吗?

Answers:


11

有一个细微的错误。

发生的情况如下:在人工数据集中,三组平均值在一条线上,并且使用相对较小的标准偏差,这三组在10维空间中变为线性可分离的。结果,对于所有λ,与第二组有关的所有参数都估计为0 。校验

coef(glm)

在内部cv.glmnet有一个呼叫predict,以确定每个非零系数的数目。尝试λ

predict(glm, type = "nonzero")

通过阅读cv.glmnet代码,该结构应该是列表的列表,但是列表中的第二个条目为NULL,而不是列表!这会导致错误。它发生在以下代码块中cv.glmnet

if (inherits(glmnet.object, "multnet")) {
    nz = predict(glmnet.object, type = "nonzero")
    nz = sapply(nz, function(x) sapply(x, length))
    nz = ceiling(apply(nz, 1, median))
}

这两次嵌套sapply调用返回的结果不是最后一次调用所期望的矩阵apply。这会产生错误。

在实践中不太可能会遇到错误,但是代码对于极端情况当然应该很健壮。您应该将问题报告给维护者Trevor Hastie(他的电子邮件在链接中列出)。


感谢您的周到快速答复。您说的大多数事情似乎都是正确的,但我不确定原因一定是它们是线性可分离的。如果您在输入中增加
rmrm

1
NRH:一个想法无关紧要-我怀疑Hastie教授可能不喜欢您将电子邮件以纯文本形式发送,因为它可能会导致垃圾邮件(尽管当然无法确定)。我的意思不是听起来恶劣作为你的答案是非常有帮助..
BenJWoodcroft

2
@BenJWoodcroft,不是线性可分离性会触发错误,而是三组沿着一条线的几何组织。线性可分离性使该组织在采样数据中更加明显,并且如果您充分增加标准偏差,glmnet不会“发现”该组织。如第二个示例所示,您实际上不需要线性可分离性。您的电子邮件地址是正确的,谢谢。
NRH 2012年

3
我也在glmnet 1.9.8和R 3.1.1以及上面的代码以及在小插图上提供的带有示例数据的代码上遇到了此错误。
user2030668 2014年

1
我在Windows和glmnet 2.0-2上使用R 3.2.1的真实数据中看到此错误。训练数据具有229个预测变量的449个观测值。响应变量有9个级别。任何有关如何进行的建议都将受到欢迎。
肯特·约翰逊

-1

首先转换矩阵

x没有反应成数值。之后,像数据结构一样,通过搜索名称或行名找到对模型有贡献的有效系数。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.