我正在使用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替换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)} )
}
答案 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)。