Rで オッズ比 を確認します。
本ポストはこちらの続きです。

1. オッズ比(Odds Ratio)とは
オッズ比(Odds Ratio, OR)は、ある事象が起こる「オッズ」が、異なる2つの群でどの程度異なるかを示す指標です。特に、症例対照研究(ケース・コントロール研究)において、ある要因への暴露と疾病の関連を評価するためによく用いられます。
オッズとは?
まず、「オッズ(Odds)」を理解する必要があります。オッズは、ある事象が起こる確率と起こらない確率の比で定義されます。
ある事象が起こる確率を \(p\) とすると、起こらない確率は \(1-p\) となります。このとき、オッズは以下のように計算されます。
\[
\text{オッズ} = \dfrac{p}{1-p}
\]
例えば、確率が50%(\(p=0.5\))ならオッズは \(0.5 / (1-0.5) = 1\) です。確率が20%(\(p=0.2\))ならオッズは \(0.2 / (1-0.2) = 0.25\) となります。
オッズ比の計算
相対危険度と同様に、2x2の分割表を考えます。
イベント発生 | イベント非発生 | |
---|---|---|
暴露群 | a | b |
非暴露群 | c | d |
この表を用いて、各群におけるイベント発生のオッズを計算します。
- 暴露群のオッズ (\(Odds_E\)): 暴露群の中で、イベントが起こる確率 \(p_E = \dfrac{a}{a+b}\) と、起こらない確率 \(1-p_E = \dfrac{b}{a+b}\) の比です。 \[
Odds_E = \dfrac{\dfrac{a}{a+b}}{\dfrac{b}{a+b}} = \dfrac{a}{b}
\] - 非暴露群のオッズ (\(Odds_{NE}\)): 非暴露群の中で、イベントが起こる確率 \(p_{NE} = \dfrac{c}{c+d}\) と、起こらない確率 \(1-p_{NE} = \dfrac{d}{c+d}\) の比です。 \[
Odds_{NE} = \dfrac{\dfrac{c}{c+d}}{\dfrac{d}{c+d}} = \dfrac{c}{d}
\]
オッズ比(OR)は、これら2つのオッズの比として定義されます。
\[
OR = \dfrac{Odds_E}{Odds_{NE}} = \dfrac{\dfrac{a}{b}}{\dfrac{c}{d}} = \dfrac{ad}{bc}
\]
オッズ比は、この ad/bc
という単純な交差積の形で計算できます。
オッズ比の解釈
解釈の方向性は相対危険度と似ています。
- OR > 1: 暴露群は非暴露群に比べて、イベント発生のオッズが高い(その要因は危険因子である可能性)。
- OR = 1: 暴露の有無は、イベント発生のオッズに関係しない(その要因はリスクと無関係)。
- OR < 1: 暴露群は非暴露群に比べて、イベント発生のオッズが低い(その要因は予防因子である可能性)。
例えば、ORが3.0の場合、「暴露群は非暴露群に比べて、イベントが発生するオッズが3倍である」と解釈します。
重要な注意点: オッズ比は相対危険度の近似値として用いられることがあります。特に、対象となるイベント(疾病など)の発生率が非常に低い場合、オッズ比と相対危険度の値は近くなります。
2. シミュレーションのためのシナリオ
「症例対照研究(ケース・コントロール研究)」のシナリオを作成します。
シナリオ:喫煙習慣と肺がん発症の関連を調べる症例対照研究
ある地域の病院で、肺がんの発症と過去の喫煙習慣との関連を調べるための症例対照研究が計画されました。
- 研究のデザイン: 症例対照研究では、まず結論(肺がんか否か)が分かっている人たちを集め、その人たちの過去の要因(喫煙習慣)を遡って調査します。
- 研究の目的: 肺がん患者(症例群)は、肺がんでない人(対照群)に比べて、過去に喫煙習慣があったオッズがどの程度高いかを評価する。
- 対象者:
- 症例群(ケース群): 新たに肺がんと診断された患者 500人。
- 対照群(コントロール群): 年齢や性別を症例群とマッチさせた、肺がんでない外来患者 500人。
- 調査項目(暴露要因): 対象者全員に、過去の喫煙習慣の有無を聴取する。
- 仮説(シミュレーションの真の値): このシミュレーションでは、あらかじめ「真実」の値を設定します。
- 対照群(非肺がん)における喫煙者の「真の確率」: 25%
- この群の喫煙オッズは、\(0.25 / (1 - 0.25) = 0.333...\)
- 症例群(肺がん)における喫煙者の「真の確率」: 60%
- この群の喫煙オッズは、\(0.60 / (1 - 0.60) = 1.5\)
- したがって、このシナリオにおける「真のオッズ比」は、\(1.5 / 0.333... = \bf{4.5}\) です。
- 対照群(非肺がん)における喫煙者の「真の確率」: 25%
シミュレーションの目的は、この設定に基づいてランダムなデータを生成し、そのデータから計算される「標本のオッズ比」が、設定した「真のオッズ比(4.5)」にどれだけ近くなるかを確認することです。
3. R言語によるシミュレーションコード
上記のシナリオに沿って、R言語でシミュレーションを行い、オッズ比を計算します。
# 必要なライブラリの読み込み
library(tidyverse)
# 再現性のための乱数シード固定
<- 20250803
seed set.seed(seed)
# --- 1. シミュレーションの設定 ---
cat("--- シナリオ設定 ---\n\n")
<- 500 # 症例群(肺がん患者)の人数
n_case <- 500 # 対照群(非肺がん)の人数
n_control
# シナリオで設定した「真の確率」(各群における喫煙者の割合)
<- 0.60 # 症例群における喫煙者の真の確率
prob_smoking_case <- 0.25 # 対照群における喫煙者の真の確率
prob_smoking_control
# 「真のオッズ」を計算
<- prob_smoking_case / (1 - prob_smoking_case)
odds_case_true <- prob_smoking_control / (1 - prob_smoking_control)
odds_control_true
# 「真のオッズ比」
<- odds_case_true / odds_control_true
or_true cat(paste0("参加者数: 症例群=", n_case, "人, 対照群=", n_control, "人\n"))
cat(paste0("真の喫煙者率: 症例群=", prob_smoking_case * 100, "%, 対照群=", prob_smoking_control * 100, "%\n"))
cat(paste0("真のオッズ比 (OR): ", or_true, "\n\n"))
# --- 2. データの生成 ---
# rbinom関数を使い、各群の参加者が喫煙者(1)か非喫煙者(0)かをシミュレート
<- rbinom(n = n_case, size = 1, prob = prob_smoking_case)
smoking_status_case <- rbinom(n = n_control, size = 1, prob = prob_smoking_control)
smoking_status_control
# --- 3. 集計(2x2分割表の作成)---
cat("--- シミュレーション結果 ---\n\n")
# a: 症例群で喫煙者
<- sum(smoking_status_case == 1)
a # b: 症例群で非喫煙者
<- n_case - a
b # c: 対照群で喫煙者
<- sum(smoking_status_control == 1)
c # d: 対照群で非喫煙者
<- n_control - c
d
# 分割表をデータフレームで作成して表示
# 注:症例対照研究では、通常「症例/対照」を縦軸、「暴露」を横軸に置きます。
<- tibble(
contingency_table = c("症例群 (肺がん)", "対照群 (非肺がん)"),
群 = c(a, c),
喫煙者 = c(b, d),
非喫煙者 = c(a + b, c + d)
合計
)cat("生成されたデータの2x2分割表:\n")
print(contingency_table)
cat("\n")
# --- 4. 標本データからオッズ比を計算 ---
# 標本における各群の喫煙オッズを計算
<- a / b
odds_case_sample <- c / d
odds_control_sample
# 標本のオッズ比 (Sample OR)
# or_sample <- odds_case_sample / odds_control_sample と同じ
<- (a * d) / (b * c)
or_sample
cat(paste0("標本から計算された喫煙のオッズ:\n"))
cat(paste0(" 症例群: ", round(odds_case_sample, 2), "\n"))
cat(paste0(" 対照群: ", round(odds_control_sample, 2), "\n\n"))
cat(paste0("標本から計算されたオッズ比 (OR): ", round(or_sample, 2), "\n"))
cat("「肺がん患者は、そうでない人に比べて、喫煙者であるオッズが約", round(or_sample, 2), "倍高い」と解釈できます(真のオッズ比(4.5)に近い値となっています)。\n")
--- シナリオ設定 ---
参加者数: 症例群=500人, 対照群=500人
真の喫煙者率: 症例群=60%, 対照群=25%
真のオッズ比 (OR): 4.5
--- シミュレーション結果 ---
生成されたデータの2x2分割表:
# A tibble: 2 × 4
群 喫煙者 非喫煙者 合計
<chr> <int> <dbl> <dbl>
1 症例群 (肺がん) 318 182 500
2 対照群 (非肺がん) 135 365 500
標本から計算された喫煙のオッズ:
症例群: 1.75
対照群: 0.37
標本から計算されたオッズ比 (OR): 4.72
「肺がん患者は、そうでない人に比べて、喫煙者であるオッズが約 4.72 倍高い」と解釈できます(真のオッズ比(4.5)に近い値となっています)。
以上です。