MENU

R でフィッシャーの正確確率検定・カイ二乗検定 で 3 群以上の比較を実行する方法

フィッシャーの正確確率検定、カイ二乗検定の3群以上の比較をRで実施する方法の解説。

>>もう統計で悩むのは終わりにしませんか? 

↑期間・数量限定で無料プレゼント中!

目次

カイ二乗検定の3群以上の比較

三群以上の割合の比較はどうやればいいのか?

Bonferroni型のp値調整を使う方法がある。

Rで行う場合、pairwise.prop.test()という関数を使う。

カイ二乗検定 3群以上の比較で多重調整しない場合

例として下記の2×3の分割表のデータでやってみる。

Group1Group2Group3
No49 (100%)97 (96%)63 (86%)
Yes0 (0%)4 (4%)10 (14%)

パーセントは列パーセントを記している。

分割表作成と検定のためのRスクリプトは以下の通り。

tab <- matrix(c(49,0,97,4,63,10),nr=2)
dimnames(tab) <- list(c("No","Yes"),c(paste("Group",1:3,sep="")))
tab
round(prop.table(tab, 2),2)
> tab
    Group1 Group2 Group3
No      49     97     63
Yes      0      4     10
>
> round(prop.table(tab, 2),2)
    Group1 Group2 Group3
No       1   0.96   0.86
Yes      0   0.04   0.14

多重比較の結果、Group1と3、Group2と3がそれぞれ0.05を下回って、統計学的有意に異なるように見える。

> pairwise.prop.test(t(tab), p.adj="none")
Pairwise comparisons using Pairwise comparison of proportions
data:  t(tab)
Group1 Group2
Group2 0.383  -
Group3 0.018  0.041
P value adjustment method: none
Warning messages:
1: In prop.test(x[c(i, j)], n[c(i, j)], ...) :
Chi-squared approximation may be incorrect
2: In prop.test(x[c(i, j)], n[c(i, j)], ...) :
Chi-squared approximation may be incorrect

例題は期待値が5以下のマス目が20%以上なので、$ \chi^2 $ 検定が不適切であるメッセージが出ている。

$ \chi^2 $ 検定が不適切な場合は、フィッシャーの正確確率検定(後述)を行う。

以下は、期待値を計算した分割表。

Group1Group2Group3Total
No45.997.468.4209
Yes3.16.34.614
Total4910173223

赤で示した二つのセルが期待値5未満だ。

どのグループ間比較でも、期待値5未満のセルが一つまたは二つ含まれる。

一つのセルだけでも 1/4 = 25 % 、二つのセルなら 2/4 = 50 % なので、いずれの場合も 20 % を超えている。

ゆえに、$ \chi^2 $ 検定を使うのは適切ではない。

カイ二乗検定 ホルムの多重調整

ホルムの方法は、もっとも小さいp値に最大比較ペア数をかける。

例はペア数は3なので、3をかける。

2番目のp値に2をかける。一番大きいp値はそのまま。と計算される。

1と3:$ 0.018 \times 3 = 0.054 $

2と3:$ 0.041 \times 2 = 0.081 $

もっとも小さいp値の3倍が0.05を下回らなかった時点で、計算は終了だ。

多重比較調整するとどの群間も統計学的有意に異ならない。

> pairwise.prop.test(t(tab))
Pairwise comparisons using Pairwise comparison of proportions
data:  t(tab)
Group1 Group2
Group2 0.383  -
Group3 0.054  0.081
P value adjustment method: holm
Warning messages:
1: In prop.test(x[c(i, j)], n[c(i, j)], ...) :
Chi-squared approximation may be incorrect
2: In prop.test(x[c(i, j)], n[c(i, j)], ...) :
Chi-squared approximation may be incorrect

カイ二乗検定 ホックバーグ の多重調整

もう一つの方法はホックバーグの方法。

こちらのほうが検出力が高く、おすすめ。

ホルムと同様に、大きいp値はそのまま、2番目に大きいp値を2倍して、一番小さいp値を3倍する。

チェックの仕方がホルムの時と逆で、大きいp値から始める。

もしもっとも大きいp値が0.05を下回っていたら、それ以外のp値がどうであれ、すべて統計学的有意に異なると判断する。

もっとも大きいp値が0.05を下回っていなかったら、次に2番目に大きいp値の2倍と0.05を比較する。

ここでもし0.05より小さければ、最も小さいp値は不問で、ともに統計学的有意に異なると判断する。

今回の例は、どのレベルでも0.05を下回らなかったので、どの群間にも統計学的有意差はなかった。

> pairwise.prop.test(t(tab),p.adjust="hochberg")
Pairwise comparisons using Pairwise comparison of proportions
data:  t(tab)
Group1 Group2
Group2 0.383  -
Group3 0.054  0.081
P value adjustment method: hochberg
Warning messages:
1: In prop.test(x[c(i, j)], n[c(i, j)], ...) :
Chi-squared approximation may be incorrect
2: In prop.test(x[c(i, j)], n[c(i, j)], ...) :
Chi-squared approximation may be incorrect

ホルムは小さいp値から0.05を下回り続けなければならない点で厳しく、ホックバーグは、大きいp値が一回0.05を下回った段階でそれより小さいp値は不問で全部有意というところが、検出力が高いゆえんだ。

フィッシャー正確確率検定の3群以上の比較

フィッシャーの正確確率検定を3群以上の比較で使う方法。

RVAideMemoireパッケージのfisher.multcomp()を使う。

RVAideMemoireパッケージをインストールする。

インストールは一回だけ。

install.packages("RVAideMemoire")

p.methodで多重比較調整の方法を指定する。

library(RVAideMemoire)
fisher.multcomp(tab, p.method="none")
fisher.multcomp(tab, p.method="holm")
fisher.multcomp(tab, p.method="hochberg")

フィッシャーの正確確率検定とカイ二乗検定の結果の比較

このデータはフィッシャーの正確確率検定を使うことが適切である典型例と思う。

 \chi^{2} \chi^{2} with Holm/HochbergFisherFisher with Holm/Hochberg
Group1:Group20.3830.3830.30380.3038
Group1:Group30.0180.0540.0056560.01697
Group2:Group30.0410.0810.024810.04962

Group1と3、Group2と3のp値が、$ \chi^2$ に比べるとFisherのほうが断然低い。

ホルムなら、Group1と3が有意、Group2と3が有意、Group1と2は有意でなく計算終了。

ホックバーグなら、Group1と2は有意でないが、Group2と3が有意で、Group1と3を確認する前に終了。

結果として、Group1と3、Group2と3の群間に統計学的有意な差を認めた(赤で示した有意確率)。

つまり、Group3がダントツでYesの割合が高いという結論だ。

以下は、上記の結果を計算するためのRスクリプト。

> library(RVAideMemoire)
>
> fisher.multcomp(tab, p.method="none")
Pairwise comparisons using Fisher's exact test for count data
data:  tab
       Group1:Group2 Group1:Group3 Group2:Group3
No:Yes        0.3038      0.005656       0.02481
P value adjustment method: none
> 
> fisher.multcomp(tab, p.method="holm")
        Pairwise comparisons using Fisher's exact test for count data
data:  tab
Group1:Group2 Group1:Group3 Group2:Group3
No:Yes        0.3038       0.01697       0.04962
P value adjustment method: holm
>
> fisher.multcomp(tab, p.method="hochberg")
Pairwise comparisons using Fisher's exact test for count data
data:  tab
       Group1:Group2 Group1:Group3 Group2:Group3
No:Yes        0.3038       0.01697       0.04962
P value adjustment method: hochberg

ちなみに、fisher.multcomp()は $ 2 \times n $ を超え$ m \times n $ の分割表に適用できる。

下記の結果から抜き出すと、検討に値する組み合わせは以下の5通り。

  • H:MでGp1:Gp3 0.848485
  • H:MでGp1:Gp4 0.535714
  • M:LでGp1:Gp2 0.05031
  • M:LでGp1:Gp4 0.008772
  • M:LでGp1:Gp3 0.005409

結論として、

  • MとL x Gp1とGp4
  • MとL x Gp1とGp3

この2つの組み合わせが統計学的有意に異なっていた。

ちなみに、調整したp値が1を超える場合、1と表現されている。

> tab1 <- matrix(c(0,6,2,1,3,19,3,2,27,2,0,13),nr=3)
> dimnames(tab1) <- list(c("H","M","L"),c(paste("Gp",1:4,sep="")))
> tab1
  Gp1 Gp2 Gp3 Gp4
H   0   1   3   2
M   6   3   2   0
L   2  19  27  13
> fisher.multcomp(tab1, p.method="none")
Pairwise comparisons using Fisher's exact test for count data
data:  tab1
     Gp1:Gp2   Gp1:Gp3  Gp1:Gp4 Gp2:Gp3 Gp2:Gp4 Gp3:Gp4
H:M 0.400000 0.0606061 0.035714  0.5238  0.4000       1
H:L 1.000000 1.0000000 1.000000  0.6411  0.5646       1
M:L 0.003145 0.0003005 0.000516  0.6407  0.2790       1
P value adjustment method: none
> fisher.multcomp(tab1, p.method="hochberg")
        Pairwise comparisons using Fisher's exact test for count data
data:  tab1
    Gp1:Gp2  Gp1:Gp3  Gp1:Gp4 Gp2:Gp3 Gp2:Gp4 Gp3:Gp4
H:M 1.00000 0.848485 0.535714       1       1       1
H:L 1.00000 1.000000 1.000000       1       1       1
M:L 0.05031 0.005409 0.008772       1       1       1
P value adjustment method: hochberg

>>もう統計で悩むのは終わりにしませんか? 

↑1万人以上の医療従事者が購読中

まとめ

割合の多重比較の方法を紹介した。

方法は、二群比較を繰り返して、p値をあとから調整するというもの。

サンプルサイズが大きい場合は、 $ \chi^2 $ 検定を用いる方法でもよい。

サンプルサイズが小さい場合は、フィッシャーの正確確率検定を用いたほうが良い。

PCのソフトウェアで計算できるようになり、サンプルサイズが大きくなってもフィッシャーの正確確率検定は簡単に行えるようになった。

Rが使えるなら、どんな時でも、フィッシャーの正確確率検定の多重比較fisher.multcomp()を使いたい。

参考書籍

医学統計学シリーズ 5
新版 無作為化比較試験 ―デザインと統計解析― (医学統計学シリーズ5)
よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

リサーチクエスチョン探し?データ分析?論文投稿?、、、で、もう悩まない!

第1章臨床研究ではなぜ統計が必要なのか?計画することの重要性
  • 推定ってどんなことをしているの?
  • 臨床研究を計画するってどういうこと?
  • どうにかして標本平均を母平均に近づけられないか?
第2章:研究目的をどれだけ明確にできるのかが重要
  • データさえあれば解析でどうにかなる、という考え方は間違い
  • 何を明らかにしたいのか? という研究目的が重要
  • 研究目的は4種類に分けられる
  • 統計専門家に相談する上でも研究目的とPICOを明確化しておく
第3章:p値で結果が左右される時代は終わりました
  • アメリカ統計協会(ASA)のp値に関する声明で指摘されていること
  • そうは言っても、本当に有意差がなくてもいいの…?
  • なぜ統計専門家はp値を重要視していないのか
  • 有意差がない時に「有意な傾向があった」といってもいい?
  • 統計を放置してしまうと非常にまずい
第4章:多くの人が統計を苦手にする理由
  • 残念ながら、セミナー受講だけで統計は使えません。
  • インプットだけで統計が使えない理由
  • どうやったら統計の判断力が鍛えられるか?
  • 統計は手段なので正解がないため、最適解を判断する力が必要
第5章:統計を使えるようになるために今日から何をすれば良いか?
  • 論文を読んで統計が使えるようになるための5ステップ
第6章:統計を学ぶために重要な環境
  • 統計の3つの力をバランスよく構築する環境

以下のボタンをクリックして、画面に出てくる指示に従って、必要事項を記入してください。

この記事を書いた人

統計 ER ブログ執筆者

元疫学研究者

統計解析が趣味

コメント

コメント一覧 (1件)

コメントする

目次