Mímisbrunnr知恵の泉

← ベイズ統計 一覧

🎓 レベル:発展 | 重要度:B(標準)

📎 前提:交差検証とLOO | 数理:事前・尤度・事後・周辺尤度

要点(BLUF)

1. ベイズファクター:周辺尤度の比

2つのモデル M0,M1M_0,M_1 をデータで比べます。各モデルの周辺尤度 p(DM)=p(Dθ,M)p(θM)dθp(D\mid M)=\int p(D\mid\theta,M)p(\theta\mid M)\,d\theta事前・尤度・事後・周辺尤度)の比がベイズファクターです。

BF10=p(DM1)p(DM0),p(M1D)p(M0D)事後オッズ=BF10×p(M1)p(M0)事前オッズ\mathrm{BF}_{10}=\frac{p(D\mid M_1)}{p(D\mid M_0)},\qquad \underbrace{\frac{p(M_1\mid D)}{p(M_0\mid D)}}_{\text{事後オッズ}}=\mathrm{BF}_{10}\times\underbrace{\frac{p(M_1)}{p(M_0)}}_{\text{事前オッズ}}

事前オッズを 11 にすれば、BF10\mathrm{BF}_{10} がそのまま事後オッズ。解釈の目安(Kass–Raftery)は、1133:言うほどでない、332020:肯定的、2020150150:強い、>150>150:非常に強い、です。

2. コード:公平なコインかを検定する

「コインは公平 M0:θ=0.5M_0:\theta=0.5」対「偏りうる M1:θBeta(1,1)M_1:\theta\sim\mathrm{Beta}(1,1)」を、ベイズファクターで比べます。M1M_1 の周辺尤度はベータ二項(ベータ二項モデル)です。

import numpy as np
from scipy.special import betaln

def log_marg_M0(n, k): return k*np.log(0.5) + (n-k)*np.log(0.5)          # θ=0.5 固定
def log_marg_M1(n, k, a=1, b=1): return betaln(a+k, b+n-k) - betaln(a, b) # θ自由(一様事前)

print("BF10 = p(D|M1)/p(D|M0)(M1:θ自由, M0:公平)")
for (n, k) in [(100, 52), (100, 60), (100, 70)]:
    BF = np.exp(log_marg_M1(n, k) - log_marg_M0(n, k))
    print(f"  n={n}, k={k} (率{k/n:.2f}): BF10={BF:.3g}  ({'M1支持' if BF>1 else 'M0支持'})")

出力:

BF10 = p(D|M1)/p(D|M0)(M1:θ自由, M0:公平)
  n=100, k=52 (率0.52): BF10=0.135  (M0支持)
  n=100, k=60 (率0.60): BF10=0.913  (M0支持)
  n=100, k=70 (率0.70): BF10=427  (M1支持)

出力の意味k=52k=52(ほぼ公平)では BF10=0.14\mathrm{BF}_{10}=0.14=公平モデル M0M_0 を約 77 倍支持。k=70k=70(明らかに偏り)では BF10=427\mathrm{BF}_{10}=427=偏りモデル M1M_1 を非常に強く支持。k=60k=60BF0.9\mathrm{BF}\approx0.9 でほぼ互角(どちらとも言えない)。注目は、M1M_1 が「θ\theta 自由」と柔軟なのに、率が 0.50.5 近くだとかえって M0M_0 が勝つこと——次の剃刀の効果です。

3. オッカムの剃刀とリンドリーの逆説

周辺尤度は θ\theta を事前で平均するので、広い事前を持つモデルは「どこにでも賭けた」ぶん、当たったときの密度が薄まり、自動的に罰されます(ベイズ的オッカムの剃刀)。k=52k=52M0M_0 が勝つのはこのため——柔軟な M1M_1 は無駄な自由度のぶん損をします。

ところがこの剃刀は事前の幅に過敏です。同じデータでも、M1M_1 の事前を広げるほど M1M_1 が罰され、ベイズファクターがひっくり返る。正規平均の検定 M0:μ=0M_0:\mu=0M1:μN(0,τ2)M_1:\mu\sim\mathcal N(0,\tau^2) で見ます。

import numpy as np
from scipy import stats

# データは μ≠0 を弱く支持(ȳ=2.5×標準誤差・頻度論なら「有意」級)
se, ybar = 1.0, 2.5
print("リンドリーの逆説:同じデータで事前SD τ を変える")
for tau in [1, 3, 10, 100, 1000]:
    BF = np.exp(stats.norm(0, np.sqrt(se**2 + tau**2)).logpdf(ybar)
                - stats.norm(0, se).logpdf(ybar))
    print(f"  事前SD τ={tau:>4}: BF10={BF:.3g}  ({'M1支持' if BF>1 else 'M0支持'})")

出力:

リンドリーの逆説:同じデータで事前SD τ を変える
  事前SD τ=   1: BF10=3.37  (M1支持)
  事前SD τ=   3: BF10=5.27  (M1支持)
  事前SD τ=  10: BF10=2.2  (M1支持)
  事前SD τ= 100: BF10=0.228  (M0支持)
  事前SD τ=1000: BF10=0.0228  (M0支持)

出力の意味:観測は yˉ=2.5\bar y=2.5 SE(頻度論なら「有意」級)で μ0\mu\neq0 を示すのに、M1M_1 の事前を広げる(τ\tau 大)ほど BF10\mathrm{BF}_{10} が下がり、τ=100\tau=100公平=帰無 M0M_0 支持に逆転します。これがリンドリー(ジェフリーズ–リンドリー)の逆説——「無情報のつもりで事前を極端に広げると、対立仮説が不当に罰され、帰無仮説が勝ってしまう」。ベイズファクターは事前に本質的に依存するので、無情報事前を安易に使えず、意味のある事前を慎重に選ぶ必要があります。

4. ベイズモデル平均化(BMA)

「どれか1つのモデルを選ぶ」こと自体がモデル不確実性を捨てています。BMA は選ばず、各モデルの予測を事後モデル確率で重み付け平均します。

p(y~D)=mp(y~D,Mm)p(MmD),p(MmD)p(DMm)p(Mm)p(\tilde y\mid D)=\sum_m p(\tilde y\mid D,M_m)\,p(M_m\mid D),\qquad p(M_m\mid D)\propto p(D\mid M_m)\,p(M_m)

よく当たるモデルに大きな重み、不確かなら複数に分散。単一モデルより予測が頑健になることが多い反面、周辺尤度の事前依存(§3)を引き継ぐので、重みの計算には注意が要ります。

5. ベイズファクター vs WAIC/LOO の使い分け

ベイズファクターWAIC / LOO
測るもの周辺尤度(事前込みの証拠)予測性能(elpd)
事前依存強い(リンドリー)弱い
無情報事前使えない(変則だと未定義)使える
向く場面意味ある事前での仮説比較予測重視のモデル選択

「仮説検定的に2モデルを比べたい・意味ある事前がある」ならベイズファクター、「予測の良いモデルを選びたい」なら WAIC/LOO(情報量規準WAICとDIC交差検証とLOO)、と目的で使い分けます。

⚠️ よくある誤解

まとめ(Phase 8)

第8章では、組んだモデルを評価・比較する道具を揃えました——欠陥を探す事後予測チェック(事後予測チェック)、予測性能で比べる WAIC(情報量規準WAICとDIC)と LOO-CV(交差検証とLOO)、証拠で比べるベイズファクターと BMA(本ノート)。診断は PPC、予測比較は WAIC/LOO、仮説比較はベイズファクター——目的で使い分けます。次章では、ここまで手で実装してきた推論を、確率的プログラミング(PPL)で宣言的に書く方法へ進みます。

関連ノート