2016-09-16 57 views
0

试图从GitHub使用glmnetUtils包式接口glmnet但预测不估计足够的值问题与预测与glmnetUtils

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 

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

+1

@ Hack-R呜呜声。对不起,编辑它。 – Dominik

+1

感谢您接受此。我会将更新推送到glmnetUtils以允许NA处理。 –

回答

1

这是与底层glmnet包的问题之前过滤完整的情况下,但没有理由认为它不能在glmnetUtils处理。我只是pushed an update应该允许您使用na.action参数与predict方法进行基于公式的调用。

  • 设置na.action=na.pass(默认值)将垫出来的预测,以包括行来港与遗漏值
  • na.action=na.omitna.exclude将删除这些行

注意,给定行的missingness可能取决于正式化程度有多大:如果NAs适用于从模型中删除的变量,那么该行将被视为一个完整的案例。

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

给它一个去与install_github("Hong-Revo/glmnetUtils")并告诉我,如果有什么事情休息。

+0

'predict.glm'的默认值是'na.action = na.pass',它会使用NA来删除观察值。不应该'na.exclude'填充预测? – Dominik

+0

你已经倒过来了:'na.pass'保留行,'na.exclude'删除行。一般来说'predict.lm'和'glm'是复杂的,但是我得到的行为应该与最合适的情况匹配,即在拟合模型时保持默认值不变,并且在预测时指定新数据。 –

+0

我想我不明白predict.cv.glmnet的语义。新版本默认工作正常。如果na.action = na.exclude则发生相同的错误。我认为predict()的默认值是na.pass因此造成混乱。感谢更新! – Dominik

0

发现它的发生是因为预测变量中存在NA,所以predict()na.action=na.exclude以来导致较短的向量。

通常解决方法是使用predict(object,newdata,na.action=na.pass),但predict.cv.glmnetdoes not acceptpredict的其他参数。

因此解决的办法是开始

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