2014-02-06 137 views
1

我試圖估計R中for-loop中的很多模型。我首先爲變量'Date'定義了一組可能的值,並將它們存儲在'日期'中。然後,對於每個模型,根據這些「日期」值定義一個通用數據集的子集。最終,我的目標是將所有這些模型的一些係數存儲在兩個矩陣中:effRain和effWindchill。如何在R的for-loop中使用tryCatch

問題是:在某些情況下,glmer模型由於錯誤而無法估計。在這些情況下,我希望循環跳過並繼續循環中的下一步。然而,我在R方面並不是非常有經驗。我發現我可能需要使用tryCatch,但我應該如何將它放入我的代碼中?我一直在努力嘗試,但我無法弄清楚。

這是我的代碼到目前爲止:

Dates <- c(19710428,19721129,19740529,19770525,19780531,19810526,19820602,19820908, 
19840614,19860319,19860521,19890615,19890906,19900321,19940302,19940503, 
19940609,19980304,19980506,19990303,19990610,20020206,20020515,20030122, 
20030311,20040610,20060307,20061122,20070307,20090604,20100303,20100609, 
20110302,20120912) 

effRain <- matrix(nrow=34,ncol=2,0) 
effWindchill <- matrix(nrow=34,ncol=2,0) 

for(i in 1:34){ 
hulpdata <- hulpdata <- subset(banaan,Date==Dates[i]) 
attach(hulpdata) 
SP2 <- SP/100 
model1 <- glmer (cbind(opkomst, nnietgestemd) ~ 
     (1|gemnr)+ Windchill + Rain + Windspeed + SP2 + lag_popkomst + NB + OL + loginw 
     , family=binomial(link=logit)) 
effRain[i] <- coef(summary(model1))[3] 
effWindchill[i] <- coef(summary(model1))[2] 
} 

回答

1

我建議不要使用for這裏使用lapply避免for副作用和預分配結構的結果內存。

的代碼應該是這樣的

lapply(Dates,estimat_coef) 

在機型代碼封裝像下面這樣一個函數中。我只是把你的代碼放在(tryCatch,error)。

estimat_coef <- 
    function(x){ 
    res = tryCatch({ 
     hulpdata <- hulpdata <- subset(banaan,Date==x) 
     attach(hulpdata) 
     SP2 <- SP/100 
     model1 <- glmer (cbind(opkomst, nnietgestemd) ~ 
         (1|gemnr)+ Windchill + Rain + Windspeed + SP2 + 
         lag_popkomst + NB + OL + loginw 
         , family=binomial(link=logit)) 
     list(effRain =coef(summary(model1))[3], 
      effWindchill = coef(summary(model1))[2]) 
    },error=function(e)list(effRain=NA,effWindchill=NA)) 
    res 
    }