カイ二乗検定、Fisherの正確検定をRで実施する
はじめに
今回は、以前紹介した(Pearsonの)カイ二乗検定とFisherの正確検定をRで実施してみることにする。
mstour.hatenablog.com
mstour.hatenablog.com
実施例として、分割表の検定について検討したPrescott(2019)[1]に掲載の例(原論文はHeschl et al.(2018)[2])を用いることにする。これは、外傷性脳損傷を負ったこどもに迅速導入気管挿管(RSI)(参考:RSIかDSIか、気管挿管|臨床賛否両論 - m3.comの医療コラム)を行った場合と行わなかった場合との6ヶ月後の転帰を比較した結果である。
結果は以下の表にまとめられる。なお、よい結果・悪い結果というのはModified Glasgow Outcome Scoreという障害の程度を表すスコアに基づいて定義したそうだ。
RSIあり | RSIなし | 合計 | |
よい結果 | 31 | 1 | 32 |
悪い結果 | 16 | 5 | 21 |
合計 | 47 | 6 | 53 |
まずはこのデータをRで作成しておこう。
#----- データ作成 ----- outcome = c(rep("good", 32), rep("bad", 21)) RSI = c(rep("y", 31), rep("n", 1), rep("y", 16), rep("n", 5)) df = data.frame(outcome = outcome, RSI = RSI) addmargins(table(df))
出力される分割表は以下の通り。項目の順番を並べ替えるのはできなくはないが、ここではそこまで本質的な問題ではないのでやらない。
RSI outcome n y Sum bad 5 16 21 good 1 31 32 Sum 6 47 53
カイ二乗検定
RSIを行う場合と行わない場合とでよい結果になる確率が変わってくるかどうか、まずはカイ二乗検定で評価する。基本機能のchisq.testという関数で実行できる(chisq.test function | R Documentation)。
chisq.test(x = df$outcome, y = df$RSI, correct = F)
xとyに、関連を見たい2つの変数を入力する。correctでは、「Yatesの連続補正」をするかどうかを設定する。デフォルトでは補正をすることになっているのだが、実はこれはFisherの正確検定の近似として考案されたものなので、通常のカイ二乗検定をやりたい場合にはcorrect = Fとしておく(さらに言えば、Fisherの正確検定を実行できる環境にあれば最初からそちらをやった方がいい)。結果は以下のようになる。
カイ自乗近似は不正確かもしれません Pearson's Chi-squared test data: df$outcome and df$RSI X-squared = 5.4036, df = 1, p-value = 0.02009
カイ二乗統計量は5.4036、p値は0.02009となった。
「カイ自乗近似は不正確かもしれません」というのは、分割表のセルの期待度数に小さいものがある場合の警告と思われる(後述)。correct = Tにした場合は以下のようになる。
カイ自乗近似は不正確かもしれません Pearson's Chi-squared test with Yates' continuity correction data: df$outcome and df$RSI X-squared = 3.5397, df = 1, p-value = 0.05992
p値は0.05992とかなり大きくなった。一般に連続補正を行うと統計的有意になりにくくなる(検出力が落ちる)。
Fisherの正確検定
続いてFisherの正確検定を実施してみる。これも基本機能のfisher.testで行うことができる(fisher.test function | R Documentation)。
fisher.test(x = df$outcome, y = df$RSI)
結果は次のようになる。
Fisher's Exact Test for Count Data data: df$outcome and df$RSI p-value = 0.03073 alternative hypothesis: true odds ratio is not equal to 1 95 percent confidence interval: 0.9276154 471.2539581 sample estimates: odds ratio 9.281597
デフォルトでは両側検定を行うが、alternative = "greater"(または"less")で上側(または下側)の検定もできる。両側検定の場合のp値は、「帰無仮説のもとで今回のデータが得られる確率」よりも得られる確率が小さいパターンの確率をすべて足したものが計算される(ちょっとわかりにくいけれど、確率分布の端にいけばいくほど確率が小さくなるので、確率の小さい右端・左端を足し合わせていくイメージである)。p値は0.03073であり、カイ二乗検定よりも大きくなった。
両側検定の場合に表示される対立仮説「true odds ratio is not equal to 1」は、RSIありとRSIなしとでよい結果になるオッズが異なるということを意味し、これはよい結果になる確率が2グループで異なることと同じ意味である。「95 percent confidence interval」にオッズ比の95%信頼区間、「sample estimates」にオッズ比の推定値が計算されている。これらは「分割表の行と列の合計を固定した時の尤度」である条件付き尤度を最大化して得られる値である。なお、条件付き尤度は、オッズ比を非心パラメータとする非心超幾何分布と呼ばれるものになる。
余談
実はこのデータは、「RSIありとRSIなしとではよい結果になる確率は同じ」という帰無仮説のもとで計算されるセルの度数の期待値が最小で2.4になる()。よく言われる、期待度数が5未満になるセルがある場合にはカイ二乗検定を使わない方がいい、というケースである。教科書ではたいてい「期待度数が5未満になる時には、カイ二乗統計量の近似が悪くなる」くらいしか書かれていないのだけれど、このような時にカイ二乗検定を用いると第一種の過誤(Type1 error)が増大する、つまり間違って帰無仮説を棄却する可能性が高くなると言われている(例えばCampbell(2007)[3])。一方でFisherの正確検定はカイ二乗検定よりも検出力が低下することはよく知られている。この問題については色々と議論があるし実務上も頭を悩ませがちなので、また改めて書いてみたいと思う。
まとめ
カイ二乗検定とFisherの正確検定をRで実施する方法を紹介した。実行するのは大した作業ではないが、とりあえず自分で手を動かして計算してみるのが大事だと思う。
参考文献
[1] Prescott RJ. Two-tailed significance tests for 2 × 2 contingency tables: What is the alternative? Statistics in Medicine. 2019;38:4264–4269.
[2] Heschl S, Medley B, Andrew E, Butt W, Bernard S, Smith K. Efficacy of pre-hospital rapid sequence intubation in paediatric traumatic brain injury: a 9-year observational study. Injury. 2018;49:916-920.
[3] Campbell I. Chi-squared and Fisher–Irwin tests of two-by-two tables with small sample recommendations. Statistics in Medicine. 2007; 26:3661–3675.