次のような2×2分割表を考えましょう。
| a | b | 20 |
|---|---|---|
| c | d | 30 |
| 15 | 35 | 50 |
このような表の各行・各列が独立かどうかを検定する際の帰無仮説として,次の二つを考えます:
以下では,上の場合を条件なし(unconditional),下の場合を条件付き(conditional)と呼んでいます。これ以外に,上・下の個数20,30を固定し,左・右の個数は固定しないなども考えられます。
このような分割表の検定としては,Fisherの正確検定とカイ2乗検定がよく使われています。前者は条件付きの場合に正確な p 値を与える方法です。後者はどちらの場合にも計算式は同じです。
これらの場合について,それぞれ n 回シミュレーションし,
を求めてみましょう。この Fn(x) を経験分布関数または経験累積分布関数(ECDF,empirical cumulative distribution function)といいます。
グラフは次のようになります。横軸は x,縦軸は Fn(x) です。
ECDFは,斜め45度の線上にあるのが理想です。条件付きの2×2分割表は非常に離散的で,いくつかの p 値しかとりません。グラフではぎざぎざになっていますが,可能な場合(黒丸の点)については完全に斜め45度の線上にありますので,条件付きの場合はFisherの方法が最適です。これを近似するものとして連続性の補正をしたカイ2乗検定があります。
問題は条件なしの場合で,Fisherの方法は,下に寄ってしまいます。p ≦ 0.05 となる確率は 0.03〜0.04 程度です。全体の形としては,補正なしのカイ2乗検定が最も良くなります。
これは条件付き・条件なしの本質的な違いではなく,単に条件付きの場合は可能な点が少ないのでより離散的になるためです。サンプルのサイズ(この例では50)をもっと増やせば違いはなくなります。
練習問題として,片側だけ条件付きの場合もやってみてください(条件なしの場合とほぼ同じ図になります)。
条件なしの場合:
prob = c(0.12,0.18,0.28,0.42)
ni = 100000
pfis = pchi = pchic = numeric(ni)
for (i in 1:ni) {
k = sample(1:4, 50, replace=TRUE, prob=prob)
na = sum(k == 1)
nb = sum(k == 2)
nc = sum(k == 3)
nd = sum(k == 4)
a = matrix(c(na, nb, nc, nd), nrow=2)
pfis[i] = fisher.test(a)$p.value
pchi[i] = chisq.test(a, correct=FALSE)$p.value
pchic[i] = chisq.test(a, correct=TRUE)$p.value
}
plot(ecdf(pfis),asp=1,xlab="",ylab="",xlim=c(0,1),ylim=c(0,1),
verticals=TRUE,main="ECDF for fisher.test()")
abline(0,1)
条件付きの場合は上の k = ... を次のようにします:
k = sample(c(rep(1,15),rep(3,35))) + sample(c(rep(0,20),rep(1,30)))
Last modified: 2009-05-17 11:12:13