多重比較補正・FDR補正

多重比較補正とは?

検定を繰り返せば繰り返すほど、偶然有意差が出てしまう確率(偽陽性;第一種の過誤)が高くなってしまう。

この確率を制御する方法として、Family-wise error rate(FWER) や False discovery rate(FDR) を制御する方法がよく使用されます。

名前制御するもの
FWER全ての仮説の中で少なくとも1つの正しい帰無仮説が誤って棄却されてしまう確率
FDR棄却された仮説のうち、誤って棄却された真の帰無仮説の割合

ここでは、多重比較補正としてよく用いられる、Bonferroni法とBenjamini & Hochberg法(BH法)を紹介します。

それぞれ、FWERとFDRを調整する方法として知られています。

補正方法制御するもの
Bonferroni法FWER
Benjamini & Hochberg法FDR

計算方法

藤先生のPDFに記載があります。


例題

藤先生のPDF から例題を持ってきました。

5コのp値(0.210, 0.001, 0.100, 0.060, 0.005)がある状態を考えます。

このp値をBonferroni法とBH法で補正します。

Bonferroni法で補正すると(1, 0.005, 0.5, 0.30, 0.025) となり、

BH法で補正すると(0.21, 0.005, 0.125, 0.1, 0.0125) となるはずです。


ソースコード

# PythonでBonferroni法

Pythonの場合は statsmodels.stats.multitest.multipletests でBonferroni補正を行うことができます。

#!/usr/bin/env python
from statsmodels.stats.multitest import multipletests

p_values = [0.21, 0.001, 0.1, 0.06, 0.005]
print(multipletests(p_values, method='bonferroni')[1]) # => [1, 0.005, 0.5, 0.3, 0.025]

# RでBonferroni法

Rの場合は p.adjust() で多重比較補正を行うことができます。

#!/usr/bin/env Rscript
p_values = c(0.21, 0.001, 0.1, 0.06, 0.005)
print(p.adjust(p_values, method="bonferroni")) # => c(1.000, 0.005, 0.500, 0.300, 0.025)

# PythonでBH法

PythonのBH法によるFDR調整の際も同じ関数(statsmodels.stats.multitest.multipletests)で行うことができます。

#!/usr/bin/env python
from statsmodels.stats.multitest import multipletests

p_values = [0.21, 0.001, 0.1, 0.06, 0.005]
print(multipletests(p_values, method='fdr_bh')[1]) # => [0.21, 0.005, 0.125, 0.1, 0.0125]

# RでBH法

RのBH法によるFDR調整の際も同じ関数(p.adjust())で行うことができます。

#!/usr/bin/env Rscript
p_values = c(0.21, 0.001, 0.1, 0.06, 0.005)
p.adjust(p_values, method="fdr") # => c(0.2100, 0.0050, 0.1250, 0.1000, 0.0125)

その他

特になし