🎓 レベル:標準 | 重要度:A(必須)
📎 前提:バックドア基準と識別 | 識別の仮定
要点(BLUF)
- 因果推論の鉄則は**「推定の前に識別」**。手順は ① 問いの定義 → ② DAG を描く → ③ 識別の仮定の点検(交換可能性・正値性・SUTVA)→ ④ 調整集合の選択(バックドア基準)→ ⑤ 推定法の選択 → ⑥ 感度分析 → ⑦ 仮定とセットで報告。
- DAG が調整集合を決める。良い統制(交絡)だけを入れ、媒介・合流点・処置後変数は入れない(衝突点バイアスと選択バイアス・過剰調整とMバイアス)。
- 同じデータでも調整集合を間違えれば結論は逆に出る。チェックリストを擬似例に通し、正しい調整だけが真値を当てることを数値で確かめる。
1. 全体像:意思決定フロー
flowchart TB
Q["1. 因果の問いを定義(処置・結果・対象集団・推定対象 ATE/ATT)"] --> D["2. DAG を描く(交絡・媒介・合流点を区別)"]
D --> A["3. 識別の仮定を点検(交換可能性・正値性・SUTVA)"]
A --> R{"処置をランダム化できる?"}
R -->|"はい"| RCT["RCT(黄金律)"]
R -->|"いいえ"| OBS{"交絡を十分に観測できる?"}
OBS -->|"はい"| BD["4. バックドア基準で調整集合を選ぶ → 5. 回帰・傾向スコア・AIPW"]
OBS -->|"いいえ"| QE["5. 準実験デザイン(IV・DID・RDD・SCM)"]
RCT --> S["6. 感度分析・頑健性(E値・プラセボ・バンド幅)"]
BD --> S
QE --> S
S --> REP["7. 結論を仮定とセットで報告"]
このフローの背骨は**「識別 → 推定」の順序**だ。先にどんな仮定なら因果と言えるか(識別)を固め、その後で初めてどう数値を出すか(推定)に進む。順序を逆にすると、立派な推定値が出ても何を測ったのか言えなくなる。
2. 各ステップの中身
- 問いの定義:処置 ・結果 ・対象集団・推定対象(全体の平均効果 ATE か、処置群での効果 ATT か)を一文で書く。「効果はあるか」ではなく「誰に対する、何から何への効果か」まで具体化する。
- DAG を描く(因果ダイアグラムとd分離):交絡・媒介・合流点・処置後変数を区別する。変数の役割は相関では決まらない――背景知識で構造を描く。
- 識別の仮定の点検(識別の仮定):
- 交換可能性:観測した で層別すれば処置はランダムと見なせるか(=未観測交絡がないか)。検証不能なので⑥の感度分析で補う。
- 正値性(重なり):どの共変量値でも処置群・対照群の両方が存在するか()。傾向スコアの分布で点検する。
- SUTVA:他人の処置が自分の結果に影響しない(干渉なし)・処置に隠れた多バージョンがない。
- 調整集合の選択(バックドア基準と識別):DAG 上で 以外のバックドアパスをすべて塞ぐ最小集合を選ぶ。媒介・合流点・その子孫は入れない。
- 推定法の選択:ランダム化できればRCT。交絡を十分観測できれば回帰・傾向スコア・AIPW。未観測交絡が残るなら準実験デザイン(IV・DID・RDD・SCM)。
- 感度分析(未観測交絡への感度分析):未観測交絡なら E値、準実験ならプラセボ検定やバンド幅依存性など、残った仮定が崩れたときの揺らぎを定量化する。
- 報告:点推定と区間に加え、置いた仮定・調整集合・感度分析をセットで述べる。仮定を書かない因果主張は不完全。
3. 実証:チェックリストを擬似例に通す
交絡 ・媒介 ・合流点 を仕込んだデータを作る。 は処置前の交絡(入れるべき)、 は媒介(入れてはいけない)、 は処置後の合流点(入れてはいけない)。真の総効果は 。チェックリスト④(正値性点検)と⑤(調整集合の比較)を回す。
import numpy as np
import statsmodels.api as sm
from sklearn.linear_model import LogisticRegression
# === チェックリストを1つの擬似例に適用して通す ===
rng = np.random.default_rng(2026)
n = 40_000
C = rng.normal(0, 1, size=n) # 観測された交絡
X = rng.binomial(1, 1 / (1 + np.exp(-C))) # 処置(C→X)
M = 1.2 * X + rng.normal(0, 1, size=n) # 媒介(X→M)
tau_direct = 1.5
Y = 1.0 * M + tau_direct * X + 2.0 * C + rng.normal(0, 1, size=n)
K = X + Y + rng.normal(0, 1, size=n) # 合流点(X→K←Y)
ATE_total_true = 1.0 * 1.2 + tau_direct # 総効果 = 2.7
# --- 正値性の点検: 傾向スコアが0/1に張り付いていないか ---
e_hat = LogisticRegression().fit(C.reshape(-1, 1), X).predict_proba(C.reshape(-1, 1))[:, 1]
print(f"傾向スコアの範囲 = [{e_hat.min():.3f}, {e_hat.max():.3f}](0/1 から離れていれば正値性OK)")
def x_coef(cols):
design = sm.add_constant(np.column_stack(cols))
return sm.OLS(Y, design).fit().params[1]
print(f"\n真の総効果 = {ATE_total_true:.2f}\n")
print(f"調整なし Y~X : {x_coef([X]):.3f}(交絡 C を無視 → 偏る)")
print(f"正しい調整(Cのみ) Y~X+C : {x_coef([X, C]):.3f}(バックドア基準 → 総効果を回収)")
print(f"媒介Mも調整 Y~X+C+M : {x_coef([X, C, M]):.3f}(過剰調整 → 直接効果に縮む)")
print(f"合流点Kも調整 Y~X+C+K : {x_coef([X, C, K]):.3f}(合流点バイアス → 偏る)")
出力は次の通り。
傾向スコアの範囲 = [0.018, 0.982](0/1 から離れていれば正値性OK)
真の総効果 = 2.70
調整なし Y~X : 4.344(交絡 C を無視 → 偏る)
正しい調整(Cのみ) Y~X+C : 2.710(バックドア基準 → 総効果を回収)
媒介Mも調整 Y~X+C+M : 1.500(過剰調整 → 直接効果に縮む)
合流点Kも調整 Y~X+C+K : 0.247(合流点バイアス → 偏る)
出力の意味――まず正値性の点検。傾向スコアの範囲は で に張り付いておらず、重なりは良好(チェックリスト③合格)。次に調整集合の比較:
- 調整なし:交絡 を無視したので と大きく上振れ。
- 正しい調整( のみ):バックドア基準が選ぶ唯一の交絡 を入れると 、総効果を回収。
- 媒介 も調整:、直接効果()に縮む。過剰調整だ。
- 合流点 も調整: と大崩れ。処置後の合流点を入れて合流点バイアスを呼び込んだ。
同じデータ・同じ推定法(OLS)でも、調整集合の選び方ひとつで結論が から まで動く。正しい答え を当てたのは「DAG が指す だけを入れた」ときだけ。チェックリストの④(バックドア基準)がいかに決定的かが分かる。
4. 報告:結論は仮定とセットで
推定値を出したら、感度分析(未観測交絡への感度分析)まで添えて初めて誠実な因果主張になる。最低限の報告セットは:
- 推定対象(ATE/ATT、誰への効果か)と点推定+信頼区間
- 置いた識別の仮定(交換可能性の根拠・正値性の診断・SUTVA の妥当性)
- 調整集合とその DAG 上の根拠(なぜその変数を入れ/入れなかったか)
- 感度分析(未観測交絡なら E値、準実験ならプラセボ・バンド幅依存性)
- 外的妥当性(この集団・期間・文脈の外へどこまで一般化できるか)
⚠️ よくある誤解・落とし穴
- p 値は因果の証拠ではない。「有意だから効果あり」は交絡・選択・過剰調整のどれでも作れる。識別の仮定が先。
- 「統制変数を増やすほど安心」は誤り。媒介・合流点を足せばバイアスは増える(衝突点バイアスと選択バイアス・過剰調整とMバイアス)。入れる根拠は DAG。
- 推定法の精緻さは識別の弱さを救わない。AIPW でも機械学習でも、未観測交絡や正値性違反があれば等しく偏る。高級な推定量は識別の代わりにならない。
- 外的妥当性を忘れない。内的に正しく識別できても、別の集団・時期・規模へそのまま一般化できるとは限らない。
- DAG は仮定の表明であって真実ではない。描いた構造自体が誤っていれば調整集合も誤る。だからこそ⑥の感度分析で「構造が少し違ったら」を点検する。
関連ノート
- 因果:バックドア基準と識別(調整集合の選択基準)/識別の仮定(交換可能性・正値性・SUTVA)/二重頑健推定AIPW(交絡を観測できるときの推定)/デザインの選び方(未観測交絡が残るときの準実験選択)/未観測交絡への感度分析(手順の最終段・感度分析)/衝突点バイアスと選択バイアス・過剰調整とMバイアス(調整してはいけない変数)
- 統計:フィッシャーの3原則(ランダム化=識別を保証する設計の原点)/重回帰分析(推定の道具・調整は条件付け)