用glmnetUtils预测问题

时间:2016-09-16 01:07:38

标签: r glmnet

尝试将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

任何想法发生了什么?非常感谢您的帮助!

2 个答案:

答案 0 :(得分:1)

这是基础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")一起使用并告诉我是否有任何问题。

答案 1 :(得分:0)

事实证明它正在发生,因为预测变量中有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(.))