Fisher(フィッシャー)の正確検定(Fisher's exact test)は,分割表(クロス集計表)の各行(各列)が独立かどうかを調べる方法です。直接確率法と呼ばれることのほうが多いかもしれません。
2008年12月8日のニュースによれば,麻生内閣の支持率が前回と比べて半減しました。ネットで調べられる限りの結果を私のブログに載せました。これを見ると,20.9%から25.5%と,かなりばらつきがあります。このばらつきは偶然と考えていいでしょうか。
回答数のわかっている調査について,人数に直すと,次のような分割表(contingency table)が得られます。問題は,この表の行ごと(あるいは列ごと)の独立性の問題に焼き直すことができます(発表されているパーセント値は概数ですので,この数値は正確でないかもしれません)。
| 支持 | それ以外 | |
|---|---|---|
| 読売 | 228 | 863 |
| 毎日 | 217 | 814 |
| 朝日 | 456 | 1618 |
| NHK | 284 | 851 |
ここでは,一番違いの大きい読売とNHKに限定して考えましょう(残りは後で考えます)。
| 支持 | それ以外 | |
|---|---|---|
| 読売 | 228 | 863 |
| NHK | 284 | 851 |
これを考える前に,もっと単純な問題を考えましょう。男女各5人に意見を聞いたところ,次のように賛否が分かれました。男女で差はあるといえるでしょうか。
| 賛 | 否 | |
|---|---|---|
| 男 | 3 | 2 |
| 女 | 1 | 4 |
さらに別の問題にしてみましょう。壷の中に赤玉4個,白玉6個が入っていました。ここからランダムに5個取り出したところ,赤玉が3個,白玉が2個である確率を求めてください。
| 赤玉 | 白玉 | |
|---|---|---|
| 取り出した | 3 | 2 |
| まだ壷の中 | 1 | 4 |
10個から5個取り出す組合せは 10C5 で,そのうち赤3,白2であるのは 4C3 × 6C2 通りですから,確率は
![\[ \frac{{}_4C_3 \cdot {}_6C_2}{{}_{10}C_5} \]](mathimg/a15b4ac9e8400f60d6031c985276ab93.png)
になります。nCr
を求めるRの関数 choose() を使えば
> choose(4,3)*choose(6,2)/choose(10,5) [1] 0.2380952
のように求められます。
どの玉を取り出す確率も同じという帰無仮説のもとに,10個から5個取り出して,これ以上に珍しい事象が起こる確率(p 値)を求めましょう。まず,取り出したものの合計が5個という条件を満たす分割表をすべて挙げれば,
| 赤玉 | 白玉 | 赤玉 | 白玉 | 赤玉 | 白玉 | 赤玉 | 白玉 | 赤玉 | 白玉 | |
|---|---|---|---|---|---|---|---|---|---|---|
| 取り出した | 4 | 1 | 3 | 2 | 2 | 3 | 1 | 4 | 0 | 5 |
| まだ壷の中 | 0 | 5 | 1 | 4 | 2 | 3 | 3 | 2 | 4 | 1 |
になり,それぞれの確率をさきほどと同じ方法で求めると
になります。実際に得られた結果はこのうちの2番目の,確率 0.2380952 のものですので,「これか,これより珍しい結果」を「確率が 0.2380952 以下の結果」と解釈すれば,この5通りのうち真ん中の 0.4761905 を除いた4通りが該当します。それらを合計すると p = 0.5238 になります。
この手順をもっと簡単にしてくれるRの関数 fisher.test()
があります。この引数はこの場合2×2の行列ですので,次のように入力します。
> fisher.test(matrix(c(3,2,1,4),nrow=2)) Fisher's Exact Test for Count Data data: matrix(c(3, 2, 1, 4), nrow = 2) p-value = 0.5238 alternative hypothesis: true odds ratio is not equal to 1 95 percent confidence interval: 0.2180460 390.5629165 sample estimates: odds ratio 4.918388
この方法をフィッシャーの正確な検定(Fisher's exact test)または直接確率法といいます。
上の例では,10個のうちちょうど半分を取り出したので,分布は左右対称でしたが,10個のうち4個を取り出すことにすれば
| 赤玉 | 白玉 | 赤玉 | 白玉 | 赤玉 | 白玉 | 赤玉 | 白玉 | 赤玉 | 白玉 | |
|---|---|---|---|---|---|---|---|---|---|---|
| 取り出した | 4 | 0 | 3 | 1 | 2 | 2 | 1 | 3 | 0 | 4 |
| まだ壷の中 | 0 | 6 | 1 | 5 | 2 | 4 | 3 | 3 | 4 | 2 |
の確率は
となり,対称でなくなります。この場合,左から2番目(確率0.1142857)が実際の結果とすれば,「これか,より珍しい場合」の合計は
になります。これは両側検定ですが,片側検定なら 0.004761905 + 0.1142857 です。片側確率の2倍が両側確率にならない例の一つです。
最初の問題に戻って,読売とNHKの麻生内閣支持率の違い
| 支持 | それ以外 | |
|---|---|---|
| 読売 | 228 | 863 |
| NHK | 284 | 851 |
を検定してみましょう。
> fisher.test(matrix(c(228,863,284,851),nrow=2))
結果は p = 0.02335 で,こんな違いが偶然に生じるのは100回に2回しかないことがわかります。
Rの matrix() はオプション byrow=TRUE
を与えないと列ごとに数値を読むので,上では行と列を入れ替えた入力をしていることになりますが,縦計
a + c,b + d,横計 a + b,c + d
を固定したときに分割表
を得る確率は
![\[ \frac{{}_{a+c}C_a \cdot {}_{b+d}C_b}{{}_nC_{a+b}} = \frac{\frac{(a+c)!}{a!c!} \cdot \frac{(b+d)!}{b!d!}}{\frac{n!}{(a+b)!(c+d)!}} = \frac{(a+b)!(c+d)!(a+c)!(b+d)!}{n!a!b!c!d!} \]](mathimg/86b21c956c3fc4b3090ebbeb2527846f.png)
ですから,行と列を入れ替えても同じ結果になります。
上の式を拡張して,任意の m × n 分割表 [aij] について
![\[ \frac{(\sum_j a_{1j})! \ldots (\sum_j a_{mj})! (\sum_i a_{i1})! \ldots (\sum_i a_{in})! }{n! a_{11}! a_{12}! \ldots a_{mn}!} \]](mathimg/15f4506bf634f84770ad231aa1295277.png)
を計算することができます。元の分割表と同じ行和・列和を与えるすべての分割表について上の確率を計算し,元の分割表以下の確率の和を求めれば,任意の分割表についてフィッシャーの方法での p 値が得られます。今のコンピュータは速いので,たいていの場合に,古い χ2 検定は不要になります。
このページの最初の表の全データを入れてやってみましょう。
> fisher.test(matrix(c(228,863,217,814,456,1618,284,851),nrow=4,byrow=TRUE)) Fisher's Exact Test for Count Data data: p-value = 0.0712 alternative hypothesis: two.sided
あれあれ,読売とNHKの違いが p = 0.02335 で有意だったのに,今度は p = 0.0712 で有意ではなくなりました(というような 0.05 を境にして結果の解釈が質的に変わってしまうような言い方には問題があるのですが,いずれにしても p 値が減少してしまっています)。これは多重比較(multiple comparison)の問題といって,4行のデータ全体としてのばらつきは有意でなくても,その中から2行を選んで行う 4C2 = 6 通りの検定のうちどれかは有意になってしまうということはよくあります。7行のデータなら 7C2 = 21 通りの比較ができるので,何も違わなくても期待値として21通りのうち一つは5%水準で有意になります。多重比較には注意が必要です。
fisher.test() に workspace
というオプションにメモリの量(4バイト単位)を指定します。デフォルトは workspace = 200000 です。これ以外にもいろいろなオプションがありますので,うまくいかないときは help() で調べてください。
fisher.test() はオッズ比(odds ratio)も出力します。オッズ(odds)とは「当たりの確率」を「外れの確率」で割ったもので,オッズ比はその比です。内閣支持率の例では (354/432)/(418/370) = 0.725 がオッズ比です。分割表の縦横を入れ替えてもオッズ比は同じです。
Rの出力するオッズ比は上の定義から少し外れていますので,少し説明しておきます。a + c
個の赤玉から a 個,b + d 個の白玉から b
個を取り出す分割表
で,赤・白を取り出す確率 p,q が等しくないとし,a
の分布は
,b
の分布は
という2項分布でモデル化します。a,c
が与えられたとき,確率
を最大にするパラメータ
p を求めてみましょう。このように確率を最大にするように選んだパラメータを最尤推定量(maximum likelihood estimator,MLE)といいます。確率を p
で微分したものを 0 と置くと,
という期待通りの式が出ます。同じように白玉についても
で,両者の間に何の条件も付けなければ,オッズ比は期待通りの
という式で求められます。ここで,赤玉を a 個,白玉を b 個選ぶ確率は,積
![\[ {}_{a+c}C_a p^a(1-p)^c \times {}_{b+d}C_b q^b(1-q)^d \]](mathimg/23a8089429f1a25d837d99af924fdc79.png)
で与えられます。これはすべての可能な a,b について合計すれば1になります。これを,取り出す個数 a + b を固定したときの条件付き確率にするには,a + b を固定してすべての可能な a について合計すると1になるように比例定数を付け替えなければなりません。見通しをよくするために上の式を
![\[ {}_{a+c}C_a p^a(1-p)^{-a} \times {}_{b+d}C_b q^{-a}(1-q)^a \times (1-p)^{a+c} q^{a+b} (1-q)^{(b+d)-(a+b)} \]](mathimg/bf21b16519deba90dfdf7f4b3d1f9ceb.png)
と変形すると,最後の × 以下は定数ですので,条件付き確率は結局
![\[ \frac{{}_{a+c}C_a \cdot {}_{b+d}C_b \cdot \omega^a}{\sum\limits_a {}_{a+c}C_a \cdot {}_{b+d}C_b \cdot \omega^a} \qquad\mbox{ただし}\quad \omega = \frac{p/(1-p)}{q/(1-q)} \]](mathimg/5aa586f8edfb1f15bf6874d07cb29817.png)
になります。これを最大にする ω が,Rが出力するオッズ比です。これは a + b = 一定 という条件付きの最尤推定量(conditional MLE)です。通常はオッズ比として,条件なしの最尤推定量(unconditional MLE)である (a/b)/(c/d) を報告すればいいでしょう。
昔からいろいろ議論があるところです。昔の議論は誤解に基づくものもありましたが,今でもシミュレーションしてみてカイ2乗検定のほうがいいではないかという話がよく出ます(Fisherの正確検定かカイ2乗検定か参照)。
まずこのページの上のほうにある「壷の中に赤玉4個,白玉6個が入っていました。ここからランダムに5個取り出したところ」という問題と,その上の「男女各5人に意見を聞いたところ」という問題は,少し違うものです。壷の問題は周辺度数が固定されているので超幾何分布を使うことに異論はないでしょうけれども,男女各5人の賛否は 4:6 に固定されているわけではなく,潜在的に起こりうる事象はもっとたくさんあります。このあたりに,カイ2乗検定のほうが正確な理由があります。
同様なことをBayesianの立場から論じた論文がGelmanのブログ I hate the so-called Fisher exact test: a pointer to one of my favorite articles - Statistical Modeling, Causal Inference, and Social Science からリンクされています。
Last modified: 2009-05-17 11:52:37