ケィオスの時系列解析メモランダム

時系列解析、生体情報解析などをやわらかく語ります

【R】複数のp値をまとめて一つに:Fisherの結合確率検定 Fisher's Combined Probability Test

交差検証(クロスバリデーション)などで得られえた複数の p 値をまとめて一つにして表したい場合があります。あるいは、「メタアナリシスで複数の研究結果を統合して「効果があるかどうか」を知りたい 」とか、 「複数の測定方法や実験条件の結果をまとめて評価したい」とかでも、全体の傾向を評価したいときに、複数の p 値をどうやって扱うか迷うかもしれません。

 そういったときに役に立つのが「Fisherの結合確率検定(Fisher's Combined Probability Test あるいは Fisher’s method)」です。ただし、交差検証の各分割(fold)で得られた p 値をFisherの結合確率検定によって統合する場合、「各分割が互いに独立である」という前提は、実際には正しくないので注意してください。だって、同じデータを使っているものがあるからです。あくまで、近似的に独立とみなして、Fisherの結合確率検定を適用するのも一つの手ということです。

Fisherの結合確率検定とは?

 通常、1回の仮説検定で得られるp値は「帰無仮説(何も起こっていない、違いがないなど)が正しい確率」を表す指標です。
しかし、交差検証をした場合に、

1番目の分割におけるp値 → 0.02
2番目の分割におけるp値 → 0.10
3番目の分割におけるp値 → 0.04
4番目の分割におけるp値 → 0.08
5番目の分割におけるp値 → 0.01

とバラバラの値が得られた場合、「全体としては効果があると言えるのか?」の判断が難しいです。

 Fisherの方法は、これら複数のp値を1つの「結合されたp値」にまとめることで、「全体としての有意性」を評価できます。

具体的な計算例

 Fisherの結合確率検定では、以下の手順で計算します。

  1. 各研究や検定で得られたp値を用意する。たとえば、\displaystyle{
p _ 1, p _ 2, \ldots, p _ n
}
  2. それぞれの p 値に対して、自然対数を取って合計する
  3. その合計値に \displaystyle{
-2
} をかける。
  4. 得られた値を、自由度 \displaystyle{
2n
}カイ二乗分布に当てはめて、対応する p 値を求める。この p 値が、一つにまとめた値です。

注意点

  1. 各p値は“独立”が前提
     もしp値同士が相関している(同じデータを使った、条件がかぶっているなど)場合、単純にはカイ二乗分布を適用できません。

  2. 極端に小さいp値があると合計値が支配されがち
     例えば、p値のうち一つがめちゃくちゃ小さい(0.00001など)と、その値のログが非常に大きく(負の値が大きく)なり、合計値で優位に働きます。

  3. どの検定が有意かは直接わからない
     結合p値が有意だったとして、「複数のうちどの研究が主に有意性をもたらしているのか」までは判定できません。

計算例

例:3つの検定から得られたp値

\displaystyle{
p_1 = 0.02, p_2 = 0.10, p_3 = 0.04
}
ステップ
  1. 自然対数を取る。
\displaystyle{
\begin{aligned}
\ln(0.02) &\approx -3.912\\
\ln(0.10) &\approx -2.303\\
\ln(0.04) &\approx -3.219
\end{aligned}
}
  1. 合計する。
\displaystyle{
-3.912 + (-2.303) + (-3.219) = -9.434
}
  1. \displaystyle{
-2
} 倍する。
\displaystyle{
\chi^ 2 = -2 \times (-9.434) = 18.868
}
  1. 自由度 \displaystyle{
2 \times 3 = 6
}カイ二乗分布を用いて、\displaystyle{
\chi^ 2 = 18.868
} に対応する  p 値を確認すると、
\displaystyle{
p \approx 0.0047
}

有意とかの判断は、個人に任せますが、 p 値を一つにまとめることができました。

Rでやってみる

 上の計算をRで実行する例が以下です。

# =======================================
# Fisherの結合確率検定の例
# =======================================

# 1. 複数のp値をベクトルとして用意
pvals <- c(0.02, 0.10, 0.04)

# 2. Fisherの検定統計量 X^2 を計算
#   X^2 = -2 * ∑[ln(p_i)]
X2 <- -2 * sum(log(pvals))

# 3. 自由度は 2 * n
df <- 2 * length(pvals)

# 4. 結合p値 (combined p-value) の算出
#   カイ二乗分布の累積分布関数を使う
p_combined <- 1 - pchisq(X2, df)

# 結果の表示
cat("Fisher's Combined X^2 =", X2, "\n")
cat("Degrees of freedom =", df, "\n")
cat("Combined p-value =", p_combined, "\n")

まとめ

 Fisherの結合確率検定は、複数の独立したp値を集約する方法として使うことができます。ただし、 独立性の仮定や極端なp値への影響には注意が必要です。