2016-09-16 24 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(.))