リスク比とオッズ比

リスク比とオッズ比についてまとめておきます。

データの読み込みと準備

R Console

> Titanic # 毎度お馴染みのTitanicのデータ
, , Age = Child, Survived = No

      Sex
Class  Male Female
  1st     0      0
  2nd     0      0
  3rd    35     17
  Crew    0      0

, , Age = Adult, Survived = No

      Sex
Class  Male Female
  1st   118      4
  2nd   154     13
  3rd   387     89
  Crew  670      3

, , Age = Child, Survived = Yes

      Sex
Class  Male Female
  1st     5      1
  2nd    11     13
  3rd    13     14
  Crew    0      0

, , Age = Adult, Survived = Yes

      Sex
Class  Male Female
  1st    57    140
  2nd    14     80
  3rd    75     76
  Crew  192     20

> x <- data.frame(Titanic) # Titanicのデータをデータフレーム型式に変換して、xに指定。 
> y <- data.frame( Class=rep(x$Class, x$Freq), Sex=rep(x$Sex, x$Freq), Age=rep(x$Age, x$Freq), Survived=rep(x$Survived, x$Freq)) 
> head(y) # rep関数はrep(x,y)でxをy個繰り返すというように記述する。Freuに記載されている数だけその行の要素を繰り返すベクトルを作成し、data.frame型にまとめ、yに指定。
  Class  Sex   Age Survived
1   3rd Male Child       No
2   3rd Male Child       No
3   3rd Male Child       No
4   3rd Male Child       No
5   3rd Male Child       No
6   3rd Male Child       No
> t <- table(y$Age, y$Survived) # 年齢(AdultかChild)、生死(No:死亡、Yes:生存)を抽出して2×2分割表で表す。
> t
      No   Yes
Child 52   57
Adult 1438 654

 

リスク比とオッズ比の計算

まず、分割表を書く場合には行に原因を配置し、列に結果を配置します。

結果
あり なし
原因 あり a b
なし c d

リスク比について

原因ありのリスク=a/(a+b)と計算します。原因ありで結果ありであった数を原因ありの合計で割ります。

原因なしのリスク=c/(c+d)と計算します。原因なしで結果ありであった数を原因なしの合計で割ります。

リスク差(Risk Difference)=原因ありのリスク-原因なしのリスクで計算します。

リスク比(Risk Ratio)=原因ありのリスク/原因なしのリスクで計算します。

オッズ比について

結果ありのオッズ=a/cと計算します。結果ありに着目したときの原因なしに対する原因ありの比率です。

結果なしのオッズ=b/dと計算します。結果なしに着目したときの原因なしに対する原因ありの比率です。

そして、

オッズ比(Odds Ratio)=結果ありのオッズ/結果なしのオッズで計算します。

リスク比とオッズ比

結果が生じる強さを表現するのはリスク比です。リスク比が3の場合、原因がないときと比べて原因があると結果が3倍生じやすくなると言えます。しかし、オッズ比が3の場合、そういう表現は間違いです。ただし、複数の原因が結果に影響しているとき、リスク比でもオッズ比でも原因による影響の大きさの順位は同じになるので、そいういう意味ではオッズ比は役に立ちます。つまり、「オッズ比は、複数の影響要因の寄与順位を把握することのみに活用でき、リスクの倍率把握には適用できない」[1]ということになります。

それから、コホート研究ではリスク比が、ケースコントロール研究ではオッズ比が使われます。コホート研究でオッズ比を使うことはあるかもしれませんが、ケースコントロール研究にリスク比を使うことはできません。ケースコントロール研究は、ある時点での結果の有無から過去にさかのぼって原因の有無を分析する研究デザインなので、リスクを計算することは不適切なのです。

[1] 株式会社アイスタット|統計分析研究所 – リスク比とオッズ比

リスク比の計算

Titanicのデータを用いて以下のように手計算できます。

R Console

> R_Child <- t[1,1]/(t[1,1]+t[1,2]) # 子どもの死亡リスク 
> R_Child
[1] 0.4770642
> R_Adult <- t[2,1]/(t[2,1]+t[2,2]) # 大人の死亡リスク 
> R_Adult
[1] 0.6873805
> RR <- R_Adult/R_Child # 子どもに対する大人の死亡リスク比 
> RR
[1] 1.440855

オッズ比の計算

オッズ比も同様に計算します。

R Console

> O_Death <- t[1,1]/t[1,2] # 死亡に着目したときの大人に対する子どものオッズ 
> O_Death
[1] 0.9122807
> O_Alive <- t[2,1]/t[2,2] # 生存に着目したときの大人に対する子どものオッズ 
> O_Alive
[1] 2.198777
> OR <- O_Alive/O_Death # オッズ比 
> OR
[1] 2.410198

この計算の過程を見ると、オッズ比を参照して「大人は子どもより2.4倍死亡リスクが高い」というのは違和感があることが理解できると思います。

リスク比やオッズ比の95%信頼区間の計算

いくつかのパッケージを使ってリスク比やオッズ比の95%信頼区間を計算できます[1]。ここではパッケージEpiを使った方法を紹介しておきます。

R Console

> tt <- matrix(c(1438,654,52,57),nrow=2, byrow=T) # 上のリスク比の計算、オッズ比の計算の結果と合わせるために1行目と2行目を入れ替えます。
> rownames(tt) <- c("Adult","Child") 
> colnames(tt) <- c("No","Yes") 
> tt # 入れ替え完了。
        No Yes
Adult 1438 654
Child   52  57
> library(Epi) # パッケージEpiを読み込み。
> twoby2(tt) # ttのリスク比とオッズ火を計算。
2 by 2 table analysis: 
------------------------------------------------------ 
Outcome   : No 
Comparing : Adult vs. Child 

        No Yes    P(No) 95% conf. interval
Adult 1438 654   0.6874    0.6672   0.7069
Child   52  57   0.4771    0.3852   0.5705

                                   95% conf. interval
             Relative Risk: 1.4409    1.1813   1.7575
         Sample Odds Ratio: 2.4102    1.6366   3.5494
Conditional MLE Odds Ratio: 2.4091    1.6055   3.6220
    Probability difference: 0.2103    0.1152   0.3038

             Exact P-value: 0 
        Asymptotic P-value: 0 

[1] 奥村 晴彦 | Haruhiko Okumura – 2×2の表,オッズ比,相対危険度

 

調整されたリスク比、オッズ比

結果に対して複数の原因がある場合、分割表は複数に層化されたものになる。ある原因に対する結果を、他の原因による影響で調整したリスク比やオッズ比を計算する方法として、コクラン=マンテル=ヘンツェル検定[1]を用いる[2]。パッケージepiRを用います。

R Console

> x$Age <- factor(x$Age, levels = c("Adult", "Child")) # 上のリスク比の計算と同じように子どもに対する大人の死亡リスクを表すために、名義尺度の表示順を大人、子どもに変更します。 
> y <- data.frame( Class=rep(x$Class, x$Freq), Sex=rep(x$Sex, x$Freq), Age=rep(x$Age, x$Freq), Survived=rep(x$Survived, x$Freq)) # yを再構築。
> library(epiR) #パッケージepiRを読み込む。
> t_cmh <- xtabs(~ y$Age+y$Survived+y$Sex) # 関数xtabsで層化した分割表を作成。下段の関数epi.2by2を動かすために、注目する原因, 結果, 調整のための原因の順で記述する。
> epi.2by2(t_cmh)
             Outcome +    Outcome -      Total        Inc risk *        Odds
Exposed +         1438          654       2092              68.7       2.199
Exposed -           52           57        109              47.7       0.912
Total             1490          711       2201              67.7       2.096


Point estimates and 95 % CIs:
------------------------------------------------------------------- # 以下の表で(M-H)の行がMantel-Haenszel 推定量。
Inc risk ratio (crude)                       1.44 (1.18, 1.76)
Inc risk ratio (M-H)                         1.21 (1.00, 1.47) # リスク比(95%信頼区間)。
Inc risk ratio (crude:M-H)                   1.19
Odds ratio (crude)                           2.41 (1.64, 3.55)
Odds ratio (M-H)                             1.57 (1.05, 2.37) # オッズ比(95%信頼区間)。
Odds ratio (crude:M-H)                       1.53
Attrib risk (crude) *                        21.03 (11.45, 30.62)
Attrib risk (M-H) *                          10.26 (-21.45, 41.97) # リスク差(95%信頼区間)。
Attrib risk (crude:M-H)                      2.05
-------------------------------------------------------------------
 Test of homogeneity of IRR: X2 test statistic: 21.261 p-value: < 0.001
 Test of homogeneity of  OR: X2 test statistic: 18.629 p-value: < 0.001
 Wald confidence limits
 M-H: Mantel-Haenszel
 * Outcomes per 100 population units 
[1] 統計WEB – コクラン=マンテル=ヘンツェル検定 | 統計用語集 | 統計WEB

[2] R で統計解析入門  – R-stat-intro_10

 

MEMO
ちなみにパッケージepiRの関数epi.2by2は原因が3種類以上だとうまく動かないようです。順序尺度だったり、量的尺度だったりする原因で調整する場合にはロジスティック回帰分析の結果を使って計算するようなのですが、よく理解できていません。
Print Friendly, PDF & Email

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください