Rで相対危険度(リスク比)

Rで 相対危険度(リスク比) を確認します。

1. 相対危険度(リスク比)のとは

相対危険度(Relative Risk, RR)は、リスク比(Risk Ratio)とも呼ばれ、ある要因に「暴露された群」と「暴露されなかった群」とで、特定の事象(例:疾病の発症)が起こる確率を比較するための指標です。主にコホート研究やランダム化比較試験で用いられます。

2つの群と2つの結果(イベント発生/非発生)をまとめた、以下のような2x2の分割表を考えます。

イベント発生イベント非発生合計
暴露群aba+b
非暴露群cdc+d

この表を用いて、各群におけるイベントの発生リスクを計算します。

  • 暴露群のリスク (\(R_E\)): 暴露群におけるイベントの発生確率です。 \[
    R_E = \dfrac{a}{a+b}
    \]

  • 非暴露群のリスク (\(R_{NE}\)): 非暴露群におけるイベントの発生確率です。 \[
    R_{NE} = \dfrac{c}{c+d}
    \]

相対危険度(RR)は、これら2つのリスクの比として定義されます。

\[
RR = \dfrac{R_E}{R_{NE}} = \dfrac{\dfrac{a}{a+b}}{\dfrac{c}{c+d}}
\]

相対危険度の解釈

  • RR > 1: 暴露群は非暴露群に比べて、イベント発生リスクが高いことを示します(その要因は危険因子である可能性)。
  • RR = 1: 暴露の有無は、イベント発生リスクに関係しないことを示します(その要因はリスクと無関係)。
  • RR < 1: 暴露群は非暴露群に比べて、イベント発生リスクが低いことを示します(その要因は予防因子である可能性)。

例えば、RRが2.0の場合、「暴露群は非暴露群に比べて、イベントが発生するリスクが2倍である」と解釈できます。


2. シミュレーションのためのシナリオ

シナリオ:新開発の風邪薬「スッキリノン」の副作用(眠気)に関する臨床試験

製薬会社が新しい風邪薬「スッキリノン」を開発しました。この薬の効果は高いものの、副作用として「眠気」が報告される可能性があります。この副作用のリスクを評価するため、ランダム化比較試験を行いました。

  • 研究の目的: 風邪薬「スッキリノン」を服用することが、プラセボ(偽薬)を服用する場合に比べて、眠気の副作用を引き起こすリスクをどの程度変化させるかを評価する。
  • 対象者: 風邪の初期症状を持つ2000人の患者。
  • グループ分け:

    • 暴露群(スッキリノン群): 1000人の患者に「スッキリノン」を投与する。
    • 非暴露群(プラセボ群): 1000人の患者に、有効成分の入っていないプラセボ(偽薬)を投与する。
  • 評価項目(イベント): 服用後3時間以内に「眠気を感じた」かどうかを記録する。
  • 仮説(シミュレーションの真の値): このシミュレーションでは、あらかじめ「真実」の値を設定します。

    • プラセボ群で眠気を感じる真のリスク (\(R_{NE}\)): 15%
    • スッキリノンは、プラセボに比べて眠気のリスクを 2.5倍 にする。
    • したがって、スッキリノン群で眠気を感じる真のリスク (\(R_E\)) は、\(15\% \times 2.5 = 37.5\%\) となる。
    • このシナリオにおける「真の相対危険度」は 2.5 です。

シミュレーションの目的は、この設定に基づいてランダムなデータを生成し、そのデータから計算される「標本の相対危険度」が、設定した「真の相対危険度(2.5)」にどれだけ近くなるかを確認することです。


3. R言語によるシミュレーションコード

上記のシナリオに沿って、R言語でシミュレーションを行い、相対危険度を計算し、結果を可視化します。

# 必要なライブラリの読み込み
library(tidyverse)

# 再現性のための乱数シード固定
seed <- 20250803
set.seed(seed)

# --- 1. シミュレーションの設定 ---
cat("--- シナリオ設定 ---\n\n")
n_sukkinon <- 1000 # スッキリノン群の参加者数
n_placebo <- 1000 # プラセボ群の参加者数

# シナリオで設定した「真のリスク」
risk_sukkinon_true <- 0.375 # スッキリノン群の真の眠気リスク (15% * 2.5)
risk_placebo_true <- 0.150 # プラセボ群の真の眠気リスク

# 「真の相対危険度」
rr_true <- risk_sukkinon_true / risk_placebo_true
cat(paste0("参加者数: スッキリノン群=", n_sukkinon, "人, プラセボ群=", n_placebo, "人\n"))
cat(paste0("真の眠気リスク: スッキリノン群=", risk_sukkinon_true * 100, "%, プラセボ群=", risk_placebo_true * 100, "%\n"))
cat(paste0("真の相対危険度 (RR): ", rr_true, "\n\n"))


# --- 2. データの生成 ---
# rbinom関数を使い、各参加者が眠気を感じた(1)か感じなかった(0)かをシミュレート
# size=1は、各参加者に対して1回の試行(ベルヌーイ試行)を意味する
outcome_sukkinon <- rbinom(n = n_sukkinon, size = 1, prob = risk_sukkinon_true)
outcome_placebo <- rbinom(n = n_placebo, size = 1, prob = risk_placebo_true)


# --- 3. 集計(2x2分割表の作成)---
cat("--- シミュレーション結果 ---\n\n")
# a: スッキリノン群で眠気あり
a <- sum(outcome_sukkinon == 1)
# b: スッキリノン群で眠気なし
b <- n_sukkinon - a
# c: プラセbo群で眠気あり
c <- sum(outcome_placebo == 1)
# d: プラセボ群で眠気なし
d <- n_placebo - c

# 分割表をデータフレームで作成して表示
contingency_table <- tibble(
= c("スッキリノン群 (暴露群)", "プラセボ群 (非暴露群)"),
  眠気あり = c(a, c),
  眠気なし = c(b, d),
  合計 = c(a + b, c + d)
)
cat("生成されたデータの2x2分割表:\n")
print(contingency_table)
cat("\n")


# --- 4. 標本データから相対危険度を計算 ---
# 標本における各群のリスクを計算
risk_sukkinon_sample <- a / (a + b)
risk_placebo_sample <- c / (c + d)

# 標本の相対危険度 (Sample RR)
rr_sample <- risk_sukkinon_sample / risk_placebo_sample

cat(paste0("標本から計算された眠気リスク:\n"))
cat(paste0("  スッキリノン群: ", round(risk_sukkinon_sample * 100, 1), "%\n"))
cat(paste0("  プラセボ群: ", round(risk_placebo_sample * 100, 1), "%\n\n"))
cat(paste0("標本から計算された相対危険度 (RR): ", round(rr_sample, 2), "\n"))
cat("「スッキリノンを服用すると、プラセボに比べて眠気のリスクが約", round(rr_sample, 2), "倍になる」と解釈できます(真の相対危険度(2.5)に近い値となっています)。\n")
--- シナリオ設定 ---

参加者数: スッキリノン群=1000人, プラセボ群=1000人
真の眠気リスク: スッキリノン群=37.5%, プラセボ群=15%
真の相対危険度 (RR): 2.5

--- シミュレーション結果 ---

生成されたデータの2x2分割表:
# A tibble: 2 × 4
  群                      眠気あり 眠気なし  合計
  <chr>                      <int>    <dbl> <dbl>
1 スッキリノン群 (暴露群)      366      634  1000
2 プラセボ群 (非暴露群)        163      837  1000

標本から計算された眠気リスク:
  スッキリノン群: 36.6%
  プラセボ群: 16.3%

標本から計算された相対危険度 (RR): 2.25
「スッキリノンを服用すると、プラセボに比べて眠気のリスクが約 2.25 倍になる」と解釈できます(真の相対危険度(2.5)に近い値となっています)。

以上です。