try 或 tryCatch 与引导 R

Posted

技术标签:

【中文标题】try 或 tryCatch 与引导 R【英文标题】:try or tryCatch with boot R 【发布时间】:2013-06-06 16:20:51 【问题描述】:

我正在使用boot 引导优化函数以估计标准误差。不幸的是,在极少数情况下,优化函数会返回一个错误,从而停止 boot 函数。该错误对估计并不重要,我想跳过该迭代并继续下一个。

我尝试使用trytryCatch 找到解决方案,但都无法正确使用。在statistic中包装优化功能时,我设法跳过了错误。但是,这会导致 boot 内的估计次数少于初始迭代次数并返回错误。

下面是我的代码的基本示例

任何帮助表示赞赏, 谢谢

bootfun = function(bootdata, i, d, C1) 
    C1 = cov (bootdata[i])
    ans =  constrOptim(...) #This function returns an error
    return(ans$par [d])

bootres = boot(bootdata, statistic = bootfun, 500)

编辑:我设法找到了一个可接受的解决方案来解决我的问题。但是,如果一个函数经常出错,这可能是不可接受的,因为每个错误都会用 NA 替换引导复制。

bootfun = function(bootdata, i, d, C1) 
C1 = cov(bootresid[i])
tryCatch(
ans =  constrOptim(...)
return(ans$par[1:18] [d])  , 
error=function(err) rep(NA,18) )

【问题讨论】:

trytryCatch 出错时,您希望函数的返回值是多少? @Thomas 我以前让它返回一条错误消息。让它返回 NA 是否合适?据我了解,启动需要一些东西来代替错误。 您能否包含一些重现您的错误的示例数据? 错误来自引导,简单运行constrOptim时没有错误。由于C1 是一个协方差矩阵,如果复制的数据就是这样,它可能包含 NA。然后将其传递给constrOptim,当我使用 C1 中的值作为初始参数时,它会返回错误。另外,我尝试让tryCatchconstrOptim 返回 NA,但引导不接受这个。 根据您更新的问题,目前尚不清楚您更喜欢什么解决方案。您对 tryCatch 的使用是正确的,但如果您不喜欢返回值,您可以简单地指定其他内容,而不是 NAs 的向量。 【参考方案1】:

这不是针对您的特定代码的答案,而是针对您描述的情况的tryCatch 的更一般的演示。如果您只想删除导致错误的条目,请让函数在错误时不返回任何内容,然后从结果中删除 NULL 值:

testfun <- function(i) 
tryCatch(
d <- rbinom(1,1,.3) # generate an error 30% of the time
if(d==1)
    error("test stop")
else
    return(1:10) # return your actual values
, 
error = function(err) return() # return NULL on error
    )


x <- sapply(1:20, FUN=testfun) # run demo 20 times
x <- x[-(which(sapply(x,is.null),arr.ind=TRUE))]
# when errors happen, x is shorter than 20

最后一行从列表中删除 NULL 条目(基于此:https://***.com/a/3336726/2338862)。

【讨论】:

以上是关于try 或 tryCatch 与引导 R的主要内容,如果未能解决你的问题,请参考以下文章

为啥不建议用 try catch

Java编程trycatch的语法使用格式

带有 try catch 的 PDO 事务语法

为啥不建议用 try catch

为啥 iOS 开发中很少用到 try catch 语句

用Go语言异常机制模拟TryCatch异常捕捉