1

boot標準誤差を推定するために、最適化関数をブートストラップするために使用しています。残念ながら、まれに最適化関数がエラーを返し、関数が停止することがありbootます。エラーは見積もりにとって重要ではなく、その反復をスキップして次の反復に進みたいと思います。

tryandを使用して解決策を見つけようとしましたが、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)} )
}
4

1 に答える 1

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

于 2013-06-11T09:20:20.347 に答える