ベイズファクターとは
ベイズファクター(Bayes Factor: \(BF\))とは、2つの競合する仮説(通常は帰無仮説 \(H_0\) と対立仮説 \(H_1\))に対して、得られたデータがどちらの仮説をどの程度支持しているかを定量的に評価するための指標です。
一般的に、対立仮説 \(H_1\) の帰無仮説 \(H_0\) に対する周辺尤度比として以下のように定義されます。
\[BF_{10} = \dfrac{P(D | H_1)}{P(D | H_0)}\]
ここで、\(D\) は観測されたデータです。
- \(BF_{10} > 1\)
- データは対立仮説 \(H_1\)(効果や差がある)を支持している。
- \(BF_{10} < 1\)
- データは帰無仮説 \(H_0\)(効果や差がない)を支持している。
- 帰無仮説への支持の強さを表すために、逆数である \(BF_{01} = 1 / BF_{10}\) を用いることもあります。
p値(頻度主義)との主な違い
- 帰無仮説を「支持」できるか
- p値
- 帰無仮説 \(H_0\) が正しいと仮定したとき、得られたデータ(またはそれ以上に極端なデータ)が観測される確率です。p値が有意水準(例: 0.05)を上回った場合、言えるのは「帰無仮説を棄却できない(差があるとは言えない)」ということだけであり、「差がない(\(H_0\) が正しい)」と積極的に主張することはできません。
- ベイズファクター
- \(BF_{10}\) が十分に小さく(\(BF_{01}\) が大きく)なれば、「効果がないという帰無仮説 \(H_0\) を積極的に支持する」という結論を出すことができます。
- p値
- サンプルサイズへの依存度
- p値
- サンプルサイズ \(N\) が極めて大きくなると、極めて小さな(実質的には意味のない)効果量であっても、p値は容易に0.05を下回り「有意」になります。
- ベイズファクター
- サンプルサイズが大きくなっても、効果量がゼロであれば帰無仮説を支持する方向(\(BF_{10} \to 0\))へ収束し、過剰な検出力を補正する性質を持ちます。
- p値
シミュレーションコード
Rの BayesFactor パッケージを利用して、サンプルサイズを変化させたときに「p値」と「ベイズファクター(\(BF_{10}\))」がどのように振る舞うかを比較します。
ここでは、「平均値が0であるか(\(H_0: \mu = 0\) vs \(H_1: \mu \neq 0\))」を検証する1標本t検定のシミュレーションを行います。
Rコード
# 必要パッケージの読み込み
library(BayesFactor)
# 再現性のための乱数シードの設定
seed <- 20260819
set.seed(seed)
# サンプルサイズの範囲(10から1000まで10刻み)
n_sizes <- seq(10, 1000, by = 10)
# 結果を格納するベクトルの準備
p_h0 <- numeric(length(n_sizes))
bf_h0 <- numeric(length(n_sizes))
p_h1 <- numeric(length(n_sizes))
bf_h1 <- numeric(length(n_sizes))
# 対立仮説が正しい場合の「真の効果量(平均値)」
true_effect <- 0.3
for (i in seq_along(n_sizes)) {
n <- n_sizes[i]
# --- パターンA: 帰無仮説 (H0) が正しい場合 (真の平均 = 0) ---
data_h0 <- rnorm(n, mean = 0, sd = 1)
# 従来のt検定 (p値)
p_h0[i] <- t.test(data_h0)$p.value
# ベイズファクター (BF10) の抽出
bf_h0[i] <- extractBF(ttestBF(data_h0), onlybf = TRUE)
# --- パターンB: 対立仮説 (H1) が正しい場合 (真の平均 = 0.3) ---
data_h1 <- rnorm(n, mean = true_effect, sd = 1)
# 従来のt検定 (p値)
p_h1[i] <- t.test(data_h1)$p.value
# ベイズファクター (BF10) の抽出
bf_h1[i] <- extractBF(ttestBF(data_h1), onlybf = TRUE)
}
# グラフの描画設定(2行2列の表示)
par(mfrow = c(2, 2), mar = c(4.5, 4.5, 2.5, 1))
# 1. H0が真のときのp値
plot(n_sizes, p_h0,
type = "b", pch = 19, col = "royalblue",
xlab = "サンプルサイズ (N)", ylab = "p値",
main = "H0が真のとき: p値の推移", ylim = c(0, 1)
)
abline(h = 0.05, col = "red", lty = 2) # 有意水準 5% の線
# 2. H0が真のときのBF10 (y軸は対数スケール)
# BF10 < 1 は帰無仮説を支持することを意味します
plot(n_sizes, bf_h0,
type = "b", pch = 19, col = "forestgreen",
xlab = "サンプルサイズ (N)", ylab = "BF10 (対数軸)", log = "y",
main = "H0が真のとき: BF10の推移"
)
abline(h = 1, col = "red", lty = 2) # BF10 = 1 (証拠なし) の基準線
# 3. H1が真のときのp値
plot(n_sizes, p_h1,
type = "b", pch = 19, col = "royalblue",
xlab = "サンプルサイズ (N)", ylab = "p値",
main = "H1が真のとき: p値の推移", ylim = c(0, 1)
)
abline(h = 0.05, col = "red", lty = 2)
# 4. H1が真のときのBF10 (y軸は対数スケール)
plot(n_sizes, bf_h1,
type = "b", pch = 19, col = "forestgreen",
xlab = "サンプルサイズ (N)", ylab = "BF10 (対数軸)", log = "y",
main = "H1が真のとき: BF10の推移"
)
abline(h = 1, col = "red", lty = 2)
# 描画設定の初期化
par(mfrow = c(1, 1))帰無仮説(\(H_0\))が真のとき(上の2つのグラフ)
- 左上:p値の推移
- サンプルサイズ \(N\) が 1000 に達しても、p値は特定の値に収束することなく、0から1の間を終始ランダムに変動しています。
- 赤の破線(0.05)を下回っている点がいくつか見られます。これが「実際には差がない(平均値0)のに、たまたま偏ったデータが得られたために有意差ありと判断してしまう」第一種の過誤(偽陽性)です。このリスクはサンプルサイズを大きくしても解消されません。
- 右上:\(BF_{10}\) の推移
- 全体的な傾向として、サンプルサイズ \(N\) が大きくなるにつれて値が減少していき、赤の破線(1.0)を下回る領域(帰無仮説 \(H_0\) を支持する領域)に定着していきます。
- \(N \approx 170\) や \(N \approx 420\) 付近で一時的に \(BF_{10}\) が 1 を超えるスパイク(急上昇)が発生していますが、これは左上のp値がこの付近で非常に小さくなっている(偽陽性になりかけている)ことに対応しています。
- しかしp値とは異なり、サンプルサイズがさらに大きくなると、このスパイクから再び減少傾向(帰無仮説を支持する方向)へと戻っていきます。\(N = 1000\) の時点では \(BF_{10}\) が約0.05(逆数の \(BF_{01}\) に換算すると約20となり、「帰無仮説を支持する強い証拠」)に達しています。
対立仮説(\(H_1\))が真のとき(下の2つのグラフ)
- 左下:p値の推移
- サンプルサイズが \(N \approx 150\) を超えたあたりから、p値はほぼ 0 に張り付き、常に「有意」な状態を維持しています。これ以降は、サンプルサイズをどれだけ増やしてもp値の数値自体に変化はほぼ見られません。
- 右下:\(BF_{10}\) の推移
- サンプルサイズが増えるにつれて、\(BF_{10}\) は指数関数的に増大し(y軸は対数スケール(\(1\text{e}-01\) から \(1\text{e}+19\)))、最終的には \(10^{19}\)(1000京倍以上)という、データ量に応じた圧倒的な強さで対立仮説(効果がある)を支持する証拠を示しています。
以上です。

