検定を繰り返せば繰り返すほど、偶然有意差が出てしまう確率(偽陽性;第一種の過誤)が高くなってしまう。
この確率を制御する方法として、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の場合は 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の場合は 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法による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法による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)
特になし