Fisherの正確確率検定

1ページ 2ページ 3ページ

間違った解釈をしないように!

(再掲)

R
severity <- c(rep("severe", 12), rep("mild", 6), rep("severe", 3), rep("mild", 8))
severity <- factor(severity, levels=c("severe", "mild"))
levels(severity)
#[1] "severe" "mild"
effect <- c(rep("yes", 18), rep("no", 11))
effect <- factor(effect, levels=c("yes", "no"))
levels(effect)
#[1] "yes" "no" 
tab <- xtabs( ~ severity + effect)
print(tab)
> print(tab)
        effect
severity yes no
  severe  12  3
  mild     6  8

帰無仮説: severeのオッズ = mildのオッズ
対立仮説: severeのオッズ > mildのオッズ

severeのオッズ がmildのオッズより有意に大きいことを証明します。Fisherの直接法により有意水準5%で検定します。

R
fisher.test(tab)
> fisher.test(tab)

        Fisher's Exact Test for Count Data

data:  tab
p-value = 0.06043
alternative hypothesis: true odds ratio is not equal to 1
95 percent confidence interval:
  0.8163182 40.7244582
sample estimates:
odds ratio 
  5.003853 

p=0.06となり有意差はありません・・・、という回答は間違っています。fisher.testのデフォルトを確認しましょう。

R
?fisher.test
fisher.test(x, y = NULL, workspace = 200000, hybrid = FALSE,
            hybridPars = c(expect = 5, percent = 80, Emin = 1),
            control = list(), or = 1, alternative = "two.sided",
            conf.int = TRUE, conf.level = 0.95,
            simulate.p.value = FALSE, B = 2000)

alternative = “two.sided”がデフォルトで、両側検定が初期設定となっています。しかし今回の検定は 「片側検定を5%水準で行う」と宣言しています。alternative = “less” または、”greater”を設定しなければなりません。さてどちらを選択すればよいでしょうか。

先に述べましたように X≧12 となる確率を求めることになります。alternative = “greater” と設定して上側検定を実行します。

R
fisher.test(tab, alternative = "greater")
> fisher.test(tab, alternative = "greater")

        Fisher's Exact Test for Count Data

data:  tab
p-value = 0.04601
alternative hypothesis: true odds ratio is greater than 1
95 percent confidence interval:
 1.029929      Inf
sample estimates:
odds ratio 
  5.003853 

p=0.046となり帰無仮説は棄却され、severeのオッズは mildのオッズより有意に大きいという結果になります。

ここで重要なのは、オッズ比の見方になります。分割表が以下のように入れ替わった場合は、もちろん答えも変わってきます。どちらが分母で、どちらが分子になっているか判断しなければなりません。以下の分割表ではnoとyesを入れ替えています。

R
tab_m <- tab[, c(2, 1)] 
print(tab_m)
> print(tab_m)
        effect
severity no yes
  severe  3  12
  mild    8   6

これで列が入れ替わりました.検定してみましょう。

R
fisher.test(tab_m, alternative = "greater")
> fisher.test(tab_m, alternative = "greater")

        Fisher's Exact Test for Count Data

data:  tab_m
p-value = 0.9935
alternative hypothesis: true odds ratio is greater than 1
95 percent confidence interval:
 0.03358399        Inf
sample estimates:
odds ratio 
  0.199846 

この場合のオッズ比は、

tab_mのオッズ比=$\frac{severのno}{severのyse}/\frac{mildのno}{mildのyse}$

Rで分割表を検定する場合は、このことに十分気を付けながら実行しなければなりません。

3群以上の場合

R
tab3 <- matrix(c(15, 12, 6, 3, 3, 10), 3, 2)
rownames(tab3) <- c("level 1", "level 2", "level 3")
colnames(tab3) <- c("yes", "no")
print(tab3)
> print(tab3)
        yes no
level 1  15  3
level 2  12  3
level 3   6 10

オッズ=$\frac{yes}{no}$

帰無仮説:レベル1, 2, 3のオッズは等しい
対立仮説:レベル1, 2, 3のオッズは等しくない(3群のどこかでが異なる)

fisherの正確検定
R
fisher.test(tab3)
> fisher.test(tab3)

        Fisher's Exact Test for Count Data

data:  tab3
p-value = 0.0103
alternative hypothesis: two.sided

fisherの正確検定は大変複雑な計算になりますが、Rでは一瞬で算出してくれます。両側検定をした結果は、p = 0.048 となり統計学的に差があるという結果になりました。

カイ二乗検定
R
chisq.test(tab3)
> chisq.test(tab3)

        Pearson's Chi-squared test

data:  tab3
X-squared = 9.6654, df = 2, p-value = 0.007965

警告メッセージ:
chisq.test(tab3) で: カイ自乗近似は不正確かもしれませ

p値は少し異なりますが、カイ二乗検定もやはり有意という回答になりました。

多重比較

グループ間の割合に差があるということなので、多重比較を行う場合が多いと思われます。でも、個人的には井口先生のご意見に賛成です。以下をご参照ください。

Fisher 正確検定の後に多重比較するな
Fisher 正確検定の後に,下位検定(事後検定 post hoc test)として,多重比較(Bonferroni, Holm など)を行うことは適切ではない。

このことを理解した上で、多重比較の方法のみを記載しておきます。使用するパッケージは、RVAideMemoire。インストールしてない場合は install.packages(“RVAideMemoire”)。

R
library(RVAideMemoire)

以下のようなp値調整の方法があります。

p.adjust.methods
# c("holm", "hochberg", "hommel", "bonferroni", "BH", "BY",
#   "fdr", "none")

Adjust P-values for Multiple Comparisons

ホルム

実際にやってみましょう.A=1行目、B=2行目、C=3行目.

R
fisher.multcomp(tab3, p.method="holm")
> fisher.multcomp(tab3, p.method="holm")

        Pairwise comparisons using Fisher's exact test for count data

data:  tab3

        level 1 level 2
level 2 1.00000       -
level 3 0.03673 0.05802

P value adjustment method: holm
ボンフェローニ
R
fisher.multcomp(tab3, p.method="bonferroni")
> fisher.multcomp(tab3, p.method="bonferroni")

        Pairwise comparisons using Fisher's exact test for count data

data:  tab3

        level 1 level 2
level 2 1.00000       -
level 3 0.03673 0.08702

P value adjustment method: bonferroni

どちらの方法も1行目と3行目に有意差ありという判定でした。

参考ページ ↑↑↑

コメント欄 『間違い』や『分かりにくい部分』などのご意見もお寄せください

  1. 記事を拝見させていただきました。

    Fisherの正確確率検定とオッズ比は無関係です。
    オッズ比はオッズ比の検定があり、2×2の集計表ではロジスティック回帰分析がオッズ比の検定に対応します。ロスマンの疫学(https://shinoharashinsha.co.jp/?page_id=3534)を参照いただければ参考になります。
    Rではなぜか無関係な統計量が出てくるので、必要な統計量を自分で判断しなければなりません。計算機は自分の命令で正しく使用し、勝手な計算に騙されてはいけないということです。

    また、2×2の集計表で fisher.test では Mid-P value method つまり、近似法を使用するのでP値は不正確になることがあります。離散分布なので、左右対称の分布ではないためです。package.exact2x2 を使用してfisher.exact(.Table,tsmethod=”central”)
    を使用するのが正しいです。(https://cran.r-project.org/web/packages/exact2x2/index.html)

    この例のオッズ比の検定のp値は0.046703368、=CHISQ.DIST.RT((LN(12)+LN(8)-LN(3)-LN(6))^2/(1/12+1/8+1/6+1/3),1)となります。オッズ比の95%信頼区間は(1.024721572, 27.75821767)になります。

    リスク差(2群間の出現率の差)の検定としてFisherの正確確率検定CentralではExcelシートで=2*HYPGEOM.DIST(3,15,11,29,TRUE)=0.09202767
    Rでは通常 fisher.exact() を使用します。

    しかし、Fisherの正確確率検定はサンプルサイズが、m(この例では29)で周辺度数が固定された場合の現実的に使用しない仮定の時のP値なので、つまり、フィッシャーの正確検定は母集団が特定の例数の時のものなので、この原理を用いて普遍性のある推定をするのは困難です。通常は無限母集団からの標本集団に対して Pearson のχ2検定(連続修正有り)(この例では0.093544431で近似もそれほど悪くはない)などを使用し、普遍性のある推定を行います。
    疫学でいうリスク差の検定にFisherの正確確率検定、Pearson のχ2検定(連続修正有り)、連続修正を加えたマンテル・ヘンツェルの検定が適用されます。
    この例ではリスク差の95%信頼区間は(-0.026515826, 0.769372969)です。
    統計的仮説検定を行いたい時は理論度数とは無関係にFisherの正確確率検定ではなく出現率の差の正規近似検定つまりχ2検定を用いるべきです。

    3群以上の場合は、r×2のように出現率の差を計算できる場合に限り、Bonferroni型の検定と95%同時信頼区間で評価が可能です。2ページ目の例では1行目と3行目でp値0.013、(0.100,0.816 )、2行目と3行目でp値0.035、(0.044, 0.806), 1行目と2行目でp値0.84、(-0.29, 0.36)となります。帰無仮説:レベル1, 2, 3のyesまたはnoの出現率は等しいとなります。下記のExcelシートなどを参考にしていただければ幸いです。
    https://researchmap.jp/multidatabases/multidatabase_contents/detail/1119559/a8966183061200a85e9901f90838df08?frame_id=1951737

    一般のa×b型の場合はPearson のχ2検定を使用することになります。そして、2項分布などを使用できないため、各セルの出現率で度数の食い違いを比較するようになります。つまり多重比較は行わないことになります。

    一般に検定結果と推定結果は一致するとは限りませんので、検定と推定で結果が異なることがあります。

    以上参考になれば幸いです。

タイトルとURLをコピーしました