【问题标题】:issue with predict with glmnetUtilsglmnetUtils 的预测问题
【发布时间】:2016-09-16 01:07:37
【问题描述】:

尝试使用来自 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

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

【问题讨论】:

  • @Hack-R 咕噜声。抱歉,已编辑。
  • 感谢您了解这一点。我将推送更新到 glmnetUtils 以允许 NA 处理。

标签: r glmnet


【解决方案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"),如果有任何问题,请告诉我。

【讨论】:

  • predict.glm 的默认值是 na.action = na.pass,它会丢弃带有 NA 的观测值。 na.exclude 不应该填充预测吗?
  • 你倒退了:na.pass 保留行,na.exclude 删除行。一般来说predict.lmglm 很复杂,但我的行为应该符合最常见的情况,即在拟合模型时保持默认值不变,并在预测时指定新数据。
  • 我想我不明白 predict.cv.glmnet 的语义。新版本默认工作正常。如果 na.action=na.exclude 则发生相同的错误。我认为 predict() 的默认值是 na.pass 因此造成混乱。感谢您的更新!
  • 对,如果您的数据有 NA,并且您想对其进行预测,那么只需将所有内容设置为默认值。
  • 另外,predict.lmglm 的默认值是 na.pass。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-07-15
    • 2019-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-03
    • 1970-01-01
    相关资源
    最近更新 更多