ブートストラップ手順とモンテカルロ手順の間のこの混乱は繰り返し発生し続けるので、おそらくこれはそれに対処するのに最適な場所です。(R
コードの例は宿題にも役立ちます。)
次のブートストラップのこの実装を検討してください。R
boot <- function(x, t) { # Exact bootstrap of procedure t on data x
n <- length(x) # Must lie between 2 and 7 inclusive.
if (n > 7) {
stop("Sample size exceeds 7; use an approximate method instead.")
}
p <- c(n, 1:(n-1))
a <- rep(x, n^(n-1))
dim(a) <- rep(n, n)
y <- as.vector(a)
while (n > 1) {
n <- n-1
a <- aperm(a, p)
y <- cbind(as.vector(a), y)
}
apply(y, 1, t)
}
ざっと見てみると、これは確定的な計算であることが確認できます。ランダムな値は生成または使用されません。(その内部の仕組みの詳細は、興味のある読者が自分で理解できるように残しておきます。)
への引数boot
は、配列内の数値データのバッチと、単一の数値を返す関数へのx
参照t
(配列とまったく同じように適用できますx
)です。つまり、t
は統計です。可能なすべてのサンプルを生成し、それぞれにx
適用t
して適用することで、そのようなサンプルごとに1つの数値を生成します。つまり、簡単に言えば、ブートストラップです。戻り値は、サンプルのの正確なブートストラップ分布を表す配列です。t
x
小さな例として、サンプルの平均をブートストラップしてみましょうx
= c(1,3)
:
> boot(c(1,3), mean)
> [1] 1 2 2 3
2(1 、3 )(1 、1 )(1 、3 )(3 、1 )(3 、3 )boot
t
t
1223、出力に示されているように、それぞれ。
(1 、3 、3 、4 、7 )
hist(boot(c(1,3,3,4,7), sd))
5
> set.seed(17)
> quantile(boot(runif(5, min=0, max=10), sd), .95)[1]
95%
3.835870
この特定のランダムサンプルの結果は3.83587です。これは明確です。同じデータセットでboot
再度電話をかけたとしても、答えはまったく同じです。しかし、ランダムなサンプルが異なると、答えはどのように変わるでしょうか?このプロセスを数回繰り返し、結果のヒストグラムを描画することで確認します。
> boot.sd <- replicate(100, quantile(boot(runif(5, min=0, max=10), sd), .95)[1])
> hist(boot.sd)
01010/12−−√≈2.887
> length(boot.sd[boot.sd >= 10/sqrt(12)]) / length(boot.sd)
[1] 0.75
しかし、それは私たちが指定した(そして期待していた)名目上の95%にはほど遠いです!これはシミュレーションの1つの価値です。これは、私たちの期待と実際に起こっていることを比較します。(なぜ不一致なのでしょうか?SDのブートストラップは本当に小さなサンプルではうまく機能しないためです。)
レビュー
ブートストラップ統計は、概念的には平均や標準偏差などの他の統計とまったく同じです。計算に時間がかかる傾向があるだけです。(boot
コードの警告メッセージを参照してください!)
モンテカルロシミュレーションは、サンプル取得のランダム性が原因でブートストラップ統計がどのように変化するかを調べるのに役立ちます。このようなシミュレーションで観察された変動は、サンプルの変動によるものであり、ブートストラップの変動によるものではありません。
nnn