【发布时间】: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 的使用是正确的,但如果您不喜欢返回值,您可以简单地指定其他内容,而不是
NAs 的向量。