26

我正在尝试glmnet在数据集上使用该包。我cv.glmnet()用来获取 的 lambda 值glmnet()。我排除了第 1、2、7、12 列,因为它们是:id 列、响应列、包含 NA 和包含 NA。

这是数据集和错误消息:

> head(t2)
  X1 X2        X3 X4 X5         X6    X7 X8 X9 X10 X11 X12
1  1  1 0.7661266 45  2 0.80298213  9120 13  0   6   0   2
2  2  0 0.9571510 40  0 0.12187620  2600  4  0   0   0   1
3  3  0 0.6581801 38  1 0.08511338  3042  2  1   0   0   0
4  4  0 0.2338098 30  0 0.03604968  3300  5  0   0   0   0
5  5  0 0.9072394 49  1 0.02492570 63588  7  0   1   0   0
6  6  0 0.2131787 74  0 0.37560697  3500  3  0   1   0   1
> str(t2)
'data.frame':   150000 obs. of  12 variables:
 $ X1 : int  1 2 3 4 5 6 7 8 9 10 ...
 $ X2 : int  1 0 0 0 0 0 0 0 0 0 ...
 $ X3 : num  0.766 0.957 0.658 0.234 0.907 ...
 $ X4 : int  45 40 38 30 49 74 57 39 27 57 ...
 $ X5 : int  2 0 1 0 1 0 0 0 0 0 ...
 $ X6 : num  0.803 0.1219 0.0851 0.036 0.0249 ...
 $ X7 : int  9120 2600 3042 3300 63588 3500 NA 3500 NA 23684 ...
 $ X8 : int  13 4 2 5 7 3 8 8 2 9 ...
 $ X9 : int  0 0 1 0 0 0 0 0 0 0 ...
 $ X10: int  6 0 0 0 1 1 3 0 0 4 ...
 $ X11: int  0 0 0 0 0 0 0 0 0 0 ...
 $ X12: int  2 1 0 0 0 1 0 0 NA 2 ...

> cv1 <- cv.glmnet(as.matrix(t2[,-c(1,2,7,12)]), t2[,2], family="binomial")
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: invalid class 'NA' to dup_mMatrix_as_dgeMatrix
> cv1 <- cv.glmnet(as.matrix(t2[,-c(1,2,7,12)]), t2[,2], family="multinomial")
Error in t(.Call(Csparse_dense_crossprod, y, t(x))) : 
  error in evaluating the argument 'x' in selecting a method for function 't': Error: invalid class 'NA' to dup_mMatrix_as_dgeMatrix

有什么建议么?

4

3 回答 3

37

出于某种原因,glmnet 更data.matrix()喜欢as.matrix()

cv1 <- cv.glmnet(data.matrix(t2[,-c(1,2,7,12)]), t2[,2], family="multinomial")

应该做的工作。

于 2014-05-17T10:41:20.907 回答
7

我得到了同样的错误消息。不幸的是,它并不像使用 data.matrix() 那样简单。

错误发生在输入矩阵和模型系数的叉积中。

在 predict.glmnet 中:

nfit = as.matrix(cbind2(1, newx) %*% nbeta)

为我解决问题的方法是强制 x 使用 dgCMatrix。我真的不明白为什么,但它对我有用。

predict(object = lm, newx =  as(x, "dgCMatrix"), type = "response")

Since I haven't seen this as an answer in one of the many questions regarding that error I thought I'd post it here.

于 2016-07-17T17:14:34.957 回答
6

I had a similar error message when using cv.glmnet. cv.glmnet would function correctly in RStudio, but it would fail to work when using Rscript. The fix for me was to add to the top of my script:

require(methods)

It seems that the "glmnet" package may be using some functions from the "methods" package, but this package is not loaded at startup when using Rscript. However, the "methods" package is normally loaded by default in R.

Here is information about this Rscript functionality:

Rscript does not load methods package, R does -- why, and what are the consequences?

I hope this helps someone that runs into the same issue that I did.

于 2017-12-05T18:29:52.280 回答