ランダム化比較試験(RCT)の理論と設計

ある新薬が従来薬より効くかどうかを知りたい。ある教育プログラムが学力を向上させるかどうかを確認したい。こうした問いに対して最も信頼性の高い答えを与える方法がランダム化比較試験(Randomized Controlled Trial, RCT)です。

RCTのアイデアは驚くほど単純です。対象者をランダムに2つのグループに分け、一方に処置を施し(処置群)、もう一方には施さず(対照群)、両群のアウトカムを比較する——たったこれだけです。しかし、このシンプルな仕組みの中に、交絡バイアスを根本的に解消する深い統計学的原理が隠れています。

RCTは以下のような分野で因果推定の「ゴールドスタンダード」として位置づけられています。

  • 臨床医学: 新薬の有効性・安全性の評価(FDA承認の要件)
  • 公衆衛生: ワクチンの有効率の推定、健康介入プログラムの評価
  • テクノロジー: A/Bテストによるプロダクト改善(Google、Meta、Amazonなど)
  • 経済学: 開発経済学における貧困対策プログラムの効果検証(2019年ノーベル経済学賞)
  • 教育: 教育手法やカリキュラムの効果検証

本記事では、RCTの理論的基盤をポテンシャルアウトカムの枠組みから体系的に解説します。なぜランダム化が交絡を解消するのか、推定量の統計的性質はどうなるか、サンプルサイズはどう決めるか、といった問いに数理的に答えていきます。

本記事の内容

  • ランダム化が交絡を解消するメカニズムの数理的説明
  • 完全ランダム化デザインとその性質
  • ネイマン推定量とその分散
  • 共変量調整による効率改善
  • 検出力分析とサンプルサイズ設計
  • Pythonシミュレーションによるランダム化の効果と検出力の確認

前提知識

この記事を読む前に、以下の記事を読んでおくと理解が深まります。

ランダム化はなぜ機能するのか — 理論的基盤

ランダム化と無視可能性

ポテンシャルアウトカムの枠組みで学んだように、観測データから因果効果を識別するための鍵は無視可能性(ignorability)の仮定です。

$$ (Y(0), Y(1)) \perp\!\!\!\perp T \mid \bm{X} $$

この仮定は「共変量 $\bm{X}$ で条件付けたとき、潜在結果と処置の割り当てが独立である」ことを要求します。観察研究では、この仮定がすべての交絡変数を含む $\bm{X}$ に対して成り立つかどうかは検証不可能です。

ランダム化比較試験は、この問題をエレガントに解決します。処置の割り当て $T$ をコイン投げ(またはその数学的な等価物)で決めるため、$T$ はすべての共変量——観測されるものも観測されないものも——から独立になります。

$$ \begin{equation} (Y(0), Y(1)) \perp\!\!\!\perp T \end{equation} $$

注目すべきは、この独立性は無条件に成り立つことです。共変量 $\bm{X}$ で条件付ける必要すらありません。ランダム化は、未観測の交絡変数も含めて、すべての変数に対して処置の割り当てを独立にするのです。

ランダム化のもとでのATEの識別

無条件の独立性(1)のもとでは、ATEの識別が非常に単純になります。

$$ E[Y(1)] = E[Y(1) \mid T=1] = E[Y^{\text{obs}} \mid T=1] $$

最初の等号はランダム化による独立性(1)から、2番目の等号は処置群で観測されるのは $Y(1)$ であることからの帰結です。同様に次が成り立ちます。

$$ E[Y(0)] = E[Y(0) \mid T=0] = E[Y^{\text{obs}} \mid T=0] $$

したがって、ATEは次のように表されます。

$$ \begin{equation} \text{ATE} = E[Y^{\text{obs}} \mid T=1] – E[Y^{\text{obs}} \mid T=0] \end{equation} $$

つまり、ランダム化のもとでは処置群の平均アウトカムから対照群の平均アウトカムを引くだけで、ATEが正しく推定されるのです。観察研究で悩まされる交絡の調整は一切不要です。

なぜ「たった一つのコイン投げ」がこれほど強力なのか

ランダム化の強力さをもう少し直感的に理解してみましょう。

$n$ 人の対象者を処置群と対照群にランダムに分けるとき、分け方は $\binom{n}{n/2}$ 通りあります。各個体は性別、年齢、健康状態、遺伝的背景、性格など、無数の特性を持っています。すべての可能な分け方の中で、特定の特性に偏った分け方は稀であり、ほとんどの分け方では2群の特性がおおよそ均衡します。

もちろん、偶然によるインバランス(imbalance)は起こりえます。しかし、そのインバランスは系統的ではなく偶然的であるため、期待値を取ればゼロになります。この「期待値ゼロ」の性質こそが、ランダム化によるバイアスの除去を保証するものです。

有限サンプルでの偶然のインバランスに対処する方法として、共変量による層別化や回帰調整があります。これらについては後ほど解説します。

ランダム化の原理を理解したところで、次に具体的なランダム化のデザインとその統計的性質を見ていきましょう。

完全ランダム化デザイン

デザインの定義

完全ランダム化デザイン(Completely Randomized Design, CRD)は、最も基本的なRCTのデザインです。$n$ 人の対象者のうち、$n_1$ 人をランダムに処置群に、残りの $n_0 = n – n_1$ 人を対照群に割り当てます。

数学的には、処置の割り当てベクトル $\bm{T} = (T_1, T_2, \ldots, T_n)$ が、$\sum_{i=1}^{n} T_i = n_1$ を満たすすべての $\{0, 1\}^n$ のベクトルの中から一様にランダムに選ばれます。可能な割り当ての数は $\binom{n}{n_1}$ 通りであり、各割り当ては等確率 $1/\binom{n}{n_1}$ で選ばれます。

ネイマン推定量

完全ランダム化デザインのもとで最も自然なATEの推定量がネイマン推定量(Neyman estimator)です。これは処置群と対照群の標本平均の差として定義されます。

$$ \begin{equation} \hat{\tau} = \bar{Y}_1 – \bar{Y}_0 = \frac{1}{n_1}\sum_{i: T_i=1} Y_i – \frac{1}{n_0}\sum_{i: T_i=0} Y_i \end{equation} $$

ネイマン推定量の不偏性

ネイマン推定量がATEの不偏推定量であることを示しましょう。有限母集団の枠組みで考えます。

ランダム化のもとで、各個体が処置群に入る確率は $P(T_i = 1) = n_1/n$ です。したがって次のようになります。

$$ E[\bar{Y}_1] = E\left[\frac{1}{n_1}\sum_{i=1}^{n} T_i Y_i(1)\right] $$

$T_i Y_i = T_i Y_i(1)$ なので($T_i = 1$ のとき $Y_i = Y_i(1)$)、次のようになります。

$$ E[\bar{Y}_1] = \frac{1}{n_1}\sum_{i=1}^{n} E[T_i] Y_i(1) = \frac{1}{n_1}\sum_{i=1}^{n} \frac{n_1}{n} Y_i(1) = \frac{1}{n}\sum_{i=1}^{n} Y_i(1) = \bar{Y}(1) $$

ここで $\bar{Y}(1) = \frac{1}{n}\sum_{i=1}^{n} Y_i(1)$ は $Y(1)$ の有限母集団平均です。同様に $E[\bar{Y}_0] = \bar{Y}(0)$ となるため、次のようになります。

$$ \begin{equation} E[\hat{\tau}] = \bar{Y}(1) – \bar{Y}(0) = \frac{1}{n}\sum_{i=1}^{n}[Y_i(1) – Y_i(0)] = \text{ATE} \end{equation} $$

すなわち、ネイマン推定量はATEの不偏推定量です。

ネイマン推定量の分散

ネイマン推定量の分散は、有限母集団からの非復元抽出の分散として計算されます。結果は次のようになります。

$$ \begin{equation} \text{Var}(\hat{\tau}) = \frac{S_1^2}{n_1} + \frac{S_0^2}{n_0} – \frac{S_{01}^2}{n} \end{equation} $$

ここで、$S_1^2 = \frac{1}{n-1}\sum_{i=1}^{n}(Y_i(1) – \bar{Y}(1))^2$ は $Y(1)$ の有限母集団分散、$S_0^2$ は同様に $Y(0)$ の有限母集団分散、$S_{01}^2 = \frac{1}{n-1}\sum_{i=1}^{n}(\tau_i – \bar{\tau})^2$ は個体処置効果の有限母集団分散です。

第3項 $S_{01}^2/n$ は非負であるため、この項を無視した次の量は分散の保守的な上限を与えます。

$$ \begin{equation} \hat{V}_{\text{Neyman}} = \frac{s_1^2}{n_1} + \frac{s_0^2}{n_0} \end{equation} $$

ここで $s_1^2 = \frac{1}{n_1-1}\sum_{i: T_i=1}(Y_i – \bar{Y}_1)^2$ は処置群の標本分散、$s_0^2$ は対照群の標本分散です。ネイマンは1923年の論文でこの保守的な分散推定量を提案しました。

なぜ $S_{01}^2$ は推定できないのか: $S_{01}^2$ は個体処置効果 $\tau_i$ の分散であり、$\tau_i = Y_i(1) – Y_i(0)$ は両方の潜在結果を必要とします。因果推論の根本問題により、各個体について $Y_i(1)$ と $Y_i(0)$ の両方を観測することはできないため、$S_{01}^2$ は原理的に推定不可能です。

分散の直感的解釈

式(5)の分散は3つの成分に分解されます。

  • $S_1^2/n_1$: 処置群内のアウトカムのばらつきに起因する不確実性。$n_1$ を増やすと減少
  • $S_0^2/n_0$: 対照群内のアウトカムのばらつきに起因する不確実性。$n_0$ を増やすと減少
  • $-S_{01}^2/n$: 個体処置効果のばらつきによる「ボーナス」。処置効果が一定($\tau_i = \tau$ for all $i$)ならば $S_{01}^2 = 0$ でボーナスなし。処置効果にばらつきがあると、実はこの項のおかげで推定の不確実性が少し減る

$n_1 = n_0 = n/2$(均等割り当て)の場合、分散は次のように簡約化されます。

$$ \text{Var}(\hat{\tau}) = \frac{2(S_1^2 + S_0^2)}{n} – \frac{S_{01}^2}{n} $$

$n$ が大きくなるほど分散は $1/n$ のオーダーで減少します。中心極限定理により、$n$ が十分に大きければ $\hat{\tau}$ は正規分布に近似的に従います。

$$ \hat{\tau} \stackrel{\text{approx}}{\sim} N\left(\text{ATE}, \frac{s_1^2}{n_1} + \frac{s_0^2}{n_0}\right) $$

この正規近似を用いて、信頼区間の構成や仮説検定を行うことができます。

では、共変量の情報を利用して推定の効率を高める方法を見てみましょう。

共変量調整 — 精度を高める工夫

なぜ共変量調整をするのか

ランダム化のもとでは共変量を調整しなくてもATEは不偏に推定できます。では、なぜ共変量調整を行うのでしょうか。

答えは効率性(推定の精度)にあります。共変量がアウトカムと強く相関している場合、その共変量を回帰モデルに含めることでアウトカムの残差分散を減少させ、ATEの推定精度を高めることができます。

例えば、新薬の効果を検証するRCTで、処置前の症状スコア(ベースライン)をアウトカムモデルに含めると、患者間のアウトカムのばらつきのうちベースラインで説明できる部分が除去され、処置効果の推定精度が向上します。

リンの回帰調整

リン(Lin, 2013)は、RCTにおける共変量調整の理論を整理し、以下の回帰モデルを推奨しました。

$$ \begin{equation} Y_i = \alpha + \tau T_i + \bm{\beta}^\top (\bm{X}_i – \bar{\bm{X}}) + \bm{\gamma}^\top T_i (\bm{X}_i – \bar{\bm{X}}) + \epsilon_i \end{equation} $$

ここで $\bar{\bm{X}} = \frac{1}{n}\sum_{i=1}^{n}\bm{X}_i$ は共変量の全体平均です。共変量を中心化する理由は、$\hat{\tau}$ の解釈をATEと一致させるためです。

この回帰モデルにおける $T_i$ の係数 $\hat{\tau}_{\text{Lin}}$ は、以下の性質を持つことが示されています。

  1. 漸近的に不偏: ランダム化のもとで、共変量調整の有無にかかわらず不偏性が保たれます。回帰モデルが正しく指定されているかどうかに関わらず、ランダム化が不偏性を保証するのです

  2. 分散の減少: 共変量がアウトカムと相関している場合、$\hat{\tau}_{\text{Lin}}$ の分散は未調整の $\hat{\tau}$ の分散以下になります。共変量のアウトカムに対する予測力が高いほど、分散の減少幅が大きくなります

  3. 分散は増加しない: 共変量がアウトカムと無関係な場合でも、漸近的には分散は増加しません(有限サンプルでは自由度の損失によるわずかな増加がありうる)

リンの結果は、RCTにおいて共変量調整は「やって損はない」ことを理論的に保証しています。これは観察研究における共変量調整(必要不可欠だがモデル依存)とは本質的に異なる位置づけです。

共変量調整は推定の精度を向上させますが、サンプルサイズの設計はRCTの計画段階で最も重要な判断の一つです。次に、検出力分析とサンプルサイズの決定方法を見ていきましょう。

検出力分析とサンプルサイズ設計

仮説検定の枠組み

RCTの結果を評価する最も基本的な方法は、ネイマン・ピアソンの仮説検定の枠組みです。

$$ H_0: \text{ATE} = 0 \quad \text{(処置に効果なし)} $$ $$ H_1: \text{ATE} \neq 0 \quad \text{(処置に効果あり)} $$

検定統計量は、ネイマン推定量を推定標準誤差で割ったものです。

$$ \begin{equation} z = \frac{\hat{\tau}}{\sqrt{s_1^2/n_1 + s_0^2/n_0}} \end{equation} $$

$n$ が十分大きい場合、$H_0$ のもとで $z$ は標準正規分布に近似的に従います。有意水準 $\alpha$ の両側検定では、$|z| > z_{\alpha/2}$ のとき $H_0$ を棄却します。

検出力(パワー)

検出力(statistical power)は、処置に真の効果があるとき($H_1$ が真)に、それを正しく検出できる確率です。

$$ \begin{equation} \text{Power} = P(\text{$H_0$を棄却} \mid H_1 \text{が真}) \end{equation} $$

検出力は一般に $1 – \beta$ と表記され、$\beta$ は第2種の過誤(処置効果があるのに見逃す確率)です。慣例として、検出力は $0.8$(80%)以上を目標とすることが多いです。

サンプルサイズの決定

均等割り当て($n_1 = n_0 = n/2$)を仮定し、処置群と対照群のアウトカムの分散が等しい($\sigma_1^2 = \sigma_0^2 = \sigma^2$)場合、検出力 $1 – \beta$ を達成するために必要な総サンプルサイズは次のように計算されます。

$$ \begin{equation} n = \frac{4\sigma^2(z_{\alpha/2} + z_\beta)^2}{\delta^2} \end{equation} $$

ここで $\delta = \text{ATE}$ は検出したい最小の効果量、$z_{\alpha/2}$ は有意水準に対応する標準正規分位点、$z_\beta$ は検出力に対応する標準正規分位点です。

この式を導出しましょう。$H_1$ のもとで $\hat{\tau} \sim N(\delta, 4\sigma^2/n)$ であり、検定統計量は次のようになります。

$$ z = \frac{\hat{\tau}}{\sqrt{4\sigma^2/n}} $$

$H_0$ を棄却する条件は $z > z_{\alpha/2}$ です(右片側で考える場合)。次のように変形します。

$$ P\left(\frac{\hat{\tau}}{\sqrt{4\sigma^2/n}} > z_{\alpha/2}\right) = P\left(\frac{\hat{\tau} – \delta}{\sqrt{4\sigma^2/n}} > z_{\alpha/2} – \frac{\delta}{\sqrt{4\sigma^2/n}}\right) = 1 – \beta $$

$(\hat{\tau} – \delta)/\sqrt{4\sigma^2/n} \sim N(0, 1)$ であるため、次が成り立ちます。

$$ z_{\alpha/2} – \frac{\delta}{\sqrt{4\sigma^2/n}} = -z_\beta $$

この式を $n$ について解くと、式(10)が得られます。

効果量と標準化

サンプルサイズの公式において、効果量(effect size)を標準化して表すことがしばしば有用です。コーエンの $d$ は次のように定義されます。

$$ d = \frac{\delta}{\sigma} $$

コーエンの慣例では、$d = 0.2$(小)、$d = 0.5$(中)、$d = 0.8$(大)と分類されます。効果量を使ってサンプルサイズの公式を書き直すと次のようになります。

$$ \begin{equation} n = \frac{4(z_{\alpha/2} + z_\beta)^2}{d^2} \end{equation} $$

例えば、$\alpha = 0.05$($z_{0.025} = 1.96$)、$1 – \beta = 0.8$($z_{0.2} = 0.84$)、$d = 0.5$ の場合、次のようになります。

$$ n = \frac{4(1.96 + 0.84)^2}{0.5^2} = \frac{4 \times 7.84}{0.25} = 125.4 \approx 126 $$

各群63人、合計126人が必要になります。

では、Pythonを使って検出力分析を実装し、サンプルサイズと効果量の関係を可視化してみましょう。

Pythonシミュレーション

シミュレーション1: ランダム化の効果

まず、ランダム化が交絡バイアスを除去することをシミュレーションで確認します。

import numpy as np
import matplotlib.pyplot as plt

np.random.seed(42)
n_sims = 2000
n = 200
true_ATE = 2.0

rct_estimates = []
obs_estimates = []

for _ in range(n_sims):
    # 共変量(交絡変数)
    Z = np.random.normal(0, 1, n)

    # 潜在結果
    Y0 = 10 + 3 * Z + np.random.normal(0, 2, n)
    Y1 = Y0 + true_ATE

    # RCT: 完全ランダム化(n/2ずつ)
    perm = np.random.permutation(n)
    T_rct = np.zeros(n, dtype=int)
    T_rct[perm[:n//2]] = 1
    Y_rct = T_rct * Y1 + (1 - T_rct) * Y0
    rct_estimates.append(Y_rct[T_rct==1].mean() - Y_rct[T_rct==0].mean())

    # 観察研究: Zに依存した割り当て
    prob = 1 / (1 + np.exp(-1.5 * Z))
    T_obs = np.random.binomial(1, prob, n)
    if T_obs.sum() == 0 or T_obs.sum() == n:
        continue
    Y_obs = T_obs * Y1 + (1 - T_obs) * Y0
    obs_estimates.append(Y_obs[T_obs==1].mean() - Y_obs[T_obs==0].mean())

rct_estimates = np.array(rct_estimates)
obs_estimates = np.array(obs_estimates)

fig, axes = plt.subplots(1, 2, figsize=(13, 5))

# ヒストグラム
ax = axes[0]
ax.hist(rct_estimates, bins=40, alpha=0.6, color="blue", density=True,
        label=f"RCT (mean={rct_estimates.mean():.3f})")
ax.hist(obs_estimates, bins=40, alpha=0.6, color="red", density=True,
        label=f"Obs (mean={obs_estimates.mean():.3f})")
ax.axvline(true_ATE, color="black", linewidth=2, linestyle="--",
           label=f"True ATE = {true_ATE}")
ax.set_xlabel("Estimated ATE", fontsize=12)
ax.set_ylabel("Density", fontsize=12)
ax.set_title(f"RCT vs Observational Study (n={n})", fontsize=12)
ax.legend(fontsize=9)
ax.grid(True, alpha=0.3)

# 共変量バランス
ax = axes[1]
Z_treated_rct = []
Z_control_rct = []
for _ in range(500):
    Z = np.random.normal(0, 1, n)
    perm = np.random.permutation(n)
    T_rct = np.zeros(n, dtype=int)
    T_rct[perm[:n//2]] = 1
    Z_treated_rct.append(Z[T_rct==1].mean())
    Z_control_rct.append(Z[T_rct==0].mean())

imbalance = np.array(Z_treated_rct) - np.array(Z_control_rct)
ax.hist(imbalance, bins=40, alpha=0.7, color="steelblue", density=True)
ax.axvline(0, color="black", linewidth=1.5, linestyle="--")
ax.set_xlabel("Mean Z(treated) - Mean Z(control)", fontsize=12)
ax.set_ylabel("Density", fontsize=12)
ax.set_title("Covariate balance under randomization", fontsize=12)
ax.grid(True, alpha=0.3)

plt.tight_layout()
plt.savefig("rct_randomization_effect.png", dpi=150, bbox_inches="tight")
plt.show()

print(f"RCT: バイアス = {rct_estimates.mean() - true_ATE:.4f}, SD = {rct_estimates.std():.4f}")
print(f"Obs: バイアス = {obs_estimates.mean() - true_ATE:.4f}, SD = {obs_estimates.std():.4f}")

このシミュレーション結果から、以下のことが確認できます。

  1. RCTの推定値(青)は真のATE = 2.0 を中心に対称に分布しています。バイアスはほぼゼロであり、ランダム化が不偏性を保証していることが数値的に確認されています

  2. 観察研究の推定値(赤)は右にシフトしており、正の選択バイアスが発生しています。交絡変数 $Z$ が処置群に高い値を持つ個体を集めるため、処置効果が過大に推定されています

  3. 共変量のバランス(右図): ランダム化のもとで処置群と対照群の共変量平均の差はゼロを中心に分布しています。有限サンプルでは小さなインバランスが生じますが、その期待値はゼロです

シミュレーション2: 検出力分析

次に、サンプルサイズと効果量が検出力に与える影響を可視化します。

import numpy as np
import matplotlib.pyplot as plt
from scipy import stats

# --- 分析的な検出力計算 ---
def power_analytical(n, effect_size, sigma=1.0, alpha=0.05):
    """均等割り当てRCTの検出力(両側検定)"""
    se = sigma * np.sqrt(4.0 / n)
    z_alpha = stats.norm.ppf(1 - alpha / 2)
    z_stat = effect_size / se
    power = 1 - stats.norm.cdf(z_alpha - z_stat) + stats.norm.cdf(-z_alpha - z_stat)
    return power

# (a) サンプルサイズ vs 検出力(効果量別)
fig, axes = plt.subplots(1, 2, figsize=(14, 5.5))

ax = axes[0]
n_range = np.arange(10, 1001, 5)
for d in [0.2, 0.3, 0.5, 0.8]:
    powers = [power_analytical(n, d) for n in n_range]
    ax.plot(n_range, powers, linewidth=2, label=f"d = {d}")
ax.axhline(0.8, color="gray", linestyle="--", linewidth=1, label="Power = 0.80")
ax.set_xlabel("Total sample size n", fontsize=12)
ax.set_ylabel("Statistical power", fontsize=12)
ax.set_title("Power vs sample size", fontsize=12)
ax.legend(fontsize=10)
ax.grid(True, alpha=0.3)
ax.set_ylim(0, 1.05)

# (b) 効果量 vs 必要サンプルサイズ
ax = axes[1]
d_range = np.linspace(0.1, 1.0, 100)
for power_target in [0.7, 0.8, 0.9]:
    z_alpha = stats.norm.ppf(0.975)
    z_beta = stats.norm.ppf(power_target)
    n_required = 4 * (z_alpha + z_beta)**2 / d_range**2
    ax.plot(d_range, n_required, linewidth=2,
            label=f"Power = {power_target}")
ax.set_xlabel("Effect size (Cohen's d)", fontsize=12)
ax.set_ylabel("Required total sample size", fontsize=12)
ax.set_title("Required sample size vs effect size", fontsize=12)
ax.set_ylim(0, 2000)
ax.legend(fontsize=10)
ax.grid(True, alpha=0.3)

plt.tight_layout()
plt.savefig("rct_power_analysis.png", dpi=150, bbox_inches="tight")
plt.show()

# 具体的な数値
print("\n=== 必要サンプルサイズ(alpha=0.05, power=0.80)===")
z_a = stats.norm.ppf(0.975)
z_b = stats.norm.ppf(0.80)
for d in [0.2, 0.3, 0.5, 0.8]:
    n_req = int(np.ceil(4 * (z_a + z_b)**2 / d**2))
    print(f"  d = {d}: n = {n_req} (各群 {n_req//2})")

検出力分析の結果から、以下の重要な知見が得られます。

  1. 効果量が小さいほど、必要なサンプルサイズは劇的に増加する。$d = 0.2$(小さな効果)を検出するには約400人が必要ですが、$d = 0.8$(大きな効果)なら約25人で十分です。サンプルサイズは効果量の2乗に反比例するため、効果量が半分になるとサンプルサイズは4倍必要です

  2. 検出力80%を目標とすることの意味: 検出力80%は「真の効果がある場合に、5回中4回はそれを検出できる」ことを意味します。20%の確率で効果を見逃すリスクが残りますが、検出力を90%に上げるとサンプルサイズが約30%増加するため、コストとのトレードオフが生じます

  3. 効果量の事前推定の重要性: 検出力分析にはATEの事前推定値が必要です。これはパイロットスタディや先行研究の結果から推測します。事前推定が大きく外れると、過小なサンプルサイズ(検出力不足)や過大なサンプルサイズ(コスト超過)につながります

シミュレーション3: 共変量調整の効果

最後に、共変量調整が推定の精度を向上させることをシミュレーションで確認します。

import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression

np.random.seed(42)
n_sims = 2000
n = 200
true_ATE = 2.0

unadj_estimates = []
adj_estimates = []

for _ in range(n_sims):
    # ベースライン共変量
    X = np.random.normal(0, 1, n)

    # 潜在結果(Xとの相関が強い)
    Y0 = 5 + 4 * X + np.random.normal(0, 1, n)
    Y1 = Y0 + true_ATE

    # 完全ランダム化
    perm = np.random.permutation(n)
    T = np.zeros(n, dtype=int)
    T[perm[:n//2]] = 1
    Y = T * Y1 + (1 - T) * Y0

    # 未調整推定
    unadj = Y[T==1].mean() - Y[T==0].mean()
    unadj_estimates.append(unadj)

    # Linの回帰調整
    X_centered = X - X.mean()
    design = np.column_stack([T, X_centered, T * X_centered])
    reg = LinearRegression(fit_intercept=True).fit(design, Y)
    adj = reg.coef_[0]
    adj_estimates.append(adj)

unadj_estimates = np.array(unadj_estimates)
adj_estimates = np.array(adj_estimates)

fig, ax = plt.subplots(figsize=(10, 5))
ax.hist(unadj_estimates, bins=40, alpha=0.5, color="blue", density=True,
        label=f"Unadjusted (SD={unadj_estimates.std():.3f})")
ax.hist(adj_estimates, bins=40, alpha=0.5, color="red", density=True,
        label=f"Covariate adjusted (SD={adj_estimates.std():.3f})")
ax.axvline(true_ATE, color="black", linewidth=2, linestyle="--",
           label=f"True ATE = {true_ATE}")
ax.set_xlabel("Estimated ATE", fontsize=12)
ax.set_ylabel("Density", fontsize=12)
ax.set_title("Effect of covariate adjustment in RCT", fontsize=12)
ax.legend(fontsize=10)
ax.grid(True, alpha=0.3)

plt.tight_layout()
plt.savefig("rct_covariate_adjustment.png", dpi=150, bbox_inches="tight")
plt.show()

print(f"未調整: 平均={unadj_estimates.mean():.4f}, SD={unadj_estimates.std():.4f}")
print(f"調整済: 平均={adj_estimates.mean():.4f}, SD={adj_estimates.std():.4f}")
print(f"分散の比: {adj_estimates.var() / unadj_estimates.var():.4f}")
print(f"有効サンプルサイズの増加率: {unadj_estimates.var() / adj_estimates.var():.1f}倍")

共変量調整の効果がグラフから明瞭に読み取れます。

  1. 両方の推定量ともバイアスはない。これはランダム化が保証する性質です。共変量調整の有無にかかわらず、推定値の平均は真のATE = 2.0 に一致しています

  2. 共変量調整済み推定量(赤)は未調整(青)よりも分布が狭い。標準偏差が大幅に減少しており、同じサンプルサイズでより精密な推定が得られています。この精度の向上は、アウトカムのばらつきのうち共変量 $X$ で説明できる部分($R^2$ に相当)を除去したことによります

  3. 共変量がアウトカムと強く相関する場合、調整の効果は大きい。この例では $Y$ の変動の大部分が $X$ で説明されるため、共変量調整による分散の減少が劇的です。有効サンプルサイズ(同じ精度を未調整で達成するのに必要なサンプルサイズ)が数倍に増加しています

RCTの限界と倫理的考慮

RCTの限界

RCTは因果推論のゴールドスタンダードですが、万能ではありません。

倫理的制約: 有害であることが疑われる処置を人にランダムに割り当てることはできません。たとえば、「喫煙が肺がんを引き起こすか」をRCTで検証するために、非喫煙者にランダムに喫煙を強制することは倫理的に不可能です。

現実的制約: 長期間の追跡が必要な研究や、処置の遵守(compliance)が困難な場合、RCTの実施は難しくなります。例えば、食事療法のRCTでは、割り当てられた食事を長期間遵守してもらうことが困難です。

外的妥当性: RCTの結果は、実験に参加した集団(内的妥当性)については強力な因果推定を提供しますが、参加しなかった集団に結果が一般化できるか(外的妥当性)は別の問題です。

コスト: 大規模RCTは非常に高コストです。特に医薬品の臨床試験は数億円から数十億円の費用がかかることがあります。

これらの限界がある場合には、観察研究のデータから因果効果を推定するための手法(傾向スコア法、操作変数法、差の差法など)が代替手段として用いられます。

まとめ

本記事では、ランダム化比較試験(RCT)の理論的基盤を因果推論の枠組みから解説しました。

  • ランダム化は処置の割り当てをすべての変数(観測・未観測を問わず)から独立にすることで、交絡バイアスを根本的に解消する
  • ネイマン推定量(処置群平均 – 対照群平均)はATEの不偏推定量であり、その分散はネイマンの保守的な分散推定量で上から抑えられる
  • 共変量調整はRCTにおいて不偏性を損なわずに精度を向上させる手段であり、リンの回帰調整が推奨される
  • 検出力分析によりサンプルサイズを事前に決定する。必要サンプルサイズは効果量の2乗に反比例する
  • Pythonシミュレーションにより、ランダム化の効果、検出力とサンプルサイズの関係、共変量調整の精度向上を確認した

RCTは因果推論の「ゴールドスタンダード」ですが、倫理的・実用的な制約からRCTが不可能な場面も多くあります。次の記事では、RCTが実施できない場合に観察研究から因果効果を推定するための方法を解説していきます。

次のステップとして、以下の記事も参考にしてください。