【问题标题】:How do I ignore errors and continue processing list items?如何忽略错误并继续处理列表项?
【发布时间】:2011-05-07 11:14:21
【问题描述】:

我正在使用包装函数通过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]))
       }
 }

对忽略错误的更通用方法有什么想法,以便我可以完成这项工作?

【问题讨论】:

标签: r error-handling


【解决方案1】:

我运行的 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 值。你可能想做一些不同的事情。

【讨论】:

    【解决方案2】:

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

    safef = failwith(NA, f)
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-05-12
      • 2013-11-03
      • 2013-03-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多