統計ER

統計ソフトRの使い方を中心に、統計解析方法の解説をするブログ。ありそうでなかなか見つからないサンプルサイズ計算などニッチな方法について紹介しています。

EZRのFisherの正確検定でオッズ比を計算するとオッズ比が違う件

Toukei Consul Banner

KH Coder Consul Banner

EZRのFisherの正確検定の関数でオッズ比を計算すると、通常のオッズ比と異なる数値が計算される。

これはなぜなのか?

どう考えたらよいか?

EZRのFisherの正確検定を使わないオッズ比の計算

オッズ比は、通常は以下のような分割表だった場合、 \frac{a/c}{b/d}と計算する。

f:id:toukeier:20210911200359p:plain
2x2分割表

a=80, b=20, c=50, d=50だったとすれば、オッズ比は、 \frac{80/50}{20/50} = 4 と計算される。

EZRのFisherの正確検定を使った場合のオッズ比の計算

統計ソフトRのFisherの正確検定を使った場合、このオッズ比が以下のように3.97となる。これはいったいどういうことだろうか?

f:id:toukeier:20210912191459p:plain
「統計解析」→「名義変数の解析」→「分割表の直接入力と解析」

f:id:toukeier:20210912193513p:plain
分割表に直接数値を入力しOKをクリック!

> fisher.test(.Table)

    Fisher's Exact Test for Count Data

data:  .Table
p-value = 0.00001389
alternative hypothesis: true odds ratio is not equal to 1
95 percent confidence interval:
 2.049148 7.919959
sample estimates:
odds ratio 
  3.970815

EZRのFisherの正確検定で使っているオッズ比の計算方法

これは、EZRのFisherの正確検定で使っているオッズ比計算の方法が、単純なオッズ比計算とは異なるからだ。

条件付き最尤推定量(Conditional Maximum Likelihood Estimate)を計算しているので、サンプルから単純に計算するオッズ比と異なることになる。

通常計算する単純なオッズ比は、条件なしの最尤推定量(Unconditional Maximum Likelihood Estimate)で、このオッズ比はWaldのオッズ比とも呼ばれる。

今回の2x2のデータが得られたという条件で、最尤推定量を求めているのがFisherのオッズ比なのである。

三重大学名誉教授の奥村先生の説明はとてもわかりやすいので、ぜひ一読を。下段の「オッズ比」というセクションが該当箇所。

Fisherの正確検定

ちなみに、最尤推定量というのは、ある現象をモデル化し、(今回は2x2の分割表なので、二項分布でモデル化し、)得られたデータからそのモデルの尤度(もっともらしさ)が最大になるようにしたときのパラメータのことを言う。その最尤推定量を求める際に、条件を付けたということ。

参考:尤度とは?

toukeier.hatenablog.com

EZRでFisherのオッズ比でないオッズ比を求めるには?

epitools パッケージをインストールして、oddsratio.wald() を使うとよい。

Rスクリプトの窓に以下のように書いて、インストールして、パッケージを使えるようにする。

install.packages("epitools") #一回のみ。実行するとパッケージデータを取得するサーバーを選ぶ窓が開くのでJapanを選択。
library(epitools) #パッケージ使用時に事前に一回実行。

先ほどの結果を一部流用して、Waldのオッズ比(通常のオッズ比)を計算してみると以下のようになる。odds ratioとある個所のestimateが4になっているのがわかる。

> oddsratio.wald(.Table)
$data
        1  2 Total
1      80 20   100
2      50 50   100
Total 130 70   200

$measure
                        NA
odds ratio with 95% C.I. estimate    lower   upper
                       1        1       NA      NA
                       2        4 2.135711 7.49165

$p.value
         NA
two-sided   midp.exact  fisher.exact     chi.square
        1           NA            NA             NA
        2 0.0000085777 0.00001388917 0.000008687712

$correction
[1] FALSE

attr(,"method")
[1] "Unconditional MLE & normal approximation (Wald) CI"

このパッケージを使って、Fisherのオッズ比を計算してみる場合は、oddsratio.fisher() を使う。fisher.test() と同じ結果であることがわかる。

> oddsratio.fisher(.Table)
$data
        1  2 Total
1      80 20   100
2      50 50   100
Total 130 70   200

$measure
                        NA
odds ratio with 95% C.I. estimate    lower    upper
                       1 1.000000       NA       NA
                       2 3.970815 2.049148 7.919959

$p.value
         NA
two-sided   midp.exact  fisher.exact     chi.square
        1           NA            NA             NA
        2 0.0000085777 0.00001388917 0.000008687712

$correction
[1] FALSE

attr(,"method")
[1] "Conditional MLE & exact CI from 'fisher.test'"

まとめ

EZRで、Fisherの正確検定を使ってオッズ比を計算すると、手計算で行ったオッズ比と異なる数値が示されるが、それはなぜかという話をした。

通常計算しているオッズ比は、条件なしの最尤推定量(Unconditional Maximum Likelihood Estimate)であり、fisher.test()で計算されるオッズ比は、条件付き最尤推定量(Conditional Maximum Likelihood Estimate)であるため、数値が異なる。

どちらを使っているかを断れば、どちらを使っても間違いではないと言える。