尝试将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
任何想法发生了什么?非常感谢您的帮助!
答案 0 :(得分:1)
这是基础glmnet包的问题,但没有理由不能在glmnetUtils中处理它。我只是pushed an update应该允许您使用na.action
参数和predict
方法进行基于公式的调用。
na.action=na.pass
(默认值)将填充预测,以包含缺少值的行的NA na.action=na.omit
或na.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(.))