【问题标题】:Changing glmnet from binomial to multinomial gives error将 glmnet 从二项式更改为多项式会出错
【发布时间】:2021-09-22 16:59:53
【问题描述】:

我正在尝试调整二项式 glmnet 的代码以使其适用于多项式问题,但由于某种原因,我不断收到错误代码。

这是完美运行的二项式模型的原始代码:

  traininglasso <- stratified(sp_lasso, group = "Cat",
                              select = list(Cat = c("A","B", "C")),
                              size = c(86), replace=FALSE)
  
  traininglasso[,Cat:=factor(Cat, labels = c("B", "B", "C") )]
  check_lasso <- anti_join(sp_lasso, traininglasso, by=c("Accepted Symbol"))
  check_lasso[,Cat:=factor(Cat, labels = c("B", "B", "C") )]

  use_for_lasso <- within(for_lasso, Cat <- relevel(Cat, ref="C"))
  
  lassod <- model.matrix(Cat~., use_for_lasso)[,-1]
  
  cv.lassod <- cv.glmnet(lassod, use_for_lasso$Cat, alpha =1, family= "binomial")
  
  lambdad <- cv.lassod
  
  lasso_modeld <- glmnet(lassod, use_for_lasso$Cat, alpha =1, family = "binomial", 
                              lambda = lambdad$lambda.1se)
  
  coefd <- coef(lasso_modeld)
  
  check_lasso_matrix <- model.matrix(Cat~., check_lasso)[,-1]
  
  probslasso4 <- as.data.frame(predict.glmnet(lasso_modeld, type="response", newx = check_lasso_matrix))

对不起,罗嗦了这么多,但基本上我的步骤是这样的:

  1. 对原始数据集进行分层随机抽样,以获得“A”、“B”和“C”三个类别(猫)中的每一个的 86 个观察值
  2. 将类别 A 和 B 连接在一起,这样结果就是二元的(两个类别,只有 B 和 C)
  3. 组装所有不在随机样本中的观察结果,用于最后检查模型的准确性,并对它们进行重新分类。
  4. 按照建议运行 LASSO glm 的步骤
  5. 然后,在最后一行中,使用非训练数据生成预测以检查模型的准确性。

同样,所有这些都可以正常工作。 但是,当我将数据保留为三个类别并将族更改为多项式时(从字面上看,这些是我在下面的代码中所做的唯一更改,包括数据在内的所有其他内容都是相同的)我收到此错误消息:

Error in h(simpleError(msg, call)) : 
  error in evaluating the argument 'x' in selecting a method for function 'as.matrix': requires numeric/complex matrix/vector arguments

我读过其他人遇到此错误并且只需要重新格式化他们的矩阵,但我怀疑这不是我的问题,因为二项式代码适用于我用于此的矩阵。

这是我尝试过的多项式版本的代码,但它不起作用。我再次运行了上面的整个代码块,但我在这里只包括我编辑的从二项式到多项式的 4 行:


  traininglasso[,Cat:=factor(Cat, labels = c("A", "B", "C") )]

  check_lasso[,Cat:=factor(Cat, labels = c("A", "B", "C") )]

  
  cv.lassod<- cv.glmnet(lassod, use_for_lasso$Cat, alpha =1, family= "multinomial")
  
  
  lasso_modeld <- glmnet(lassod, use_for_lasso$Cat, alpha =1, family = "multinomial", 
                              lambda = lambdad$lambda.1se)
  

【问题讨论】:

  • 我还应该注意,错误消息专门附加到代码的最后一行(以probslasso4 &lt;- 开头的代码 - 它上面的所有行都运行没有问题
  • 一个更短的可重现示例会有所帮助。很可能,您正在尝试传递字符向量或不能直接转换为矩阵的东西。
  • 对不起!我已经清理了一点,并删除了不必要的东西。感谢您的帮助 - 但如果不编辑二项式和多项式版本之间的数据(除了重新分类响应变量),为什么矩阵格式会改变/现在有问题?

标签: r glmnet multinomial


【解决方案1】:

想通了。无论出于何种原因,当您使用 glmnet 创建多项式模型时,您需要使用常规的 predict() 函数而不是 predict.glmnet() 函数。对多项式和二项式模型使用相同的模型矩阵效果很好 - 似乎错误实际上与矩阵格式无关。

【讨论】:

    猜你喜欢
    • 2018-01-13
    • 2015-07-11
    • 2014-01-29
    • 2018-12-03
    • 2019-09-24
    • 2021-09-26
    • 2015-01-28
    • 2021-08-07
    • 2012-06-12
    相关资源
    最近更新 更多