Causal Foundations / Potential Outcomes
因果推断基础与潜在结果
潜在结果框架把“因果效应”定义为同一单位在处理和未处理两种世界下的结果差异,核心难题是其中一个世界永远缺失。
Mechanism Lab
动画:一个单位为什么缺失一个反事实
动画把每个单位的两个潜在结果画成左右两条轨道,处理分配只点亮其中一条;随后展示估计对象、选择偏误、overlap 与调整路径。
Step 1 / 5
Two worlds
每个单位都有处理和未处理两个潜在结果。
Y_i(1), Y_i(0)Animation Control
Reduced-motion users receive the same step states without continuous motion.
01 / 直觉
核心直觉
预测问题问 E[Y|X];因果问题问如果把同一个单位的处理状态 D 从 0 改成 1,结果 Y 会怎样变化。
每个单位都有两个潜在结果 Y_i(1) 和 Y_i(0),但我们只能观察到 Y_i = D_i Y_i(1) + (1-D_i)Y_i(0)。这就是因果推断的根本缺失数据问题。
识别不是靠更复杂的回归自动完成,而是靠可检验或可辩护的设计假设:SUTVA、可交换性、overlap,以及清楚的估计对象。
02 / 数学
从缺失反事实到可识别估计量
01 / 单位层因果效应
对单位 i,处理效应是它在处理世界和未处理世界下的潜在结果差。这个定义不依赖回归模型,但两个结果不能同时被观察。
tau_i = Y_i(1) - Y_i(0)
Y_i = D_i Y_i(1) + (1-D_i)Y_i(0)02 / SUTVA
稳定单位处理值假设要求没有不同版本的处理,且一个单位的处理不会改变另一个单位的潜在结果。
Y_i(d) does not depend on D_j for j != i03 / 估计对象
总体平均处理效应 ATE、处理组平均处理效应 ATT 和条件平均处理效应 CATE 是不同问题,不能混用解释。
ATE = E[Y(1)-Y(0)]
ATT = E[Y(1)-Y(0) | D=1]
CATE(x)=E[Y(1)-Y(0)|X=x]04 / 天真差异的偏误
观测到的均值差可以分解成 ATT 加选择偏误。偏误来自处理组和对照组未处理潜在结果的平均差。
E[Y|D=1]-E[Y|D=0]
= ATT + {E[Y(0)|D=1]-E[Y(0)|D=0]}05 / 随机化或条件可交换性
若处理独立于潜在结果,组间均值可替代反事实均值。观测研究通常要求在 X 条件下独立。
(Y(1),Y(0)) independent D
or (Y(1),Y(0)) independent D | X06 / Overlap
每个需要推断的 X 区域都必须同时有处理和对照单位,否则数据中没有可比较的反事实。
0 < P(D=1|X=x) < 107 / 标准化识别式
在条件可交换性和 overlap 下,用每个 X 水平内的条件均值恢复两个潜在结果均值,再对 X 分布积分。
E[Y(d)] = E_X{ E[Y | D=d, X] }
ATE = E_X{ mu_1(X) - mu_0(X) }08 / IPW 识别式
也可以用倾向得分 e(X)=P(D=1|X) 重加权,把观测样本改造成两个潜在世界的代表样本。
ATE = E[D Y/e(X)] - E[(1-D)Y/(1-e(X))]03 / 代码
Python 代码:模拟潜在结果、选择偏误与调整
下面的代码构造一个同时含有真实潜在结果和观测数据的模拟实验。真实研究里看不到 `Y0` 和 `Y1`,这里保留它们是为了验证识别公式。
import numpy as np
import pandas as pd
from sklearn.linear_model import LogisticRegression, LinearRegression
rng = np.random.default_rng(42)
n = 5000
# Covariates that affect both treatment selection and outcomes.
x1 = rng.normal(size=n)
x2 = rng.binomial(1, 0.45, size=n)
X = np.column_stack([x1, x2])
# Potential outcomes. In real data, one of these is missing for each unit.
y0 = 2.0 + 0.8 * x1 - 0.5 * x2 + rng.normal(scale=1.0, size=n)
tau = 1.0 + 0.4 * x2
y1 = y0 + tau
# Observational treatment assignment: higher x1 units select into treatment.
logit_e = -0.2 + 1.1 * x1 + 0.6 * x2
e = 1 / (1 + np.exp(-logit_e))
d = rng.binomial(1, e)
y = d * y1 + (1 - d) * y0
df = pd.DataFrame({"Y": y, "D": d, "x1": x1, "x2": x2, "Y0": y0, "Y1": y1})
true_ate = np.mean(y1 - y0)
naive = df.loc[df.D == 1, "Y"].mean() - df.loc[df.D == 0, "Y"].mean()
# Outcome-standardization / g-computation.
mu0_model = LinearRegression().fit(df.loc[df.D == 0, ["x1", "x2"]], df.loc[df.D == 0, "Y"])
mu1_model = LinearRegression().fit(df.loc[df.D == 1, ["x1", "x2"]], df.loc[df.D == 1, "Y"])
mu0_hat = mu0_model.predict(df[["x1", "x2"]])
mu1_hat = mu1_model.predict(df[["x1", "x2"]])
standardized_ate = np.mean(mu1_hat - mu0_hat)
# IPW using an estimated propensity score.
ps_model = LogisticRegression(max_iter=2000).fit(df[["x1", "x2"]], df["D"])
e_hat = ps_model.predict_proba(df[["x1", "x2"]])[:, 1]
e_hat = np.clip(e_hat, 0.02, 0.98)
ipw_ate = np.mean(df["D"] * df["Y"] / e_hat) - np.mean((1 - df["D"]) * df["Y"] / (1 - e_hat))
balance = df.assign(weight=np.where(df.D == 1, 1 / e_hat, 1 / (1 - e_hat))).groupby("D").apply(
lambda g: pd.Series({
"x1_weighted_mean": np.average(g["x1"], weights=g["weight"]),
"x2_weighted_mean": np.average(g["x2"], weights=g["weight"]),
})
)
print({
"true_ate": round(true_ate, 3),
"naive_difference": round(naive, 3),
"standardized_ate": round(standardized_ate, 3),
"ipw_ate": round(ipw_ate, 3),
})
print(balance)04 / 案例
案例:在线课程对学习成绩的因果效应
- 研究问题:参加 StatsPAI 在线训练营是否提高学生后续项目成绩?不能只比较参加者和未参加者,因为主动报名者可能原本基础更强、时间更多、动机更高。
- 潜在结果定义:Y_i(1) 是同一学生参加训练营后的项目成绩,Y_i(0) 是同一学生未参加时的成绩。真实数据只看到一个。
- 若课程名额随机分配,可交换性来自设计;若是自选报名,需要明确 X 是否足以控制选择偏误,并检查 overlap。
- 报告应先声明估计对象是 ATE、ATT 还是某个 CATE,再展示样本流、基线平衡、overlap 图、调整模型、敏感性分析和不能解释的选择机制。
05 / 风险
常见误区
参考资料
- Rubin (1974), Estimating Causal Effects of Treatments in Randomized and Nonrandomized Studieshttps://doi.org/10.1037/h0037350
- Holland (1986), Statistics and Causal Inferencehttps://doi.org/10.1080/01621459.1986.10478354
- Hernan and Robins, Causal Inference: What Ifhttps://www.hsph.harvard.edu/miguel-hernan/causal-inference-book/
- Imbens and Rubin, Causal Inferencehttps://www.cambridge.org/core/books/causal-inference-for-statistics-social-and-biomedical-sciences/71126BE90C58F1A431FE9B2DD07938AB