在多项式中运行 glmnet 时出错

机器算法验证 r 多项分布 网络
2022-03-09 17:57:27

此问题中提到的问题在 R 包 glmnet 的 1.7.3 版本中已修复。

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

当我放入自己的虚拟数据时,运行时会报告错误“应用错误(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.13.1 (2011-07-08) 和 glmnet 1.7.1,尽管我可以在 R 2.14.1 上产生相同的问题。任何想法的人?

2个回答

有一个微妙的错误。

发生的情况如下:在您的人工数据集中,三组均值在一条线上,并且使用相对较小的标准差,这三组在您的 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(他的电子邮件在链接中列出)。

例如首先转换你的矩阵

x 没有响应到 numeric 。之后,通过搜索列名或行名找到对模型有贡献的重要系数,就像变量在数据结构中一样。