2010-11-09 101 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的示例中解除。