如何忽略错误并继续处理列表项?

10

我正在使用一个包装函数,将几百个数据集通过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]))
       }
 }
任何关于更通用的忽略错误的想法,以便我可以使其工作?

我对plyr不是很了解,但是根据介绍指南中提到的failwith()能帮助吗?http://had.co.nz/plyr/plyr-intro-090510.pdf - Chase
可能相关:https://dev59.com/ik7Sa4cB1Zd3GeqP1THq - nico
2个回答

10

我有一个nls()函数需要运行,它遇到了相同的问题。我正在将回归应用于数据框中的每个组,但这个逻辑对您也应该适用(我认为):

 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值。你可能想采取不同的方法。


6

你也可以在plyr中使用failwith函数。如果f是你要传递给plyr的函数,你可以传递该函数。

safef = failwith(NA, f)

当然,你可以将 NA 替换为函数失败时需要返回的任何值。这段代码直接从 failwith 的示例中提取而来。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接