Mímisbrunnr知恵の泉

← 因果推論 一覧

🎓 レベル:基礎 | 重要度:A(必須)

📎 前提:相関と因果の違い | 次に読む:識別の仮定 | 数理:確率変数(離散・連続)と期待値・分散(統計)・推定量の評価(MSE・フィッシャー情報量・クラメール・ラオの不等式)(統計)

要点(BLUF)

1. 反事実で因果を定義する

「この薬を飲んだから治った」と言えるのは、「もし飲まなかったら治らなかった」場合です。因果は、実際に起きた事実と、起きなかった反事実(counterfactual)の比較として定義されます。

各個体 ii に対し2つの 潜在結果(potential outcomes) を考えます。

個体処置効果(Individual Treatment Effect, ITE) は両者の差です。

τi  =  Yi(1)Yi(0)\tau_i \;=\; Y_i(1) - Y_i(0)

実際に観測される結果 YiY_i は、処置 Xi{0,1}X_i\in\{0,1\} に応じてどちらか一方が「現実化」したものです(一致性 consistency識別の仮定)。

Yi  =  XiYi(1)+(1Xi)Yi(0)Y_i \;=\; X_i\,Y_i(1) + (1-X_i)\,Y_i(0)

2. ATE と ATT:私たちが狙える量

τi\tau_i は個体ごとに違ってよい(異質処置効果異質処置効果とメタ学習器(S/T/X-learner))。母集団全体で平均したものが 平均処置効果(Average Treatment Effect, ATE) です。

ATE  =  E[Y(1)Y(0)]  =  E[Y(1)]E[Y(0)]\text{ATE} \;=\; E[\,Y(1) - Y(0)\,] \;=\; E[Y(1)] - E[Y(0)]

処置を受けた人たちに限った平均が 処置群における平均処置効果(ATT) です。

ATT  =  E[Y(1)Y(0)X=1]\text{ATT} \;=\; E[\,Y(1) - Y(0)\,\mid\, X=1\,]

両者は一致するとは限りません。「処置されやすい人ほど効果が大きい」なら ATT>ATE\text{ATT}>\text{ATE} になります。狙う推定対象(estimand)が ATE か ATT かを最初に決めるのが因果分析の作法です。

3. 因果推論の根本問題:片方しか見えない

決定的な困難は、Yi(1)Y_i(1)Yi(0)Y_i(0)片方しか観測できないことです。処置した人の Yi(0)Y_i(0)(処置しなかったらどうだったか)は永遠に欠測します。Holland (1986) はこれを 因果推論の根本問題(Fundamental Problem of Causal Inference) と呼びました。ITE τi\tau_i は個体レベルでは決して観測できません。

シミュレーションの教育的な強みはここにあります。自分でデータを作るなら両方の潜在結果を生成でき、真の ATE が分かるのです。まず神の視点で全部作り、そのうち現実に見える「片方」を取り出してみます。

import numpy as np
import pandas as pd

# === シミュレーションの強み:両方の潜在結果 Y(1), Y(0) を「神の視点」で生成 ===
rng = np.random.default_rng(7)
n = 20000

# 個体の基礎変数 U(例:体力。高いほど結果も良い)
U = rng.normal(0, 1, size=n)

# 潜在結果:処置しなければ Y0、処置すれば Y1
noise0 = rng.normal(0, 1, size=n)
Y0 = 10.0 + 3.0 * U + noise0
ITE = 2.0 + 1.0 * U              # 個体処置効果(U が高いほど効果大=異質)
Y1 = Y0 + ITE

ATE_true = ITE.mean()           # 神の視点でだけ計算できる真の ATE
print(f"真の ATE = E[Y1 - Y0] = {ATE_true:.3f}\n")

# 処置選択:U が高い個体ほど処置されやすい(選択バイアスの種)
prob_treat = 1.0 / (1.0 + np.exp(-U))
X = rng.binomial(1, prob_treat)

# 現実に観測できるのは片方だけ(一致性 consistency: Y = X*Y1 + (1-X)*Y0)
Y_obs = np.where(X == 1, Y1, Y0)

# 先頭6個体だけ表で見る(反事実は本来「?」で観測不能)
table = pd.DataFrame({
    "U": U[:6].round(2), "X": X[:6],
    "Y0": Y0[:6].round(2), "Y1": Y1[:6].round(2),
    "ITE=Y1-Y0": ITE[:6].round(2), "Y_obs": Y_obs[:6].round(2),
})
table["観測できた方"] = np.where(X[:6] == 1, "Y1", "Y0")
table["反事実(欠測)"] = np.where(X[:6] == 1, "Y0=?", "Y1=?")
print(table.to_string(index=False))

出力:

真の ATE = E[Y1 - Y0] = 1.994

    U  X    Y0    Y1  ITE=Y1-Y0  Y_obs 観測できた方 反事実(欠測)
 0.00  0 11.00 13.00       2.00  11.00     Y0    Y1=?
 0.30  1 10.36 12.66       2.30  12.66     Y1    Y0=?
-0.27  1  8.95 10.68       1.73  10.68     Y1    Y0=?
-0.89  0  7.44  8.55       1.11   7.44     Y0    Y1=?
-0.45  1  8.72 10.26       1.55  10.26     Y1    Y0=?
-0.99  0  6.88  7.88       1.01   6.88     Y0    Y1=?

出力の意味:神の視点では各個体の Y0,Y1Y_0,Y_1 が両方そろい、ITE も計算でき、真の ATE は 1.9942.01.994\approx 2.0 です。しかし右2列が現実の制約を表します。X=1X=1 の人は Y1Y_1 だけが観測でき Y0Y_0 は「Y0=?」、X=0X=0 の人は逆。表の「?」列は永遠に埋まらない——これが根本問題です。私たちは欠測した反事実を、仮定と他人のデータで**埋め合わせ(識別)**するしかありません。

4. 処置選択に偏りがあると素朴比較は ATE を外す

観測できる素朴な平均差 E[YX=1]E[YX=0]E[Y\mid X=1]-E[Y\mid X=0] を、真の ATE・ATT と並べてみます。同じ擬似データで、処置の割り当てを「UU が高い人ほど受けやすい(選択あり)」場合と「完全ランダム」の場合で比べます。

import numpy as np

# === 選択バイアス:素朴比較は ATE とも ATT ともズレる。ランダム化だと ATE に一致 ===
rng = np.random.default_rng(7)
n = 20000

U = rng.normal(0, 1, size=n)
noise0 = rng.normal(0, 1, size=n)
Y0 = 10.0 + 3.0 * U + noise0
ITE = 2.0 + 1.0 * U
Y1 = Y0 + ITE
ATE_true = ITE.mean()

# (1) 選択ありの観察データ:U が高いほど処置されやすい
prob_treat = 1.0 / (1.0 + np.exp(-U))
X = rng.binomial(1, prob_treat)
Y_obs = np.where(X == 1, Y1, Y0)
naive_obs = Y_obs[X == 1].mean() - Y_obs[X == 0].mean()
ATT_true = ITE[X == 1].mean()        # 処置群での真の平均効果

# (2) もし処置を完全ランダム化したら
X_rct = rng.binomial(1, 0.5, size=n)
Y_rct = np.where(X_rct == 1, Y1, Y0)
naive_rct = Y_rct[X_rct == 1].mean() - Y_rct[X_rct == 0].mean()

print(f"真の ATE                 = {ATE_true:.3f}")
print(f"真の ATT (処置群の効果)  = {ATT_true:.3f}")
print(f"観察データの素朴比較      = {naive_obs:.3f}  ← ATE とも ATT ともズレる")
print(f"ランダム化の素朴比較      = {naive_rct:.3f}  ← ATE に一致")

出力:

真の ATE                 = 1.994
真の ATT (処置群の効果)  = 2.415
観察データの素朴比較      = 4.923  ← ATE とも ATT ともズレる
ランダム化の素朴比較      = 2.005  ← ATE に一致

出力の意味:観察データの素朴比較 4.9234.923 は、真の ATE(1.9941.994)からも ATT(2.4152.415)からも大きく上に外れました。素朴比較を分解すると

E[YX=1]E[YX=0]素朴比較=E[Y(1)Y(0)X=1]ATT+E[Y(0)X=1]E[Y(0)X=0]選択バイアス\underbrace{E[Y\mid X=1]-E[Y\mid X=0]}_{\text{素朴比較}} = \underbrace{E[Y(1)-Y(0)\mid X=1]}_{\text{ATT}} + \underbrace{E[Y(0)\mid X=1]-E[Y(0)\mid X=0]}_{\text{選択バイアス}}

となり、第2項の 選択バイアス(処置群と対照群の「もともとの結果 Y(0)Y(0) の差」)が乗っています。ここでは UU が高い人ほど処置され、UU が高いほど Y(0)Y(0) も高い(体力がある)ので、選択バイアスが正方向に効いて過大評価になりました。一方ランダム化すると処置は UU と独立になり、選択バイアスが消えて素朴比較 2.0052.005 がそのまま ATE に一致します。これが「なぜ RCT が黄金律か」(なぜRCTが黄金律か)の数理的な理由です。

5. 仮定の直観的意味:欠測を埋める条件

素朴比較が ATE に一致する条件は、上の分解の選択バイアス項がゼロ、すなわち

E[Y(0)X=1]=E[Y(0)X=0]E[Y(0)\mid X=1] = E[Y(0)\mid X=0]

「処置群と対照群が、処置しなかった世界では同じ平均結果を持つ」ことです。これは 交換可能性(exchangeability) {Y(1),Y(0)} ⁣ ⁣ ⁣X\{Y(1),Y(0)\}\perp\!\!\!\perp X の帰結で、ランダム化が保証します。観察データでは無条件には成り立たないので、交絡 CC を条件づけた 条件付き交換可能性 に弱め、CC で調整して埋め合わせます(バックドア基準と識別識別の仮定)。潜在結果という言葉があって初めて「何が欠測していて、どんな仮定で埋めるのか」を厳密に語れる——これが潜在結果モデルの効用です。

⚠️ よくある誤解・落とし穴

関連ノート