glmnet预测方法抛出加密错误

4

我正在使用 glmnet 进行预测,并收到一个非常晦涩的错误信息。 在使用 glmnet 时,我以前从未遇到过这种情况,谷歌搜索也没有有效果。当取消注释最后一行时出现了该错误。

library(ISLR)
library(glmnet)


Hitters=na.omit(Hitters)
Hitters$Salary = log(Hitters$Salary)

Hitters.train = Hitters[1:200,]
Hitters.test = Hitters[201:dim(Hitters)[1],]

x=model.matrix(Salary~.,Hitters)[,-1]
cv.out=cv.glmnet(x, Hitters$Salary, alpha=0)
bestlam=cv.out$lambda.min
ridge.mod=glmnet(x, Hitters$Salary, alpha=0,lambda=bestlam)

newx = data.matrix(Hitters.test)
#ridge.pred=predict(ridge.mod,s=bestlam,newx=newx)

错误输出:

Loading required package: Matrix
Loading required package: methods
Loaded glmnet 1.9-5

Error in as.matrix(cbind2(1, newx) %*% nbeta) : 
  error in evaluating the argument 'x' in selecting a method for function 'as.matrix': Error in t(.Call(Csparse_dense_crossprod, y, t(x))) : 
  error in evaluating the argument 'x' in selecting a method for function 't': Error: Cholmod error 'X and/or Y have wrong dimensions' at file ../MatrixOps/cholmod_sdmult.c, line 90
Calls: %*% -> %*% -> t
Calls: predict ... predict.elnet -> NextMethod -> predict.glmnet -> as.matrix
Execution halted

请注意,将newx = data.matrix(Hitters.test)更改为newx = model.matrix(Salary~.,Hitters.test)并没有帮助。

按要求,在运行之前,这里是sessionInfo()的输出结果。

> sessionInfo()
R version 3.0.2 (2013-09-25)
Platform: x86_64-unknown-linux-gnu (64-bit)

locale:
[1] C

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base

运行后的输出如下:

> sessionInfo()
R version 3.0.2 (2013-09-25)
Platform: x86_64-unknown-linux-gnu (64-bit)

locale:
[1] C

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base

other attached packages:
[1] glmnet_1.9-5 Matrix_1.1-0 ISLR_1.0

loaded via a namespace (and not attached):
[1] grid_3.0.2      lattice_0.20-23

想要查看sessionInfo()的结果。有一些小概率是由于最近对Matrix包的更新,或者Matrixglmnet版本之间的不匹配引起的...? - Ben Bolker
1个回答

8
原来我必须将响应中的NULL清空。以下代码可正常工作:
library(ISLR)
library(glmnet)


Hitters=na.omit(Hitters)
Hitters$Salary = log(Hitters$Salary)

Hitters.train = Hitters[1:200,]
Hitters.test = Hitters[201:dim(Hitters)[1],]

x=model.matrix(Salary~.,Hitters)[,-1]
cv.out=cv.glmnet(x, Hitters$Salary, alpha=0)
bestlam=cv.out$lambda.min
ridge.mod=glmnet(x, Hitters$Salary, alpha=0,lambda=bestlam)

Hitters.test$Salary <- NULL
newx = data.matrix(Hitters.test)
ridge.pred=predict(ridge.mod,s=bestlam,newx=newx)

你这样不是删除了输入数据框的整列吗?这样做会导致在后续的预测函数中无法使用结果矩阵(缺少薪水列)。所有变量都需要匹配... - theforestecologist
@theforestecologist,很抱歉,由于时间过长,我已经没有足够的上下文来回答这个问题了。 - merlin2011
1
我只想评论一下,我解决这个问题的方法是手动设置我的 x 变量因子在我的初始训练数据和测试数据之间保持相同的水平。 - theforestecologist

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接