ぼやかないつもりのメモ(ブログ Ver)

つぶやきとメモの記録。更新はぼちぼち。

オッズ比とその信頼区間

Rでオッズ比とその信頼区間を求めるのには、少し手間がかかる。群馬大の青木先生のR -- オッズ比には青木先生の自作関数を含め3つの方法が記されていた。同じく群馬大の中澤先生の「Rによる保健医療データ解析演習 」には、中澤先生の自作関数を含め5つの方法が記されている。以下の例を参考にいくつかの方法をメモしておく。

疾患あり 疾患なし
曝露あり 120 40
曝露なし 80 60

青木先生の関数を使う

R -- オッズ比にあるodds.ratio()関数をコピペし、使用法に従う。この場合は以下のようにすればよい。

odds.ratio <- function( a, b, c, d,             # 4 つのセルの観察値
                        correct=FALSE)          # 補正をするとき TRUE にする
{
        cl <- function(x)
        {
                or*exp(c(1, -1)*qnorm(x)*sqrt(1/a+1/b+1/c+1/d))
        }
        if (correct || a*b*c*d == 0) {          # a,b,c,d のいずれかが 0 のときには必ず補正する
                a <- a+0.5
                b <- b+0.5
                c <- c+0.5
                d <- d+0.5
        }
        or <- a*d/(b*c)
        conf <- rbind(cl90=cl(0.05), cl95=cl(0.025), cl99=cl(0.005), cl999=cl(0.0005))
        conf <- data.frame(conf)
        colnames(conf) <- paste(c("下側","上側"), "信頼限界値", sep="")
        rownames(conf) <- paste(c(90, 95, 99, 99.9), "%信頼区間", sep="")
        list(or=or, conf=conf)
}
R -- オッズ比
odds.ratio(120, 40, 80, 60, correct=FALSE)
$or
[1] 2.25

$conf
              下側信頼限界値 上側信頼限界値
90%信頼区間        1.4914023       3.394456
95%信頼区間        1.3784218       3.672678
99%信頼区間        1.1817222       4.284002
99.9%信頼区間      0.9883667       5.122087

中澤先生のoddsratio2()関数を使う

中澤先生の場合は、.Rファイルにて公開してくれているので、source()関数を使うことで利用できる。ただし、青木先生とは入力の順番が違うので注意した方がよい*1

source("http://phi.med.gunma-u.ac.jp/msb/c10-5.R")
oddsratio2(120, 80, 40, 60)
> oddsratio2(120, 80, 40, 60)
       疾病あり 疾病なし 合計
曝露群      120       40  160
対照群       80       60  140
合計        200      100  300
オッズ比の点推定量: 2.25  (p= 0.001083837 ) 95%信頼区間 = [ 1.378422 , 3.672678 ]

vcdライブラリのoddsratio()関数を使う

この方法からは、以下のように分割表を作成して使う。vcdライブラリのoddsratio()関数は、青木先生が書かれたころより少し変更が加わったようでsummary()しても信頼区間は表示されない。ヘルプを読むとconfint()してあげる必要があるようだ。

library(vcd)
x <- matrix(c(120, 40, 80, 60), byrow=TRUE, nc=2)
y <- oddsratio(x, log=F)
summary(y)
confint(y)
> summary(y)
     Odds Ratio
[1,]       2.25
> confint(y)
          lwr      upr
[1,] 1.381450 3.664627

fisher.test()関数を使う

これは以前から知っていたが、どうやらオッズ比は推定量で、信頼区間は少し広くなるようだ。

fisher.test(x)
        Fisher's Exact Test for Count Data

data:  x 
p-value = 0.001372
alternative hypothesis: true odds ratio is not equal to 1 
95 percent confidence interval:
 1.339755 3.788809 
sample estimates:
odds ratio 
  2.243767 

*1:もちろん、同じ結果が返ってくるが。