【问题标题】:cvfit error {not-yet-implemented method for <data.frame> }cvfit 错误 {<data.frame> 的尚未实现的方法}
【发布时间】:2021-09-01 14:57:22
【问题描述】:

我正在使用 glmnet 和 cv.glmnet 拟合多项式模型:

fit <- glmnet(x, y, family = "multinomial")
cvfit <- cv.glmnet(x, y, family = "multinomial")

我的变量是

x:
 $ Q1: int [1:1000] 3 3 5 3 3 4 3 3 4 4 ...
 $ Q2: int [1:1000] 4 3 5 5 5 5 5 5 4 4 ...
 $ Q3: int [1:1000] 3 3 4 3 5 5 4 5 5 5 ...
 $ Q4: int [1:1000] 3 5 5 4 5 4 4 4 1 4 ...
 $ Q5: int [1:1000] 2 4 5 3 5 3 4 4 3 5 ...
 $ Q6: int [1:1000] 2 1 4 3 4 3 3 4 3 3 ...
 $ Gender : Factor w/ 2 levels "Female","Male": 1 1 1 1 2  

  

y: Factor w/ 7 levels "A", "B", "C", "D", "E"

但是,我只在使用 cv.glmnet 时收到此错误,但在使用 glmnet 时不会:

Error in cbind2(1, newx) %*% (nbeta[[i]]) : 
  not-yet-implemented method for <data.frame> %*% <dgCMatrix>

希望有人能解释一下原因,谢谢!

【问题讨论】:

    标签: r regression glmnet


    【解决方案1】:

    您需要使用以下示例确保您的独立或外生x 是矩阵而不是数据框:

    library(glmnet)
    
    x = data.frame(matrix(sample(1:5,5000,replace=TRUE),ncol=5))
    x$Gender = factor(sample(c("Female","Male"),1000,replace=TRUE))
    y = factor(sample(LETTERS[1:7],1000,replace=TRUE))
    

    我们使用model.matrix()~.作为公式,表示数据框中的所有变量都是自变量,我删除了intercept列,因为它将包含在cv.glmnet中,你可以看到你的因子@987654325 @ 是二进制编码的:

    xmat = model.matrix(~ .,data=x)[,-1]
    head(xmat)
          X1 X2 X3 X4 X5 GenderMale
    1  3  1  1  1  1          0
    2  5  2  4  3  2          1
    3  1  3  2  5  4          1
    4  5  5  1  4  2          0
    5  3  3  3  1  2          0
    6  1  1  3  1  4          1
    

    运行这个:

    cv.glmnet(xmat,y,family="multinomial")
    
    Call:  cv.glmnet(x = xmat, y = y, family = "multinomial") 
    
    Measure: Multinomial Deviance 
    
         Lambda Index Measure       SE Nonzero
    min 0.02215     1     3.9 0.004419       0
    1se 0.02215     1     3.9 0.004419       0
    

    【讨论】:

    • 谢谢,但是,将因子变量编码为虚拟变量会影响结果吗?我已经阅读了有关对比的文章,我想我会设置一个我不打算与将因素作为一个因素进行分析进行比较的对比。
    • 它不是关于对比,问题是你的因变量应该是一个矩阵。如果其中一个是因素或类别,则需要进行一次热编码或创建虚拟
    • 你能扩展你的答案吗?我对这个问题很感兴趣!将因子编码为矩阵或因子有什么区别?谢谢!
    • 在一个矩阵中,你所有的元素都是相同的类型。因此,在您的示例中,如果您将所有数据框强制转换为矩阵,那么您的因素将会变得很奇怪。
    • 这是glmnet 函数的编写方式,它需要一个矩阵作为输入,因此您必须对因子列进行一次热编码。
    猜你喜欢
    • 2021-08-03
    • 2016-05-28
    • 1970-01-01
    • 2018-08-13
    • 2014-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-21
    相关资源
    最近更新 更多