🎓 レベル:発展 | 重要度:B(標準)
📎 前提:因果ダイアグラムとd分離 | バックドア基準と識別 | 関連:反事実とPearlの因果の階梯
要点(BLUF)
- SCM(構造的因果モデル) は「各変数 = 親 + 外生ノイズ」という構造方程式の集合です。矢印つきの DAG(因果ダイアグラムとd分離)に、生成のメカニズムまで与えたものと考えられます。
- 介入 は「 の構造方程式を消して を外から に固定する」操作(グラフ手術)。これにより観測分布 と介入分布 は別物になります。前者は「 だった人を見る」、後者は「全員に をする」。
- do計算の三規則からバックドア調整公式 が導けます。構造方程式で擬似データを作り、do介入が真の因果効果を当て、素朴な条件付き差がズレることを数値で確認します。
1. SCM:DAG に生成メカニズムを与える
構造的因果モデル(Structural Causal Model, SCM) は4つ組 です。
- :内生変数(観測する変数)
- :外生変数(モデル外の要因=ノイズ)。互いに独立とします(マルコフ的 SCM)
- :構造方程式。各内生変数は自分の親と外生ノイズの関数
- :外生ノイズの分布
たとえば交絡 ・処置 ・結果 なら、次の3本が SCM です。
この構造は下の DAG に対応します。 と があるので、 というバックドアパスが開いています。
flowchart LR
C["交絡 C"] --> X["処置 X"]
C --> Y["結果 Y"]
X --> Y
外生ノイズが独立なら、同時分布は親への条件付き分布の積に分解されます(因果マルコフ条件、因果ダイアグラムとd分離)。
DAG は「どの変数が誰の親か」だけを描き、SCM は「親からどう生成されるか( と )」まで指定します。do演算子の意味は、この生成メカニズムまで踏み込まないと定義できません。
2. do演算子:構造方程式を1本だけ書き換える
知りたいのは「 を外から操作したら がどうなるか」です。SCM ではこれを、 の構造方程式 を捨て、 を定数 で置き換えた新しいモデル で定義します。
グラフでいえば、 に入ってくる矢印をすべて切る操作です( が消える)。これをグラフ手術(graph surgery) と呼びます。残りの方程式はそのままなので、介入後の DAG は次のようになります。
flowchart LR
C["交絡 C"] --> Y["結果 Y"]
X["処置 X = x(外から固定)"] --> Y
この手術後のモデルが定める分布が介入分布 です。同時分布は、 の因子を落とした切断積(truncated product) になります。
ここがポイントです。観測分布の分解 と比べると、 という「 が を選ぶ」因子だけが消えています。観測では「 の高い人ほど になりやすい」という相関が残るのに対し、 は を外から決めるのでその相関が断たれるのです。 を周辺化すると介入分布の核心式が出ます。
これがまさにバックドア調整公式であり、バックドア基準と識別で潜在結果から導いた g公式と完全に一致します。観測の条件付き分布は対照的に
で、重みが ではなく です。 と が相関する()かぎり、両者はズレます。これが「見る する」の数式表現です。
3. do計算でバックドア調整を導く
Pearl のdo計算(do-calculus) は、 を含む式を変形するための3つの規則です。 は「 へ入る矢印を消したグラフ」、 は「 から出る矢印を消したグラフ」を表します。
- 規則1(観測の挿入・削除): なら
- 規則2(介入と観測の交換): なら
- 規則3(介入の挿入・削除): なら
これでバックドア調整を導きます。 がバックドア基準を満たす( の非子孫で、すべてのバックドアパスを塞ぐ)とします。まず全確率の法則で を挟みます。
第2因子に規則3を使います。 は の非子孫なので、 に介入しても の分布は変わりません( で )。
第1因子に規則2を使います。 がすべてのバックドアパスを塞ぐので、 から出る矢印を消したグラフ で 。したがって を観測 に置き換えられます。
ふたつを戻すと、バックドア調整公式が出ます。
潜在結果(潜在結果モデル)と SCM という別々の言語が、同じ識別公式に行き着く。これが因果推論の2大枠組みの一致点です。なお do計算は完全(complete) であることが知られ、「 を含む量が観測分布だけで書けるか(識別可能か)」は三規則の有限回適用で判定できます(フロントドア基準などバックドアで届かない識別もここから出ます。do計算の完全性は確立した結果です)。
4. 擬似データで「見る≠する」を数値化する
構造方程式から擬似データを作り、(1) 観測の条件付き差、(2) バックドア調整、(3) do介入のシミュレーションを比べます。交絡 を二値にして、バックドア調整公式を 2 項の和としてそのまま実装します。真の効果は です。
import numpy as np
# === SCMから観測分布と介入分布を作り、do(X)が真の因果効果を当てることを確かめる ===
rng = np.random.default_rng(2026)
n = 40000
ATE_true = 2.0
# --- 構造方程式(SCM): 各変数を「親 + 外生ノイズ」で生成 ---
# 交絡 C(例:重症度。値1ほど治療されやすく、結果も底上げ)
C = rng.binomial(1, 0.5, size=n)
# 処置 X は C に依存(C=1なら受けやすい) ... これがバックドアパス X←C→Y
prob_treat = np.where(C == 1, 0.8, 0.2)
X = rng.binomial(1, prob_treat)
# 結果 Y = 1 + tau*X + 3*C + ノイズ
Y = 1.0 + ATE_true * X + 3.0 * C + rng.normal(0.0, 1.0, size=n)
# (1) 観測分布での素朴な条件付き差 E[Y|X=1]-E[Y|X=0]
naive = Y[X == 1].mean() - Y[X == 0].mean()
# (2) バックドア調整公式 Σ_c (E[Y|X=1,c]-E[Y|X=0,c]) P(c)
p_c1 = (C == 1).mean()
p_c0 = (C == 0).mean()
eff_in_c1 = Y[(X == 1) & (C == 1)].mean() - Y[(X == 0) & (C == 1)].mean()
eff_in_c0 = Y[(X == 1) & (C == 0)].mean() - Y[(X == 0) & (C == 0)].mean()
backdoor = eff_in_c1 * p_c1 + eff_in_c0 * p_c0
# (3) 介入分布 P(Y|do(X)): Xの構造方程式を消し、全員のXを外から固定して Y を再生成
# Cの分布は介入で変わらない(C は X の上流) → C←X 辺だけが切れる
Y_do1 = 1.0 + ATE_true * 1 + 3.0 * C + rng.normal(0.0, 1.0, size=n)
Y_do0 = 1.0 + ATE_true * 0 + 3.0 * C + rng.normal(0.0, 1.0, size=n)
do_effect = Y_do1.mean() - Y_do0.mean()
print(f"真の ATE : {ATE_true:.2f}")
print(f"(1) 観測 E[Y|X=1]-E[Y|X=0] : {naive:.2f} (交絡で過大)")
print(f"(2) バックドア調整 Σ_c ... P(c) : {backdoor:.2f}")
print(f"(3) 介入 E[Y|do(1)]-E[Y|do(0)] : {do_effect:.2f}")
print(f" 各層の効果: C=1で{eff_in_c1:.2f} / C=0で{eff_in_c0:.2f} P(C=1)={p_c1:.2f}")
print(f" 処置群のC=1割合={C[X==1].mean():.2f} 対照群のC=1割合={C[X==0].mean():.2f}")
実行すると次のように印字されます。
真の ATE : 2.00
(1) 観測 E[Y|X=1]-E[Y|X=0] : 3.79 (交絡で過大)
(2) バックドア調整 Σ_c ... P(c) : 1.97
(3) 介入 E[Y|do(1)]-E[Y|do(0)] : 2.01
各層の効果: C=1で1.99 / C=0で1.96 P(C=1)=0.50
処置群のC=1割合=0.80 対照群のC=1割合=0.20
出力の意味:素朴な条件付き差 は真値 を大きく上回ります。理由は最後の行に出ています——処置群は 80% が 、対照群は 20% が と構成が偏り、 は を 押し上げるので、群間の の差が処置効果に上乗せされるのです。これが観測分布の重み が効いた結果です。一方、バックドア調整 と do介入 はどちらも真値 にほぼ一致します。バックドア調整は層内の効果( で 、 で )を で重みづけし、do介入は を外から固定して を断つ——別ルートで同じ真値に到達しました。第2項と第3項が一致するのは、まさに前節で導いた等式 が成り立っているからです。
5. 仮定の直観的意味:なぜ「矢印を切る」のか
で への矢印を切るのは、「外からの操作は、 を本来決めていた原因( や )を迂回する」からです。医師が重症度 を見て薬 を出す世界では がありますが、私たちがコインで を割り当てれば、 はもう を決めません。ランダム化(なぜRCTが黄金律か)は、この をデータ収集の段階で物理的に実装する行為にほかなりません。do演算子は「もし をランダム化していたら何が起きるか」を、観測データと SCM から計算するための代数なのです。
そして観測データだけから を計算できる(識別できる)ための条件が、バックドアパスを塞ぐ調整集合の存在です。塞げない未観測交絡があれば は観測分布で書けず、do計算は「識別不能」と正しく答えます。
⚠️ よくある誤解・落とし穴
- と を混同しない。前者は条件づけ(見る)、後者は介入(する)。両者が一致するのは交絡がない()か、ランダム化したときだけです。記号の を省くと、この致命的な差が見えなくなります。
- 「全変数を入れれば になる」ではない。 の子孫(媒介・因果ダイアグラムとd分離の合流点)を調整に入れると、バックドア基準が崩れて新たなバイアスが生じます。切るのは に入る矢印だけで、調整してよいのはバックドア基準を満たす集合だけです(媒介分析の過剰調整、過剰調整とMバイアス)。
- SCM は仮定。構造方程式と矢印の向きは分野知識で入れるもので、データから自動では出ません(向きの探索は因果探索の概観)。do計算は「この SCM が正しければ」という条件つきの結論を返します。
- 識別可能でも推定誤差は別。do計算が「識別可能」と言っても、有限データでは層が薄い・正値性が危ういと推定は不安定になります(逆確率重み付けIPW)。識別と推定は分けて考えます。
関連ノート
- 因果:因果ダイアグラムとd分離(DAG と因果マルコフ条件)/バックドア基準と識別(同じ調整公式を潜在結果から)/潜在結果モデル(もう一つの因果の言語)/反事実とPearlの因果の階梯(do の上の段=反事実)/媒介分析(do を使った効果分解)/なぜRCTが黄金律か(do の物理的実装)
- 統計:構造方程式モデル・パス解析(構造方程式とパス図)
- 第6章 ベイズと構造的因果 目次