【问题标题】:R glmnet as.matrix() error messageR glmnet as.matrix() 错误信息
【发布时间】:2012-01-17 11:56:36
【问题描述】:

我正在尝试在数据集上使用 glmnet 包。我使用cv.glmnet() 来获取glmnet() 的lambda 值。我排除了第 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

有什么建议吗?

【问题讨论】:

  • 我自己想出来的。而不是 as.matrix() 我需要使用:data.matrix()。
  • 我对这个包不太熟悉,但看起来你在等式两边都提供了二项式响应... x=t[,c(1,2,7 ,12)] AND y=t[,2] ...如果您发现您的模型看起来好得令人难以置信,这可能就是原因。
  • 不确定是否有图形错误,但输入向量是 x=t[,-c(1,2,7,12)]。 c() 前面的“-”表示排除这些列并保留其他所有内容,因此响应应该只在等式的一侧。
  • screechOwl,这是一个完全有效的答案,发表你自己的答案,我会投票;该错误消息真的没用。我也只是用分类矩阵来解决这个问题。
  • 在此处插入我自己的包:glmnetUtils 让您可以使用公式+data.frame 语法来调用 glmnet,并且希望能解决这样的问题。

标签: r glmnet


【解决方案1】:

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

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

应该做的工作。

【讨论】:

    【解决方案2】:

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

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

    在 predict.glmnet 中:

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

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

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

    由于我没有将其视为有关该错误的众多问题之一的答案,因此我想将其发布在此处。

    【讨论】:

    • 只是为了给未来的人添加这个,我遇到了同样的问题,使用 as(x, "dgCMatrix") 和 as.vector(classifications) 似乎可以解决问题。示例代码:cvfit = cv.glmnet(x= as(data, "dgCMatrix"), y = as.vector(classification), family = "binomial")
    【解决方案3】:

    我在使用 cv.glmnet 时收到了类似的错误消息。 cv.glmnet 在 RStudio 中可以正常工作,但在使用 Rscript 时将无法工作。对我来说,解决方法是添加到我的脚本顶部:

    require(methods)

    似乎“glmnet”包可能正在使用“methods”包中的某些功能,但使用Rscript时启动时未加载此包。但是,“方法”包通常在 R 中默认加载。

    以下是有关此 Rscript 功能的信息:

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

    我希望这对遇到与我相同的问题的人有所帮助。

    【讨论】:

      猜你喜欢
      • 2011-10-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-14
      • 2015-09-22
      • 2014-09-08
      相关资源
      最近更新 更多