【Juliaで因果推論】Potential Outcomes (潜在的結果変数)
- 分析対象のアウトカム
には2つのpotential outcomesY が想定できるが,現実のデータでは片方のみしか観測されない.\{Y^0, Y^1\} - 分析で知りたい因果効果は平均的な処置効果(ATE, ATT),ナイーブな引き算(
)で因果効果を求めてもselection biasが残るので因果効果を正しく推定できない.E[Y|D=1]-E[Y|D=0] - CIA:
が成り立つとき,selection biasは消える.\{Y^0, Y^1\} \perp D | X - potential outcomesのフレームワークを使ってselection biasがない理想的な状況(CIA)を思い描くことで,必要な分析のデザインが見えてくる.
私たちが答えの知りたい因果関係の"問い"にはいくつかのパターンがありますが[1],ここではまず,「もし〇〇したら
さて,因果効果に迫るためには,「他の条件を一定にしたとき」という考えが重要でした.他の条件を一定を回帰分析の言葉で言うと,「観測されない
Potential Outcomes
What-if な因果関係について考えるときに有用なフレームワークがPotential Outcomes (Splawa-Neyman 1923; D. Rubin 1974)[9]です.このフレームワークでは,各サンプルそれぞれに対して,処置を受けたときの潜在的なアウトカム
Potential outcome notations:
イメージとしては,個人
両方のpotential outcomesが分かれば,因果効果はあっさり求まります.ただし,これは2つの平行世界があればの話です[11].現実では片方のpotential outcomeだけしか観測されません.それでもむりやりpotential outcomesの表記を用いて実際に観測されるアウトカム
ATE, ATT, ATU
さて,各サンプル
Average Treatment Effect:
ここでも,unit specificな処置効果と同様,各サンプルそれぞれに対して両方のpotential outcomes
分析の興味の対象が全母集団ではなく,処置を施したグループ(処置群, treatment group)だけの場合もよくあります[12].処置群の平均処置効果(Average Treatment effect on Treated:
Average Treatment effect for Treatment group:
また,
Average Treatment effect for control group (Untreated group):
ちなみに通常,unit
Simple Difference in mean Outcomes
それでは,Potential Outcomesフレームワークを学ぶ最大の理由,推定方法の議論をしてみましょう.
ここまでかなり抽象的だったので,ここからは具体的な例を使います.がんの手術によって余命がどのくらい伸びるかを考えます.unit
using DataFrames
# if we know both of potential outcome values
df_potential = DataFrame()
df_potential.Y1 = [7, 5, 5, 7, 4, 10, 1, 5, 3, 9]
df_potential.Y0 = [1, 6, 1, 8, 2, 1, 10, 6, 7, 8]
df_potential.δ = df_potential.Y1 - df_potential.Y0
print(df_potential)
# 10×3 DataFrame
# Row │ Y1 Y0 δ
# │ Int64 Int64 Int64
# ─────┼─────────────────────
# 1 │ 7 1 6
# 2 │ 5 6 -1
# 3 │ 5 1 4
# 4 │ 7 8 -1
# 5 │ 4 2 2
# 6 │ 10 1 9
# 7 │ 1 10 -9
# 8 │ 5 6 -1
# 9 │ 3 7 -4
# 10 │ 9 8 1
自分で用意した仮想的なデータなので全て知った状態です.両方のpotential outcomesは手元にあり,unit specificな処置効果
using Statistics
# we know true ATE
ate_true = mean(df_potential.Y1) - mean(df_potential.Y0) # # E[Y1] - E[Y0]
# 0.6
平均的には
# treatments assigned to the patient with longer post-treatment outcome. (chosen by "perfect docter")
df_potential.D = [1, 0, 1, 0, 1, 1, 0, 0, 0, 1] # "perfect docter" treatment assignment
print(df_potential)
# 10×4 DataFrame
# Row │ Y1 Y0 δ D
# │ Int64 Int64 Int64 Int64
# ─────┼────────────────────────────
# 1 │ 7 1 6 1
# 2 │ 5 6 -1 0
# 3 │ 5 1 4 1
# 4 │ 7 8 -1 0
# 5 │ 4 2 2 1
# 6 │ 10 1 9 1
# 7 │ 1 10 -9 0
# 8 │ 5 6 -1 0
# 9 │ 3 7 -4 0
# 10 │ 9 8 1 1
処置が割り振られたので,
# we know true ATT, ATU
att_true = mean(df_potential[df_potential.D .== 1, :Y1]) - mean(df_potential[df_potential.D .== 1, :Y0]) # E[Y1 | D=1] - E[Y0 | D=1]
atu_true = mean(df_potential[df_potential.D .== 0, :Y1]) - mean(df_potential[df_potential.D .== 0, :Y0]) # E[Y1 | D=0] - E[Y0 | D=0]
print(att_true, "\n")
# 4.4
print(atu_true, "\n")
# 3.2
手術をした処置群の真の処置効果
これで真の値は確認できました.しかし,現実のデータにはpotential outcomesはありません.手術をアサインし,その後の患者の余命を観察すると,私たちが手元のデータとして得られるのは以下の表です.
# but we don't ever know both potential outcomes, we can only observe one of the realized factual.
df = DataFrame()
df.D = [1, 0, 1, 0, 1, 1, 0, 0, 0, 1]
switch(D) = D .* df_potential.Y1 + (1 .- D) .* df_potential.Y0 # switching equation
df.Y = switch(df.D)
print(df)
# 10×2 DataFrame
# Row │ D Y
# │ Int64 Int64
# ─────┼──────────────
# 1 │ 1 7
# 2 │ 0 6
# 3 │ 1 5
# 4 │ 0 8
# 5 │ 1 4
# 6 │ 1 10
# 7 │ 0 10
# 8 │ 0 6
# 9 │ 0 7
# 10 │ 1 9
例えば
2つの項ともcounterfactualではなく観測できるので,手元のデータでSDOは計算できます.とりあえずサンプルデータでSDOを推定してみましょう.
# calculate SDO, an estimate of ATE
sdo = mean(df.Y[df.D .== 1, :]) - mean(df.Y[df.D .== 0, :])
# -0.4
SDO decomposition
ただし,
Proof:
見やすくするために,
とすると,
よって,表記を戻すと,
SDOは3つの項に分解(decompose)できることが分かります.まず初めに右辺に
selection bias
heterogeneous treatment effect bias
バイアスの正体がわかったのでバイアスを算出してみましょう.シミュレーションでは2つのpotential outcomesを知っている状態なので,counterfactualを計算することができ,バイアスも計算できます.
# calculate selection bias
sel_bias = mean(df_potential.Y0[df.D .== 1] - df_potential.Y0[df.D .== 0])
# calculate heterogeneous treatment effect bias
π = mean(df.D)
att = mean(df_potential.Y1[df.D .== 1] - df_potential.Y0[df.D .== 1])
atu = mean(df_potential.Y1[df.D .== 0] - df_potential.Y0[df.D .== 0])
het_bias = (1-π) * (att - atu)
print(sel_bias, "\n")
# -4.8
print(het_bias, "\n")
# 3.8
ちなみに,SDO decompositionの左辺(
# check decomposition satisfies
sdo - (ate + sel_bias + het_bias)
# 0
potential outcomesの表記を使って
最後にPotential Outcomesの一連の流れをおさらいします.
- potential outcomes
を書き出す.\{Y^0, Y^1\} - 現実のデータはswithcing equationであることを意識する.
- 求めたい効果(e.g.,
)の推定(e.g., SDO)を,potential outcomesを使って展開する.ATE, ATT, ATU
この「
Refference
Cunningham, S., 2021. Causal inference: the mixtape. Yale University Press.
Pearl, Judea. 2009. Causality. 2nd ed. Cambridge University Press.
Splawa-Neyman, Jerzy. 1923. “On the Application of Probability Theory to Agricultural Experiments. Essay on Principles.” Annals of Agricultural Sciences, 1–51.
Rubin, Donald. 1974. “Estimating Causal Effects of Treatments in Randominzed and Nonrandomized Studies.” Journal of Educational Psychology 66 (5): 688–701.
Angrist, J.D. and Pischke, J.S., 2008. Mostly harmless econometrics. In Mostly Harmless Econometrics. Princeton university press.
-
興味の対象
が連続変数の回帰分析の場合,因果関係の問いは「X が1単位増加したときのX の変化はどのくらいか?」でしたが,ここでは興味の対象となる変数がY の代わりにX または0 の値をとるダミー変数1 である場合をイメージしてください.「D の(もししなかった)ときのD=0 と比べて,Y の(もしした)ときのD=1 はどのくらい変化するか?」となります. ↩︎Y -
同じ議論が連続変数
についても拡張できます. ↩︎X -
因果推論・計量経済学では"処置"という文脈になった瞬間,説明変数の表記は
からX になることが多いです.D には連続変数のイメージがあるからでしょうか. ↩︎X -
例えば,「政策を施す」「新薬を投与する」などがイメージしやすいと思いますが,やるかやらないかの変数なので何でもありです.介入とも呼ばれます. ↩︎
-
雑に言えば「相関していない」 ↩︎
-
厳密には「個人ごとの因果効果の大きさと関係なく」 ↩︎
-
こうなれば回帰なんてしなくても,処置を受けた人のYから処置を受けなかった人のYを引き算すれば処置効果が求まります. ↩︎
-
例えば「大学に行くことの賃金への効果」を推定するために全国の高校3年生に対してコインを振り,大学に行くか行かないかを決めるなんてことは,経済的・倫理的に実現不可能です. ↩︎
-
因果モデルのフレームワークに関しては,Pearl (2009)のGraphical Model(DAG)とSplawa-Neyman (1923); D. Rubin (1974)のPotential Outcomesの2つの派閥が存在しますが,これについては別記事で述べようかと思います.ちなみに経済分野でDAGはあまり使われていない印象です. ↩︎
-
なぜか知りませんが,処置効果はよく
と表します.するかしないかの"差: difference"の\delta から来ているのでしょうか. ↩︎d -
本当に平行世界や時間の巻き戻しができれば,両方のpotential outcomesが観測できるので因果推論で苦労しません. ↩︎
-
新薬を投与した患者における新薬の効果や,政策を実施した地域における政策の効果が知りたいと思うのはいたって普通です. ↩︎
-
新薬を投与しなかった患者へ仮に新薬を投与したときの効果や,政策を実施しなかった地域へ仮に政策を実施したときの効果です. ↩︎
-
雑に言えば,全母集団,処置群,対照群の間では,unit specificな処置効果
の分布は違うと考えるのが自然ということです. ↩︎\delta_i -
ネタばらしすると,
がD (もっと言うと\{Y^1, Y^0\} )に依存しているとSDOはバイアスします.もしY^1-Y^0=\delta_i と関係ない(独立する)ように\{Y^1, Y^0\} をコイン投げで処置をアサインすれば,SDOでもD を正しく計算できます. ↩︎ATE -
興味の対象が
なら,このバイアスは出てきません.(ATT ) ↩︎SDO=ATT + \text{selection bias} -
はデータから簡単に算出できる数値ですが,その数値のうち,何がSDO で何がbiasかは識別できません. ↩︎ATE
Discussion