ブートストラップ配布の標準エラーの使用


19

(私の主な質問は言語に依存しないため、必要に応じてRコードを無視します)

単純な統計(例:平均)の変動性を調べたい場合、次のような理論を介してそれを行うことができます。

x = rnorm(50)

# Estimate standard error from theory
summary(lm(x~1))
# same as...
sd(x) / sqrt(length(x))

または次のようなブートストラップで:

library(boot)

# Estimate standard error from bootstrap
(x.bs = boot(x, function(x, inds) mean(x[inds]), 1000))
# which is simply the standard *deviation* of the bootstrap distribution...
sd(x.bs$t)

しかし、私が疑問に思っているのは、特定の状況でブートストラップディストリビューションの標準エラーを調べることは有用/有効ですか?私が扱っている状況は、次のような比較的ノイズの多い非線形関数です。

# Simulate dataset
set.seed(12345)
n   = 100
x   = runif(n, 0, 20)
y   = SSasymp(x, 5, 1, -1) + rnorm(n, sd=2)
dat = data.frame(x, y)

ここでは、モデルは元のデータセットを使用しても収束しません。

> (fit = nls(y ~ SSasymp(x, Asym, R0, lrc), dat))
Error in numericDeriv(form[[3L]], names(ind), env) : 
  Missing value or an infinity produced when evaluating the model

そのため、代わりに私が興味を持っている統計は、これらのnlsパラメーターのより安定した推定値です-おそらく、多くのブートストラップ複製での平均です。

# Obtain mean bootstrap nls parameter estimates
fit.bs = boot(dat, function(dat, inds)
              tryCatch(coef(nls(y ~ SSasymp(x, Asym, R0, lrc), dat[inds, ])),
                       error=function(e) c(NA, NA, NA)), 100)
pars = colMeans(fit.bs$t, na.rm=T)

実際、これらは元のデータをシミュレートするために使用したもののボールパークにあります:

> pars
[1]  5.606190  1.859591 -1.390816

プロットされたバージョンは次のようになります。

# Plot
with(dat, plot(x, y))

newx = seq(min(x), max(x), len=100)
lines(newx, SSasymp(newx, pars[1], pars[2], pars[3]))

lines(newx, SSasymp(newx, 5, 1, -1), col='red')
legend('bottomright', c('Actual', 'Predicted'), bty='n', lty=1, col=2:1)

ここに画像の説明を入力してください

さて、これらの安定化されたパラメーター推定値の変動性が必要な場合、このブートストラップ分布の正規性を仮定して、標準誤差を計算するだけでよいと思います。

> apply(fit.bs$t, 2, function(x) sd(x, na.rm=T) / sqrt(length(na.omit(x))))
[1] 0.08369921 0.17230957 0.08386824

これは賢明なアプローチですか?このような不安定な非線形モデルのパラメータを推測するためのより一般的なアプローチはありますか?(最後の部分を理論に頼る代わりに、ここでリサンプリングの第2層を行うことができると思いますが、モデルによっては時間がかかる場合があります。それでも、これらの標準エラーがブートストラップレプリケーションの数を増やすだけで0に近づくため、あらゆる用途に役立ちます。)

感謝します。そして、ところで、私はエンジニアですので、この辺りで比較的初心者であることを許してください。

回答:


13

この質問にはいくつかの問題があります。第一に、個々のブートストラップされた推定量の一部が計算可能でない場合でも、ブートストラップされた平均が賢明な推定量になるかどうかという問題があります(収束の欠如、解の非存在)。第二に、ブートストラップされた推定量が賢明であることを考えると、これらの推定値の信頼区間またはおそらく単なる標準誤差を取得する方法の問題があります。

ブートストラップされた推定値の平均化の考え方は、機械学習で弱い予測変数の予測パフォーマンスを向上させるために使用されるブートストラップ集約またはバギングと実際には同じではないにしても密接に関連しています。ESLのセクション8.7を参照してください。ある場合にはまた、パラメータを推定するブートストラップ推定値の平均化は、単に元のデータセットに推定器を使用する場合に比べ、得られた推定の分散を低減することができます。

ただし、質問の目的は、推定値を計算するためのアルゴリズムが時々失敗したり、推定器がときどき定義されていない場合でも、推定値を生成することです。一般的なアプローチとして問題があります:

  • ブートストラップされた推定値を平均化すると、推定値を計算できないブートストラップされたサンプルを盲目的に捨てることで、一般にバイアスのかかった結果が得られます。

一般的な問題がどれほど深刻かは、いくつかのことによって決まります。例えば、推定値が計算およびサンプルの条件付き分布は、推定値であることを考えるかどうか頻度はないない推定値が計算可能であることを所与の試料の条件付き分布から計算異なります。この方法を使用することはお勧めしません。

質問の2番目の部分では、少し表記が必要です。元のデータセットを示す場合、推定器(簡単にするために実際の値であり、値NAをとることが許可されていると仮定します)が元のデータの推定セット、およびブートストラップ平均化を効果的に推定計算され、次いで単一ブートストラップサンプルを表す ここでに応じて、イベントを表す、その上に。つまり、ブートストラップされたサンプルの推定量の条件付き期待値を計算しますXθ^θ^(X)Y

θ~(X)=E(θ^(Y)X,A(X))
A(X)Xθ^(Y)NA元のサンプルおよびイベントを条件として、推定器がブートストラップされたサンプルに対して計算可能であること。実際のブートストラップ計算は、サンプリングベースの近似です。XA(X)θ~(X)

問題の提案は、ブートストラップされた推定量の経験的標準偏差を計算することです。これは、条件付きでおよびのの標準偏差の推定値です。望ましい標準偏差、標準誤差は、の標準偏差です。前者から後者を取得することはできません。標準エラーの信頼性の高い推定値を取得するために、ブートストラップの2番目の層を使用する以外の明白で一般的な方法はありません。XAXθXθ^(Y)XA(X)θ~(X)

標準誤差の推定に関する説明は、条件付けが推定器のバイアスにどのように影響するかとは無関係です。影響が深刻な場合、標準誤差の正しい推定値を使用しても、信頼区間は誤解を招く可能性があります。 θX A(X)θ~(X)

編集

Efronによるモデル選択後の推定と精度に関する非常に優れた論文は、ブートストラップの2番目の層を使用せずに、バギングされた推定器の標準誤差を推定する一般的な方法を提供します。この論文は、時々計算できない推定量を明示的に扱っていません。


素晴らしい答えをありがとう。バイアスのポイントは特によく考えられています。点群が完全に均一な極端なケースを想像できます。モデルに非常にうまくフィットする遠い点の単一セットを保存します。nls近似の大部分は失敗する可能性がありますが、収束するものの中で、バイアスは大きくなり、予測される標準誤差/ CIは偽りなく小さくなります。nlsBoot50%の成功を収めるアドホック要件を使用していますが、条件付き分布の(非)類似性も同様に懸念事項であることに同意します。
ジョンコルビー

(このサイトが私をSOのように許可する場合、明日ボーナスを提供しようとします)
ジョンコルビー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.