Upload
daisuke-yoneoka
View
4.788
Download
0
Embed Size (px)
Citation preview
計算統計学〜 Bootstrap 法とその周辺〜
@ kingqwert
複雑な問題• 統計量の正確な標本分布の導出は困難
• 漸近理論の発展o 最尤法
• 一致性、漸近正規性• 漸近分散: Fisher 情報量の逆数
• 統計量の関数の分布に関してはデルタ法
• 以下の様な統計量においては結構難しいo トリム平均、 Median → 分位点に関する理論の発展が必要
Bootstrap 法 ( ブーツの紐法 )
• 1979 年 スタンフォード大の Bradley Efron により開発
• 「ほら吹き男爵」の「ブーツの紐を引っ張って湖の底から脱出する」という話
• 教科書
Bootstrap 法概説• リサンプリングすることで母集団の分布を経験分布で代
用。ノンパラメトリックなモンテカルロ法の一種
• リサンプリング法では観測された標本を有限母集団として扱う
• 標本=擬似母集団からの無作為標本
経験分布Empirical distribution• データそのものから導かれる分布のこと
o イメージ的には、ヒストグラムo N 個の標本 (y1,y2,,,,,yn) の各点に関して 1/n の確率を割り当てる離散型確率分
布
• 未知の母集団分布 F(y)o 経験分布関数 は F(y) に分布収束する。
差込原理• Plug-in estimator
• を利用してパラメーターを推定する方法o Bootstrap 法はこの原理に基づいて計算される。
• Ex. 平均
抽出方法• 復元抽出 sampling with replacement
o 同じ要素の抽出を許すo R コード: sample() 関数
• Ex. sample(data, 100, replace =True)
• 非復元抽出 sampling without replacemento 同じ要素の抽出を許さないo R コード: sample() 関数
• Ex. sample(data, 100, replace =False)
ごちゃごちゃしたこたぁいいんだよ!
men.h <- c(26.6,37.2,37.9,36.6,35.6,37.1,40.1,37.4,37.8,36.6)mean.boot <- numeric(2000)
set.seed(314)
for (b in 1:2000){ i <- sample(1:10, replace=TRUE) # 1から 10までの整数を 10回無作為に抽出 men.boot <- men.h[i] # b回目のブートストラップ標本 mean.boot[b] <- mean(men.boot) # b回目のブートストラップ標本平均}hist(mean.boot, freq=F, xlab="bootstrap mean", main="") # 平均のヒストグラム
# 両側 95%信頼区間sort(mean.boot)[c(0.025*2000,0.975*2000)]
Cramér-Rao の下限と効率
• Fisher 情報量 (I(θ)) の復習o f(Y;θ) は尤度関数o 意味: 1 回微分の分散か 2 回微分の期待値
• いくつかの正則条件のもとでo クラメール・ラオの下限 ( ただし、 )
• の分散がクラメール・ラオの下限を達成するときに、 を有効推定量 (Efficient estimator)o 最尤推定量が有効推定量であることは稀。通常は漸近的に達成(漸近有効)
ブートストラップ誤差• 統計的誤差
o 差込原理より として近似したことからくる誤差o どうしようもないから諦めよう!(提案)o でも、 n は大きくしようね!
• モンテカルロ誤差o シミュレーションに基づく誤差o 何回反復させるかに依存しているので、十分回数やろう!o で、結局何回くらいが適当なの?
• n が大きい場合、反復回数を増やす• 中央値のような標本の滑らかなでない関数の場合反復回数を増やす
o Efron and Tibshirani(1993) によると、分散や標準誤差のブートストラップ推定の場合は 25-300 回程度十分らしい!
Jackknife 法• もう一つのリサンプリング法
o 重複を許さないリサンプリング法o 狭義にはこんなかんじで 1 つだけサンプルを抜いてリサンプリング
o イメージ的には Cross validation によく似ている。
• どうでもいいけど、語源は「キャンプ場ですげー便利」
• 利点o Bootstrap よりちょっと早い
• 欠点o 統計量が平滑でない値の場合、失敗する場合がある。( ex. Median )o 平滑性=データの変化がどれくらい統計量を変化させるか
Jackknife の失敗x<-sample(1:100, size=10) #標準誤差のジャックナイフ推定量M<-numeric(10)for (i in 1:10){ y<-x[-i]
M[i]<-median(y)} Mbar<-mean(y)print(sqrt((10-1)/10*sum((M-Mbar)^2)))[1] 38.54363 #標準誤差のブートストラップ推定量Mb<-replicate(1000, expr={
y<-sample(x, size=10, replace=T)median(y)}
)print(sd(Mb))[1] 11.94611
Jackknife の median の標準誤差とBootstrap の median の標準誤差が大きく違う
何かおかしい!
Jackknife が推定誤差を起こす!
Bootstrap信頼区間
• 標準正規 Bootstrap CI
• 基本 Bootstrap CI
• Percentile Bootstrap CI
• Bootstrap T CI
• BCa 法 (Bias corrected and accelerated method)
o 性能や特性など詳しくは、 A.C. Davison et al(1997)
標準正規 / 基本 B-CI• 標準正規 CI
o まぁ想像通りです。o 仮定が強い
• の分布が正規分布 or• が標本平均 and サンプルサイズが大きい(中心極限定理)
• 基本 CIo Bootstrap 近似に基づく。
• と近似(この分位点を計算)→誤差が大きいかもo ただし、 の経験累積分布から標本の α 分位点
Bootstrap T CI• 基本 Bootstrap CI の場合、 としているの
で、分布のずれがある場合うまく行かない!o 一次の正確度しかないから
• 一次の正確度:• C は被覆誤差• C→0 (n→∞) がであってほしい
• それじゃ、二次のモーメント(分散)まで考えてみればいいじゃない!” t 型”統計量の標本分布をリサンプリングで作成
• 信頼区間
o は、 の α/2番目に小さい値
上側信頼限界
Bootstrap T CI• 信頼区間
o は、 の α/2番目に小さい値
• 長所o 二次の正確性を持つ:
• 短所o σ の推定が不可欠→ブートストラップ標本ごとに σ を計算しなけれならないので、
計算負荷が大きい(つまり、ブートストラップのなかにブートストラップの入れ子構造)
Percentile CI
• みんな考えつく方法
• の分布で近似して、 α/2番目に大きい値と(1-α)/2番目に大きい値を信頼区間とする
• 信頼区間
• 欠点:一次の正確度しか持ってないけどね!
Percentile 法の正確度
• Percentile CI の方が標準正規 CI より良い被覆率
• 変換後に左右対称となる の単調増加関数 が存在するか否かに正確度が依存する。o 多くの場合、そんな なんて存在しないよ!
• Efron and Tibshirani;1993• 汪、桜井 ;2011
• ちょっと改善しましょ!→ BCa 法
Bca 法• Percentile 法を改善したもの
• 分位点における、偏りに対する補正 & 歪度(加速度)に対する補正
• 変換後に以下を満たす単調増加関数 の存在を仮定o b: 偏り修正定数o a: 歪度(加速度)補正定数
• これで、分位点を補正!
BCa 法• 偏り補正定数= の Median の偏りを補正
• 歪度 (加速度 ) の補正定数
o ちなみに、加速度=目標母数 に関して、 の標準誤差の変化率を推定する意味
• 二次の正確度を持つ!=被覆誤差が で0に。
で、 CI求めるのってどれがいいの & 何回反復すりゃいいの?
• うーん。 Bootstrap-T か BCa かな ? Byung-Jin Ahn et al; 2009
• CI の計算には分散の計算時よりも大きい反復回数が必要o 90-95% CI の場合は反復回数 1000-2000 回は必要だよ!
• Efron and Tibshirani;1993
回帰分析に応用• こんなかんじのコンプライアンスとコレステロール値の散布図と 3次の回帰直線
# データセットづくりlibrary(bootstrap) # z の値を大きさの順でデータを並べ替えるzz <- sort(cholost$z)yy <- cholost$y[order(cholost$z)] # 拡大データフレームを作るmydata <- data.frame(z1=zz, z2=zz^2, z3=zz^3, yy)# データの散布図plot(mydata$z1, mydata$yy, xlab="compliance", ylab="decrease in cholesterol level") # 最小2乗法による3次関数のあてはめcubic <- lm(yy~., data=mydata)# 推定された回帰曲線を描くlines(zz, predict(cubic), lty=2)
# データの散布図plot(mydata$z1, mydata$yy, xlab=“compliance”, ylab=“decrease in cholesterol level”)set.seed(314159) # 乱数の種を固定するB <- 100 # ブートストラップ反復回数n <- length(cholost$z) # 標本の大きさr60 <- numeric(B) # ブートストラップ回帰平均値r100 <- numeric(B) # ブートストラップ回帰平均値for (b in 1:100){ # ブートストラップ反復開始 bt <- sample(1:n, replace=TRUE) # ブートストラップ標本番号 mydata <- cholost[bt,] # ブートストラップ標本 zz <- sort(mydata$z) # zの値の並べ替え yy <- mydata$y[order(mydata$z)] # zの大きさの順に yを並べ替える mydata <- data.frame(z1=zz, z2=zz^2, z3=zz^3, yy) # データフレームを作る cubic <- lm(yy~., data=mydata) # 最小 2乗法による 3次関数のあてはめ lines(zz, predict(cubic)) # 求めた最小 2乗曲線を描く # z=60, 100 のときのブートストラップ回帰予測値 dumy <- predict(cubic, data.frame(z1=c(60, 100), z2=c(60, 100)^2, z3=c(60, 100)^3)) r60[b] <- dumy[1] r100[b] <- dumy[2]}