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 != i

03 / 估计对象

总体平均处理效应 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 | X

06 / Overlap

每个需要推断的 X 区域都必须同时有处理和对照单位,否则数据中没有可比较的反事实。

0 < P(D=1|X=x) < 1

07 / 标准化识别式

在条件可交换性和 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 / 风险

常见误区

把相关性、预测准确率或显著回归系数直接称为因果效应。
没有先说明估计对象,导致 ATE、ATT、CATE 在解释里混在一起。
只列出控制变量,却不说明为什么这些变量足以让处理近似随机。
忽略 overlap,在没有可比对照的 X 区域外推因果效应。
遗漏 SUTVA:例如同学之间互相影响、课程版本不同或平台推荐改变了对照组行为。

参考资料