try 或 tryCatch 与引导 R
Posted
技术标签:
【中文标题】try 或 tryCatch 与引导 R【英文标题】:try or tryCatch with boot R 【发布时间】:2013-06-06 16:20:51 【问题描述】:我正在使用boot
引导优化函数以估计标准误差。不幸的是,在极少数情况下,优化函数会返回一个错误,从而停止 boot
函数。该错误对估计并不重要,我想跳过该迭代并继续下一个。
我尝试使用try
和tryCatch
找到解决方案,但都无法正确使用。在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) )
【问题讨论】:
当try
或tryCatch
出错时,您希望函数的返回值是多少?
@Thomas 我以前让它返回一条错误消息。让它返回 NA 是否合适?据我了解,启动需要一些东西来代替错误。
您能否包含一些重现您的错误的示例数据?
错误来自引导,简单运行constrOptim
时没有错误。由于C1
是一个协方差矩阵,如果复制的数据就是这样,它可能包含 NA。然后将其传递给constrOptim
,当我使用 C1 中的值作为初始参数时,它会返回错误。另外,我尝试让tryCatch
从constrOptim
返回 NA,但引导不接受这个。
根据您更新的问题,目前尚不清楚您更喜欢什么解决方案。您对 tryCatch 的使用是正确的,但如果您不喜欢返回值,您可以简单地指定其他内容,而不是 NA
s 的向量。
【参考方案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的主要内容,如果未能解决你的问题,请参考以下文章