我使用包装函数通过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 :(得分:10)
我有一个我运行的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值。你可能想要做一些不同的事情。
答案 1 :(得分:5)
您也可以在plyr中使用failwith功能。如果f是你传递给plyr的函数,你可以改为传递函数
safef = failwith(NA, f)
当然,您可以使用函数失败时所需的任何返回值替换NA。此代码直接从failwith的示例中解除。