はじめに
Bootstrap法による回帰分析を使うかもしれないので、すこし調べてまとめました。 参考にしたのは、共立出版の「Rで学ぶデータサイエンス ブートストラップ入門」です。
相変わらずメモレベルです。
Bootstrap法
はじめにBootstrap法についてです。
母集団から標本集団が得られた時に、標本の平均値や分散等の統計量を算出し母集団の統計量を推定します。
この時の推定は点推定であり、実際には不確実性があります。また、その分布は未知の場合も多くあります。
この不確実性の程度をコンピュータ・シミュレーションによって見積もることができます。
その手法がブートストラップ法です。
具体的には、得られているデータからデータ数のサンプルサイズで重複を許すリサンプリングを行います。 そして、この得られた個のデータを用いて統計量(ex.期待値)を算出します。
この作業を回繰り返すことで、統計量の分布を得ることができます。
ブートストラップ法は誤差推定,信頼区間の構成,仮説検定などに用いられます。 ここら辺のことについては、以下のブログを参考に...
あと、英語版のWikiのBootstrapping (statistics)を見ると楽しいです。
Bootstrap法による回帰分析
Bootstrap法よる回帰分析は、得られているデータをリサンプリングし、得られたブートストラップ標本を用いて、回帰係数の期待値の分布推定を行ったり、その有意差の検定を行ったりします。(めちゃくちゃ雑)
残差からのリサンプリングに基づく回帰分析
通常に回帰分析では、回帰分析では誤差項に正規分布を仮定しています。 しかし、この仮定が満たされないことも多く、誤差項の分布をブートストラップ法により推定します。 誤差は互いに独立だが、ごとに異なる分布に従う場合もあります。
このような場合に適用するために、残差を修正します。 修正済み残差は、平均値が0、分散がによらずとなります。
このを用いた場合のアルゴリズムは次にようになります。
モデルを考えます。ここで、とは最小二乗推定量です。 また、とします。
- 中心化した修正済み残差から構成する経験分布関数をとし、からの無作為復元抽出により、ブートストラップ残差 を得る
- 1に基づき、ブートストラップ標本を計算する
- 各をで置き換え、ブートストラップ推定値、およびを計算する
このアルゴリズムにより得られるのブートストラップ最小二乗推定値は、次のように表現することができます。
ここで、です。
データからのサンプリングに基づく回帰分析
次のような一般的な回帰モデルを考えます。
このモデルを考える時、の関係に興味があります。
そのためリサンプリングは、各のデータセットに対して行います。(非常にわかりやすいものですね)
アルゴリズムは次のようになります。
- n個の標本数に確率ずつを付与した経験分布を構成する
- 経験分布から、互いに独立なブートストラップ標本を無作為復元抽出する
- 各を に置き換え、ブートストラップ推定値を計算する
このアルゴリズムでは、誤差項の分散の均一性を仮定していません。
そのため、残差からのリサンプリングに基づく回帰分析に比べ、誤差分散の不均一性に対してロバストであるとされています。
誤差分散の均一性が仮定できそうな場合は、残差からのリサンプリングに基づく回帰分析の方が良いとしています。
Rでデータからのサンプリングに基づく回帰分析
data(gala, package = 'faraway') gala_new <- gala %>% mutate(Area_log = log(Area)) gala %>% ggplot(aes(x=log(Area), y=Species))+ geom_point()
グラフを見る限りポアソン回帰が良さそうなので、ポアソン回帰分析を行ってみます。
m1 <- glm(Species ~ .-Area, family = poisson(link = "log"), data = gala_new)
推定されたモデルは次のようになりました。
> summary(m1) Call: glm(formula = Species ~ . - Area, family = poisson(link = "log"), data = gala_new) Deviance Residuals: Min 1Q Median 3Q Max -4.1377 -2.9277 -0.9179 2.0468 5.2848 Coefficients: Estimate Std. Error z value Pr(>|z|) (Intercept) 2.706e-01 2.932e-01 0.923 0.3560 Endemics 2.386e-02 1.870e-03 12.756 < 2e-16 *** Elevation -6.445e-04 9.520e-05 -6.770 1.29e-11 *** Nearest 2.629e-03 1.806e-03 1.455 0.1456 Scruz -7.677e-04 5.888e-04 -1.304 0.1923 Adjacent 7.057e-05 3.395e-05 2.078 0.0377 * Area_log 4.684e-01 5.056e-02 9.263 < 2e-16 *** --- Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1 (Dispersion parameter for poisson family taken to be 1) Null deviance: 3510.73 on 29 degrees of freedom Residual deviance: 237.82 on 23 degrees of freedom AIC: 412.65 Number of Fisher Scoring iterations: 5
それでは、データリサンプリングによるブートストラップ法で回帰係数の分布を推定してみます。
これはcarパッケージを用いると行えます。
2000回リサンプリングして回帰モデルを作成します。
library(car) beta.boot <- Boot(m1, R = 2000, method = "case")
ここで、Boot関数の引数mathodはcaseだとデータリサンプリングによる回帰、residualsだと残差のリンサンプリングによる回帰になります。
なお、一般化線形モデルの場合、残差のリンサンプリングによる回帰は行えません。
簡単に結果を確認してみます。
> summary(beta.boot) Number of bootstrap replications R = 2000 original bootBias bootSE bootMed (Intercept) 3.0809e+00 -1.1699e-02 0.22186631 3.0775e+00 Endemics 2.3858e-02 1.5258e-03 0.01065209 2.4385e-02 Elevation -6.4452e-04 -1.4189e-04 0.00075617 -7.0778e-04 Nearest 2.6289e-03 -2.1081e-03 0.01007110 1.7596e-03 Scruz -7.6765e-04 3.4389e-05 0.00254443 -8.7876e-04 Adjacent 7.0573e-05 1.9119e-05 0.00054507 7.8835e-05 Area_log 2.0341e-01 9.7690e-03 0.07444646 2.1234e-01
BCa法により算出された信頼区間をみてみます。
> confint(beta.boot, level=.95, type="bca") Bootstrap bca confidence intervals 2.5 % 97.5 % (Intercept) 2.661620203 3.5194048298 Endemics 0.006895978 0.0455421294 Elevation -0.001939937 0.0011104991 Nearest -0.016192585 0.0301755743 Scruz -0.005363863 0.0048733422 Adjacent -0.001132596 0.0007036367 Area_log 0.041524018 0.3335293312
推定された回帰係数の分布を確認してみます。
ggboot_histogram <- function(BD, X, bw = 1/50){ tmp <- BD$t %>% as.data.frame() wide <- max(tmp %>% pull(X))-min(tmp %>% pull(X)) 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=BD$t0[X], linetype="dashed", colour = "red", size=.2) + ggtitle(paste0(X, " coeff by ", BN, " Bootstrap regression \n", "Mean:", round(BD$t0[X],4), " 2.5%:", round(confint(beta.boot)[X,1],4), " - 97.5%:",round(confint(beta.boot)[X,2],4))) } ggboot_histogram(BD=beta.boot, "Area_log")
他の変数における回帰係数の分布も見てみます。
ElevationとNearestは、正規分布に従ってはなさそうです。
ブートストラップ法を用いることで、適切な分布が得られていると言えそうです。
Rで相関モデルの回帰係数の有意差検定
ブートストラップ信頼区間を用いた検定
上記で生成したBCa法により算出された信頼区間を用いて、その区間に0が含まれている場合には、統計的に有意であるといえます。 実際に上記で生成したブートストラップ標本から片側5%信頼区間を見てみます。
> confint(beta.boot, level=.9, type="bca") Bootstrap bca confidence intervals 5 % 95 % (Intercept) 2.7500094380 3.4458113539 Endemics 0.0108198378 0.0410965876 Elevation -0.0017787189 0.0005420093 Nearest -0.0128395052 0.0187406325 Scruz -0.0042417713 0.0042695221 Adjacent -0.0007962402 0.0006028746 Area_log 0.0731049579 0.3059796320
EndemicsとArea_logは信頼区間に0を含んでいるため、の帰無仮説は棄却できそうです。 直感的でわかりやすいですね。
書籍では、残差に基づく検定や相関に基づく検定などが紹介されていました。 しかし、個人的にはデータを適用先があまりないと感じ割愛...