🎓 レベル:標準 | 重要度:A(必須)
📎 前提:操作変数法と2SLS | 差分の差分と並行トレンド | 回帰不連続デザイン
要点(BLUF)
- 因果デザインの選択は「どんな変動源(バリエーション)が手に入るか」で決まる。手法が先ではなく、識別を可能にする変動が先。
- 各デザインは固有の識別仮定と引き換えに因果を取り出す。仮定が満たされる状況でだけそのデザインは当たり、外れると堂々と偏る。
- 優先順位は概ね RCT > 自然実験(IV・RDD・DID・SCM)> 観測調整。だが現実は使える変動で決まる。最後の砦は感度分析。
発想の転換:手法でなく「変動源」から考える
因果推論の各デザインは、結局「処置を、結果の交絡から切り離して動かす変動はどこにあるか」を問うている。
- 実験者が割り当てられる → ランダム化という変動(なぜRCTが黄金律か)。
- 交絡をすべて測れている → 共変量を揃えた条件付き比較(二重頑健推定AIPW)。
- 処置だけを外から揺さぶる変数がある → 操作変数(操作変数法と2SLS)。
- 時間と群の差を使える → 差分の差分(差分の差分と並行トレンド)。
- 閾値ルールがある → 閾値前後の偶然(回帰不連続デザイン)。
- 処置ユニットが1つ+良いドナー → 合成対照(合成コントロール法)。
一覧:変動源と識別仮定
| デザイン | 使う変動源 | 主要な識別仮定 | 効果の対象 |
|---|---|---|---|
| RCT | 実験者のランダム割当 | 無作為化=交換可能性 | ATE |
| 回帰/傾向スコア・AIPW | 観測共変量での比較 | 条件付き交換可能性(全交絡を観測)+正値性 | ATE / ATT |
| 操作変数・2SLS | 外生的な揺さぶり Z | 関連性・除外制約・独立性(+単調性) | LATE(コンプライア) |
| 差分の差分 | 群 × 時間の差 | 並行トレンド | ATT |
| 回帰不連続 | 閾値前後の偶然 | 閾値での連続性(操作なし) | 閾値での LATE |
| 合成コントロール | 単一処置+ドナー | 干渉なし+凸包・良好な事前フィット | 処置ユニットへの効果 |
要は 「検証できる仮定」と「信じるしかない仮定」のどちらに賭けるか。RCTは無作為化を設計で保証できる唯一の手法。観察データの各デザインは、検証不能な仮定(全交絡観測・除外制約・並行トレンド・連続性)を理屈で支えるぶん脆い。
意思決定フロー
flowchart TD
Start["因果効果を知りたい"] --> Q1{"処置をランダム割当できる?"}
Q1 -->|"はい"| RCT["RCT(実験・A/Bテスト)"]
Q1 -->|"いいえ(観察データ)"| Q2{"交絡をすべて観測できている?"}
Q2 -->|"はい(強い無視可能性)"| ADJ["回帰/傾向スコア調整・AIPW"]
Q2 -->|"いいえ(未観測交絡あり)"| Q3{"外生的な操作変数がある?"}
Q3 -->|"はい(関連+除外)"| IV["操作変数法・2SLS"]
Q3 -->|"いいえ"| Q4{"閾値で処置が決まる?"}
Q4 -->|"はい"| RDD["回帰不連続デザイン"]
Q4 -->|"いいえ"| Q5{"前後×群のパネルで並行トレンドが妥当?"}
Q5 -->|"はい"| DID["差分の差分"]
Q5 -->|"いいえ"| Q6{"処置は単一ユニット+良いドナー?"}
Q6 -->|"はい"| SCM["合成コントロール法"]
Q6 -->|"いいえ"| SENS["識別困難 → 感度分析で頑健性を測る"]
このフローは上ほど仮定が軽く信頼が高い。下りるほど検証不能な仮定が重くなる。複数のデザインが使えるなら、別々の仮定に立つ手法で同じ結論が出るか(三角測量)を確かめるのが最強だ。
コード:同じ効果を、観測できる変動源で取り分ける
同一のデータ生成過程(真の効果 、交絡 、操作変数 )に対し、何を観測できるかで勝つデザインが変わることを示す。(1) 交絡 を観測できれば回帰調整で当たる。(2) を観測できないと素朴回帰は偏る。(3) だが操作変数 があればIVで当たる。
import numpy as np
import statsmodels.api as sm
# === 同じ真の効果を、利用できる変動源に応じて違うデザインで取り出す ===
rng = np.random.default_rng(5)
n = 8000
beta_true = 2.0
C = rng.normal(0, 1, n) # 交絡(観測できる場合とできない場合を比べる)
Z = rng.normal(0, 1, n) # 操作変数(C と独立)
T = 0.8*Z + 1.0*C + rng.normal(0, 1, n)
Y = 1.0 + beta_true*T + 1.5*C + rng.normal(0, 1, n)
# (1) 交絡 C が観測できる → 回帰で調整(バックドアを閉じる)
adj = sm.OLS(Y, sm.add_constant(np.column_stack([T, C]))).fit().params[1]
# (2) C が観測できない → 素朴回帰は偏る
naive = sm.OLS(Y, sm.add_constant(T)).fit().params[1]
# (3) C は不明だが操作変数 Z がある → IV(2SLS)
T_hat = sm.OLS(T, sm.add_constant(Z)).fit().fittedvalues
iv = sm.OLS(Y, sm.add_constant(T_hat)).fit().params[1]
print(f"真の効果 = {beta_true:.3f}")
print(f"(1) 交絡を観測→回帰で調整 = {adj:.3f}")
print(f"(2) 交絡を観測できず→素朴回帰 = {naive:.3f}")
print(f"(3) 交絡は不明だが操作変数→IV = {iv:.3f}")
出力は次の通り。
真の効果 = 2.000
(1) 交絡を観測→回帰で調整 = 2.012
(2) 交絡を観測できず→素朴回帰 = 2.568
(3) 交絡は不明だが操作変数→IV = 1.951
交絡 を観測できるなら回帰調整が2.012で真値を当てる。観測できないと素朴回帰は2.568へ偏る。しかし操作変数 があるなら、 を一切観測せずともIVが1.951で回収する。手法の優劣は固定でなく、利用できる変動源で決まる。これがデザイン選択の本質だ。
仮定の直観:何が検証でき、何は信じるしかないか
- RCT:無作為化を設計で保証。共変量バランスはデータで確認できる。最も検証可能。
- 調整系(回帰・傾向スコア・AIPW):正値性や共変量バランスは点検できるが、「未観測交絡が無い」は原理的に検証不能。二重頑健推定AIPW でも未観測交絡には無力。
- IV:関連性(第1段F)は検証可。除外制約・独立性は検証不能。
- DID:プレトレンドは見られるが、並行トレンドそのものは反実仮想で検証不能。
- RDD:閾値での密度・共変量連続性は部分的に検証可能(操作の痕跡を探せる)。外的妥当性は閾値近傍に限る。
- SCM:事前フィットの良さは見えるが、事後の反実仮想再現は信じるしかない。
検証不能な仮定に賭ける以上、結論は仮定とセットで提示し、仮定が崩れたらどれだけ結論がぶれるかを測る――それが第7章の感度分析だ。
⚠️ よくある誤解・落とし穴
- 手法から入る:「IVを使いたい」ではなく「除外制約を満たす変動があるか」から考える。変動が無ければどんな手法も無力。
- 準実験を魔法と誤解:IV・DID・RDDも検証不能な仮定の上に立つ。観察データである以上、未観測交絡の影は完全には消えない。
- 効果の対象を混同:ATE・ATT・LATE・閾値での効果はそれぞれ別物。誰についての効果かを必ず言う。
- 単一デザインで満足:可能なら複数デザインで三角測量し、頑健性を確認する。
- 感度分析を省く:検証不能な仮定に賭けたなら、その崩れに対する頑健性(第7章の感度分析)まで報告して初めて誠実な因果主張になる。
関連ノート
- 操作変数法と2SLS — 未観測交絡+外生的揺さぶり
- 差分の差分と並行トレンド — 群×時間の変動
- 回帰不連続デザイン — 閾値ルールの変動
- 合成コントロール法 — 単一処置ユニットの政策評価
- なぜRCTが黄金律か — 黄金律と、なぜ準実験が必要になるか
- 二重頑健推定AIPW — 全交絡が観測できる場合の最良の調整