scipy.stats: Fisher の正確検定 fisher_exact <-- 使うな!!
この際,はっきり言おう。
Fisher の正確検定は,決して使ってはいけない。
そもそも,Fisher の正確検定の前提は,実際に使われている場面とかけ離れている。
代替案というか,Fisher の正確検定を使わないで,「連続性の補正をしない$\chi^2$検定を使いなさい」ということに尽きるようだ。
それを受け入れられない人は,いろいろ自分で調べてみよう。その上で使いたい場合は自己責任でどうぞ。
ということで,以下は読む必要なし。
fisher_exact(table, alternative='two-sided')
引数には 2×2 分割表を与える。デフォルトで両側検定である(alternative='two-sided'
。他に 'less'
,’greater'
が指定できる)。
戻り値は「オッズ比」と 2 変数が独立であるという検定結果(両側検定)の $p$ 値である。
以下の分割表について検定する。
import numpy as np
tbl = np.array([[15, 9], [9, 18]])
from scipy.stats import fisher_exact
fisher_exact(tbl)
(3.3333333333333335, 0.051250670703359466)
オッズ比は以下のように計算される。
odds_ratio = (tbl[0,0] * tbl[1,1]) / (tbl[0,1] * tbl[1,0])
print(f"オッズ比 = {odds_ratio}")
オッズ比 = 3.3333333333333335
fisher_exact より優れているという,2 つの検定法が実装されている。詳しくは,自分で調べてみよう。
確かに,この例では,Fisher の正確検定では有意でない場合でも,以下の 2 つの検定では有意となっている。つまり,検定力が高い(強い)ということである。
ただ,広く知られていないということは確かである。影の実力者なのか,口ほどにもないということなのか。そのへんの情報も少ない。
まあ,使わなくても良いということなのだろう。
ちなみに, R で実装されている `exact.test` はオプションがたくさんあるのだが,どれとも結果が一致しないのはなぜだろう(理解不足か?)。
from scipy.stats import barnard_exact
barnard_exact(tbl)
BarnardExactResult(statistic=2.082916624991665, pvalue=0.03991921726930299)
from scipy.stats import boschloo_exact
boschloo_exact(tbl)
BoschlooExactResult(statistic=0.03533077208146509, pvalue=0.04273122668534922)