以下のような3群(A,B,C)で2値変数を測定したサンプルデータを作成して実行してみる。
> group <- c(rep("A",10),rep("B",10),rep("C",10)) > response <- c(rep(0,8),rep(1,2),rep(0,4),rep(1,6),0,rep(1,9)) > (tbl <- table(response, group)) group response A B C 0 8 4 1 1 2 6 9
fisher.test( )を使って全体を比較する
サンプル数が多ければchisq.test()
を使う。
> fisher.test(tbl) Fisher's Exact Test for Count Data data: tbl p-value = 0.007807 alternative hypothesis: two.sided
2群ずつ対比較する
Fisher正確検定を使って3通りの2群比較を行った結果は以下のとおり。
- A vs. B:P=0.1698
- A vs. C:P=0.005477
- B vs. C:P=0.06978
このままだとαエラーが想定より大きくなってしまうので補正が必要。
pairwise.fisher.test( )を使って対比較をする
サンプル数が多くカイ2乗検定を行う場合は、pairwise.chisq.test()
を使う。
まず偶現表から「各カテゴリーの陽性数」および「各カテゴリーの合計数」を取り出す。
必要なパッケージも読み込んでおく。
> library(fmsb) > (n_pos <- tbl[2,]) A B C 2 6 9 > (n_total <- apply(tbl,2, sum)) A B C 10 10 10
p.adjust.method
で使用する補正方法を指定する。
よく使われる補正方法:bonferroni
, holm
, hochberg
など
> pairwise.fisher.test(n_pos,n_total, p.adjust.method="bonferroni") Pairwise comparisons using Pairwise comparison of proportions (Fisher) data: n_pos out of n_total A B B 0.509 - C 0.016 0.910 P value adjustment method: bonferroni
代表的な補正方法について
Bonferroni法
単純にP値に比較の数を掛け合わせただけ(判定の水準は0.05のままで良い)。3通りの比較ペアがあるので有意水準は3倍厳しくなる。
それぞれの対比較に3をかけると、
- A vs. B:P=0.1698×3=0.5094
- A vs. C:P=0.005477×3=0.016431
- B vs. C:P=0.06978×3=0.9102
となり、前述のBonferroni補正後の結果と一致する。
Holm法
Bonferroni法は保守的すぎるので比較群数が多い時はHolm法がよく使われる。これは一律に比較ペア数(=3)をかけるのではなく、1番小さいP値には×3、2番目に小さいP値には×2、というように計算していく。
実際の計算手順は、
- まずペア比較で1番小さかったP値には×3をして判定。「有意差あり」なら次へ進む。
- A対C:P=0.005477×3=0.016431
- 次に、2番目に小さかったP値に対しては×2をして判定。
- A対B:P=0.1698×2=0.3396
0.05なのでここで終了。以後のペア比較については上記と同じP値を表示。
pairwise.fisher.test()
で計算された結果も同じようになっている。
> pairwise.fisher.test(n_pos,n_total, p.adjust.method="holm") Pairwise comparisons using Pairwise comparison of proportions (Fisher) data: n_pos out of n_total A B B 0.340 - C 0.016 0.340 P value adjustment method: holm
Hochberg法*1
補正P値の計算方法はHolm法と同じだが、判定順序が逆。
- まずペア比較で1番大きかったP値には×1をして判定。有意差があれば、以後の比較は全て有意差ありと判定する。
- B対C:P=0.3034>0.05なので次に進む。
- 2番目に大きかったP値に対しては×2をして判定。
- A対B:P=0.1698×2=0.3396>0.05なので次に進む。
- 1段階目のP値の方が小さいので、そちらを記載。
- 3番目に大きかったP値に対しては×3をして判定。
- A対C:P=0.005477×3=0.016431
- このペアのみ「有意差あり」と判定。
> pairwise.fisher.test(n_pos,n_total, p.adjust.method="hochberg") Pairwise comparisons using Pairwise comparison of proportions (Fisher) data: n_pos out of n_total A B B 0.303 - C 0.016 0.303 P value adjustment method: hochberg
おわりに
- Bonferroni法, Holm法, Hochberg法はP値の判定基準を変更する補正法。
- 対比較のP値が得られれば手計算でもできることがメリット。
- 比較のペア数が多くなるとBonferroni法は極端に保守的になるので避けた方がよい。
参考資料
- 大阪大学腎臓内科グループの解説がわかりやすい。
*1:ホッホバーグ