将 glmnet 从二项式更改为多项式会产生错误

Changing glmnet from binomial to multinomial gives error

我正在尝试调整二项式 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. 对原始数据集进行分层 运行dom 样本,以获得三个类别(Cat)中每个类别的 86 个观察值:“A”、“B”和“C”
  2. 将类别 A 和 B 连接在一起,使结果是二元的(两个类别,只有 B 和 C)
  3. Assemble 不在 运行dom 样本中的所有观察结果用于最后检查模型准确性并重新分类。
  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)
  

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