はじめに
最近、こちらの書籍を読みました。
わかりやすい理論の説明に合わせて、実際のデータ分析行う際の視点に立った解説が端々にあり、非常に良い本でした。
その中で、第8章のブートストラップの紹介の中で、Wild Bootstrapが扱われていました。
少し気になったので、簡単にまとめます。
残差Bootstrap
はじめに対比のために残差Bootstrap法について記しておく。
以下の線形回帰モデルを考える。
残差Bootstrapでは、説明変数を固定して誤差項をランダムサンプルする。
手順は以下の通り。
モデルを考えます。ここで、は最小二乗推定量です。
- 残差から経験分布関数を形成し、からの無作為復元抽出により、ブートストラップ残差 を得る
- 1に基づき、ブートストラップ標本を計算する
- 各ペアをで置き換え、ブートストラップ推定値、およびを計算する
しかし、このBootstrap法は分散が不均一の場合にブートストラップ推定値の推定精度が低下することが知られている。
Wild Bootstrap
Wild Bootstrapはランダムサンプリングではなく選択分布(pick distribution)を利用することで、不均一分散の場合でも精度よく推定することができる。
Wild Bootstrapでは次のようなモデルを検討する。
ここでは残差の変換関数、はある確率分布に従う変数である。
変換関数はいくつか提案されている。
ここではハットマトリックス のの対角要素である。
は、以下の性質を満たす確率分布であることが求められる。
MammenはLiuの条件を満たすような条件分布として以下のMammenの二項分布を提案している。
二つの値しか取らないという状態であるが、今までのBootstrap法よりも精度良いサンプルリングが行えることがわかっている。
またDavidson and Flachaire (2008) は Rademacher分布を用いる方法を提案している。
この他にもWild Bootstrap用の分布が提案されているようです。
そして、なぜこのように二項分布で良いのか気になったので、Mammenの論文に軽く目を通したのですが、よくわらず...
もう少しちゃんと読んでみます。
Rで実行
RでWild Bootstrap法を実行するにはlmboot packageで行うことができます。
用いたデータは以下のモデルに従い生成されるデータとしました。
誤差項の分散が不均一にならないような設定となっています。
基本的なWild Bootstrap法を実行するにはwild.boot関数を用いる。
wild_boot_model <-wild.boot(y ~ ., B = 1000, data = sample_df %>% select(-eps))
結果を確認する。
> quantile(wild_boot_model$bootEstParam[, "x1"], probs=c(.025, .975)) 2.5% 97.5% -0.08068078 0.11693998 > quantile(wild_boot_model$bootEstParam[, "x2"], probs=c(.025, .975)) 2.5% 97.5% -0.1127211 0.2875900 > quantile(wild_boot_model$bootEstParam[, "x3"], probs=c(.025, .975)) 2.5% 97.5% 0.4301977 0.6467196
得られたBootstrap標本のヒストグラムを可視化してみます。
ggboot_histogram <- function(BD, X, bw = 1/50){ tmp <- BD %>% as.data.frame() wide <- max(tmp %>% pull(X))-min(tmp %>% pull(X)) BN <- nrow(BD) coef <- quantile(tmp[,X], probs=c(.025, .975)) ggplot(tmp,aes_(x = as.name(X)))+ geom_histogram(binwidth = wide*bw)+ geom_density(eval(bquote(aes(y = ..count..*.(wide*bw)))), fill = 1, alpha = 0.3)+ geom_vline(xintercept=mean(tmp[,X]), linetype="dashed", colour = "red", size=.2) + ggtitle(paste0(X, " coeff by ", BN, " Bootstrap regression \n", "Mean:", round(mean(tmp[,X]),4), " 2.5%:", round(coef[1],4), " - 97.5%:",round(coef[2],4)))+ ylab("") } ggboot_histogram(BD=wild_boot_model$bootEstParam, "x3")
シミュレーション
どの程度の通常の回帰等より精度改善があるのかをシミュレーションにより確認したい。
比較を行うのは通常の回帰分析の結果とBootstrap法を適用して得られたブートストラップ標本の結果。
不均一分散がない状態だと通常の回帰分析でもの棄却割合は、設定した有意確率に一致する。
今回は、上記のモデルの設定でどこまで推定にバイアスが乗るのかと、Wild Bootstrap法のバイアスがどの程度取り除かれるかを確認する。
Bootstrap標本の数を2000、一度に得られるサンプルサイズを50、シミュレーション数を1000、有意水準を5%とした。
結果は以下の表の通り。
通常の回帰分析だと有意水準5%を満たしておらず、明らかに過剰に帰無仮説を棄却してしまっている状態である。
Wild Bootstrapは見事なまで5%水準を満たし、バイアスのない推定が可能になっているのが確認できた。