Fisherの正確確率検定

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

超幾何分布

超幾何分布から\(P(X)\)を算出します。

Fisherの正確検定のp値の求め方

\(P(X=12)=0.03949341\)

ということが分かりました。つまり数あるパターンの中から上の分割表のパターンになる確率のことです。Rでやってみましょう。dhyperは幾何分布の確率密度を求めるための関数です(”d” gives the probability density)。

R
# dhyperは超幾何分布の確率密度関数

a <- 15
b <- 14
n <- 18
x <- 12

dhyper(
    x = x, m = a, n = b, k = n
    )

以下のように表示されていれば成功です。

さきほど求めた解と同じ確率が算出されます。X≧12やX≦12となる確率はどうなるでしょうか?。X=0~15の確率を直接求めるのです。全て足せばよいのでやってみましょう。

$$ P(X≧12) = P(X=12) + P(X=13) + P(X=14) + P(X=15) $$

なかなか大変です。なのでnが大きくなると昔は計算が大変だった思います。でも今はRですぐに計算できるので感謝です。

片側検定(下側),alternative = “greater” のp値
R
# sumは集計結果を算出する関数です
a <- 15
b <- 14
n <- 18
x <- c(12:15)

sum(
    dhyper(x = x, m = a, n = b, k = n)
    )

以下のように表示されていれば成功です。

両側検定, alternative = “two.sided” のp値

Rでやってみましょう

R
tab <- matrix(c(12, 6, 3, 8), 2, 2)
tab
fisher.test(tab, alternative = "two.sided")
R
a <- 15
b <- 14
n <- 18
X <- c(15:4)

確率  <- dhyper(x = 15:4, m = a, n = b, k = n)
累積1  <- phyper(q = 14:3, m = a, n = b, k = n, lower.tail=F)
累積2  <- phyper(q = 15:4, m = a, n = b, k = n)
df <- data.frame(X, 確率, 累積1, 累積2)
round(df,6)

赤塗り部分の合計がfisher.testのp値。

R
sum(df[c(1:4,10:12),2])

累積確率で考えたら間違いますので注意が必要です。

例1:これまで使用してきた例では累積確率と同じ値になる場合

赤の合計と青の合計が同じ値になります。

R
#赤部分=確率の和
sum(df[c(1:4,10:12),2])
#青部分=累積確率の和
df[4, 3]+df[10, 4]

累積確率と異なる値になる場合もあるので注意が必要です。

例2:累積確率と異なる値になる

R
tab2 <- matrix(c(7, 2, 8, 10), 2, 2)
tab2
R
fisher.test(tab2, alternative = "two.sided")

赤の合計と青の合計が異なる値になります

黒木玄様(@genkuroki)よりご助言いただき、サンプルも使用させていただきました。ありがとうございました。

library(exact2x2)

サンプル(tab3)を使用して3つのp値についてまとめます。

R
tab3 <- matrix(c(16, 4, 4, 6), 2, 2)
tab3
R
a <- 20
b <- 10
n <- 20
X <- c(19:10)
確率  <- dhyper(x = 19:10, m = a, n = b, k = n)
累積1  <- phyper(q = 18:9, m = a, n = b, k = n, lower.tail=F)
累積2  <- phyper(q = 19:10, m = a, n = b, k = n)
df3 <- data.frame(X, 確率, 累積1, 累積2)
round(df3,6)
tsmethod=”minlike”

観測されたクロス表の確率以下の確率を全て合計したもの(Sterne の方法)。

fisher.testで算出されるP値です

R
exact2x2(tab3, tsmethod="minlike")
R
sum(df3[c(1:4,10), 2])
tsmethod=”central”

片側(小さい方) p 値の 2 倍

R
exact2x2(tab3, tsmethod="central")

赤塗り部分の合計の2倍(=青塗り部分の2倍)

R
df3[4, 3]*2
tsmethod=”blaker”

観測された裾の確率に、裾の確率よりも大きくない反対側の裾の最大の裾の確率を加えた合計。

R
exact2x2(tab3, tsmethod="blaker")

赤塗り部分の合計(この例ではminlikeと同じ値になりますが書いておきます)

R
sum(df3[c(1:4,10), 2])

p値と信頼区間の整合性

fisher.test では、p 値は tsmethod=“minlike” 、信頼区間はtsmethod=“central” に基づいて求められており、整合性に問題が生じます。

上記の例teb3をfisher.testで検定した場合

R
fisher.test(tab3, alternative = "two.sided")

p<0.05なので信頼区間が1を跨いでしまっています。ですので上述したtsmethod=”minlike”で実行することでp値と信頼区間の整合性が担保されます。

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

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