Fisherの正確確率検定

超幾何分布

超幾何分布から\(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ですぐに計算できるので感謝です

fisher.test(tab, 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)
    )

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

fisher.test(tab, 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)よりご助言いただき、サンプルも使用させていただきました。ありがとうございました。

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

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