使用 glmnetUtils 进行预测的问题

issue with predict with glmnetUtils

尝试将 GitHub 中的 glmnetUtils 包用于 glmnet 的公式接口,但预测未估计足够的值

library(nycflights13) # from GitHub
library(modelr)
library(dplyr)
library(glmnet)
library(glmnetUtils)
library(purrr)


fitfun=function(dF){
  cv.glmnet(arr_delay~distance+air_time+dep_time,data=dF)
}
gnetr2=function(model,datavals){
  yvar=all.vars(formula(model)[[2]])
  print(paste('y variable:',yvar))
  print('observations')
  print(str(as.data.frame(datavals)[[yvar]]))
  print('predictions')
  print(str(predict(object=model,newdata=datavals)))
  stats::cor(stats::predict(object=model, newdata=datavals), as.data.frame(datavals)[[yvar]], use='complete.obs')^2
}


flights %>% 
  group_by(carrier) %>% 
  do({
    crossv_mc(.,4) %>% 
      mutate(mdl=map(train,fitfun),
             r2=map2_dbl(mdl,test,gnetr2))
  })

gnetr2()的输出:

[1] "y variable: arr_delay"
[1] "observations"
 num [1:3693] -33 -6 47 4 15 -5 45 16 0 NA ...
NULL
[1] "predictions"
 num [1:3476, 1] 8.22 21.75 24.31 -7.96 -7.27 ...
 - attr(*, "dimnames")=List of 2
  ..$ : chr [1:3476] "1" "2" "3" "4" ...
  ..$ : chr "1"
NULL
Error: incompatible dimensions

有什么想法吗?非常感谢您的帮助!

原来它的发生是因为预测变量中有 NA,所以 predict() 导致比 na.action=na.exclude 更短的向量。

通常一个解决方案是使用 predict(object,newdata,na.action=na.pass)predict.cv.glmnet does not accept predict.

的其他参数

因此解决方案是在开始之前过滤完整的案例

flights=flights %>% filter(complete.cases(.))

这是底层 glmnet 包的问题,​​但没有理由不能在 glmnetUtils 中处理。我只是 pushed an update 应该允许您将 na.action 参数与 predict 方法一起用于基于公式的调用。

  • 设置na.action=na.pass(默认值)将填充预测以包含缺失值行的 NA
  • na.action=na.omitna.exclude 将删除这些行

请注意,给定行的缺失可能会根据进行的正则化程度而变化:如果 NA 用于从模型中删除的变量,则该行将被视为完整案例。

还借此机会修复了公式的 LHS 包含表达式的错误。

试一试 install_github("Hong-Revo/glmnetUtils") 如果有任何问题请告诉我。