2010-11-09 62 views
9

我使用包裝函數通過glm.nb運行數百個數據集。沒有什麼奇特的,我只是通過llply傳遞每個列表項,然後使用glm.nb進行擬合,將係數寫入data.frame並將其返回。如何忽略錯誤並繼續處理列表項目?

毫不奇怪,glm.nb未能收斂某些數據集。而不是讓函數咳出一個錯誤並停止,我寧願它繼續通過其餘的數據集並在可能的情況下返回結果。

我第一次嘗試是這樣的:

res.model <- function(x) 
     { 
     res <- try(invisible(glm.nb(x~y, data=x))) 
    if(!("try-error" %in% class(res))) 
     { 
    return (data.frame(site=unique(x$site_name),species=unique(x$species),coef=res$coefficients[2])) 
     } 
} 

任何想法上更通用的辦法忽略錯誤,所以我可以使這項工作?

+0

我對「plyr」不太瞭解,但是在介紹指南的幫助中列出了'failwith()'嗎? http://had.co.nz/plyr/plyr-intro-090510.pdf – Chase 2010-11-09 19:48:11

+0

可能相關:http://stackoverflow.com/questions/2963729/r-catching-errors-in-nls – nico 2010-11-09 19:58:30

回答

9

我有一個運行nls()有相同的挑戰。我將回歸到每個組中的data.frame,但這種邏輯應該爲你工作,以及(我認爲):

dlply(myData, c("group1", "group2"), function(df){ 
     tryCatch(nls(depen ~ exp(a1 + b1 * year) , data=df, start = list(a1 = -1, b1 = 0), na.action=na.omit), error=function(e) NULL) 

所以如果我猜如何適用於您的情況,它會是這樣的:

res <- trycatch(glm.nb(x~y, data=x), error=function(e) NULL) 

我使用這種方式,我在任何時候迴歸不會收斂NA值。你可能想要做一些不同的事情。

5

你也可以在plyr中使用failwith函數。如果f是要傳遞到plyr的功能,你能傳遞功能

safef = failwith(NA, f) 
當然

,你可以用任何返回值如果該函數失敗,需要更換NA。此代碼直接從failwith的示例中解除。

相關問題