尝试或尝试使用引导RC

时间:2013-06-10 22:02:41

标签: r try-catch

我正在使用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替换bootstrap复制。

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)} )
}

1 个答案:

答案 0 :(得分: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://stackoverflow.com/a/3336726/2338862)。