2

の使用に関する知識が不十分ですtryCatch()が、進行中の議論で適切な解決策を見つけるのが難しいことがわかりました。

オブジェクトを返す自己プログラム関数があります。これは実際にはリスト オブジェクトですが、簡単にするためにスカラーであると仮定します。for()この関数をブートストラップするためにループを使用しています。私のループは次の形式です。

boot<-1000
for(i in 1:boot){
  bootstrap_data<-data[sample(nrow(data),nrow(data),replace=T),]
  out[i]<-myfunction(bootstrap_data,X,...)
}

myfunction()lm()は、データのサブセットにモデルを当てはめ、別のサブセットから新しいデータを予測するために使用するため、エラー メッセージを返すことがあります。次に、特定の要因について、たまたま適合に使用されたデータに表示されないレベルが発生する可能性がありますが、予測サブセットには表示されます。これはめったに発生しませんが (たとえば、約 15,000 回の反復ごとに)、発生します (何度もブートストラップmyfunction()する必要があります)。

tryCatch()または同様の関数を使用して、ブートストラップ ループをキャッチしたいと考えています。tryCatch()さらに、ループ全体で関数をキャッチする必要があった頻度をカウントするインデックスを定義したいと思います。boot最後に、エラーが発生した回数に関係なく一定数にしたいと思います。

R は次のメッセージを返します。

    Error in model.frame.default(Terms,newdata,na.action=na.action,
xlev=object$xlevels) : factor X has new levels 2

Xのユーザー指定の予測子ですlm()。2 が何を表しているのかわかりませんが、新しいレベル (?) の数だと思います。

4

2 に答える 2

3

これは時々失敗する機能です

f <- function() {
    r <- rnorm(1)
    if (r > 1)
        stop("oops")
    r
}

結果ベクトルを割り当て、カウンタを設定して i 番目の要素を更新します

out <- numeric(100)
i <- 0

次に、関数の呼び出しを繰り返し試みます。エラーが発生した場合、i をインクリメントしたり結果を記録したりせずに、次の反復に直接進みます。

while (i < length(out)) {
    tryCatch({
        out[[i + 1]] <- f()
        i <- i + 1
    }, error=function(...) NULL)
}
于 2013-04-10T17:15:07.817 に答える
2

「try」でエラーをスローすることがある関数をラップすると、通常はうまくいきます。

boot<-1000
for(i in 1:boot){
  bootstrap_data<-data[sample(nrow(data),nrow(data),replace=T),]
  out[i] = NA  #
  try({      
    out[i]<-myfunction(bootstrap_data,X,...)
  }, silent=T)
}

スローされたエラーの数をカウントしたい場合は、NA の in out を合計できます。

sum(is.na(out))
于 2013-04-10T17:03:49.947 に答える