Causal Design / Assignment Mechanisms
RCT 与准实验设计
RCT 用可控随机化创造可交换性;准实验则从制度规则、阈值、抽签、时间冲击或政策边界中寻找近似随机的处理分配机制。
Mechanism Lab
动画:处理分配机制如何创造因果证据
动画把样本先放入基线 block,再展示随机分配、差均值估计、非依从路径和准实验规则,突出“识别来自分配机制”。
Step 1 / 5
Eligible sample
先定义进入实验或制度规则的样本和 block。
i=1,...,N; blocks bAnimation Control
Reduced-motion users receive the same step states without continuous motion.
01 / 直觉
核心直觉
好的因果设计先回答“谁为什么接受处理”,再回答“效果是多少”。如果分配机制可信,简单差异也可能有强解释力。
RCT 的强处是研究者控制 Z 或 D 的分配,使处理组和对照组在期望上拥有相同的潜在结果分布。
准实验不是“没有随机化也随便回归”,而是把某个外生规则当作自然分配机制,并围绕这个规则做诊断、安慰剂检验和稳健性分析。
02 / 数学
从随机分配到准实验识别
01 / 完全随机实验
在 N 个单位中固定抽取 N1 个进入处理组,其余 N0 个进入对照组。潜在结果表在分配前已经固定,随机性只来自 D。
sum_i D_i = N_1, N_0=N-N_1
Y_i^obs = D_i Y_i(1) + (1-D_i)Y_i(0)02 / 可交换性
随机化保证分配与潜在结果独立,因此处理组平均观测结果在期望上等于处理潜在结果总体平均。
D independent (Y(1),Y(0))
E[bar Y_1^obs] = bar Y(1), E[bar Y_0^obs] = bar Y(0)03 / 差均值无偏性
差均值估计量的期望等于有限总体 ATE。这是 RCT 最核心的数学保证。
tau_hat = (1/N_1) sum_{D_i=1} Y_i^obs - (1/N_0) sum_{D_i=0} Y_i^obs
E_D[tau_hat] = (1/N) sum_i {Y_i(1)-Y_i(0)}04 / Neyman 方差
在完全随机化下,差均值方差由两个潜在结果方差和个体效应异质性共同决定。由于 S_tau^2 不可观测,常用保守方差估计。
Var(tau_hat) = S_1^2/N_1 + S_0^2/N_0 - S_tau^2/N
V_hat = s_1^2/N_1 + s_0^2/N_005 / 随机化推断
在 sharp null 下,所有单位的处理和对照潜在结果相同或相差 tau0,因此可以枚举或模拟所有可能分配,得到精确 p 值。
H_0: Y_i(1)-Y_i(0)=tau_0 for all i
p = Pr_D(|T(D)| >= |T(D_obs)| | H_0)06 / 分层随机化
先在基线风险、学校或地区等 block 内随机,再按 block 规模加权合并,可以减少因样本偶然不平衡带来的方差。
tau_hat_blocked = sum_b (N_b/N) tau_hat_b07 / 非依从与 ITT/LATE
当随机的是鼓励或名额 Z,而实际参与 D 可能不完全服从时,先报告 ITT;若满足排除限制、单调性和相关性,可用 Z 作为工具变量识别 complier LATE。
ITT_Y = E[Y|Z=1]-E[Y|Z=0]
ITT_D = E[D|Z=1]-E[D|Z=0]
LATE = ITT_Y / ITT_D08 / 准实验设计
准实验的关键不是模型复杂度,而是分配机制是否让处理在某个局部、时间窗口或制度边界附近近似随机。
assignment rule -> as-if random variation -> diagnostic checks -> causal estimand03 / 代码
Python 代码:RCT、随机化推断、分层和非依从
下面代码用模拟数据展示四件事:RCT 差均值估计、随机化推断 p 值、分层随机化估计、以及有非依从时的 ITT 和 LATE。
import numpy as np
import pandas as pd
rng = np.random.default_rng(123)
n = 800
school = rng.integers(0, 8, size=n)
baseline = rng.normal(0, 1, size=n) + 0.25 * school
# Fixed potential outcomes.
y0 = 50 + 5 * baseline + rng.normal(0, 4, size=n)
tau = 3.0 + 1.2 * (baseline < 0)
y1 = y0 + tau
true_ate = np.mean(tau)
# Complete random assignment.
n1 = n // 2
d = np.zeros(n, dtype=int)
d[rng.choice(n, size=n1, replace=False)] = 1
y = d * y1 + (1 - d) * y0
def diff_in_means(outcome, treat):
return outcome[treat == 1].mean() - outcome[treat == 0].mean()
tau_hat = diff_in_means(y, d)
se_neyman = np.sqrt(y[d == 1].var(ddof=1) / d.sum() + y[d == 0].var(ddof=1) / (n - d.sum()))
# Randomization inference under the sharp null of no effect.
observed_t = diff_in_means(y, d)
null_stats = []
for _ in range(5000):
d_perm = np.zeros(n, dtype=int)
d_perm[rng.choice(n, size=n1, replace=False)] = 1
null_stats.append(diff_in_means(y, d_perm))
p_value = np.mean(np.abs(null_stats) >= abs(observed_t))
# Blocked estimate: compare within school, then aggregate.
df = pd.DataFrame({"Y": y, "D": d, "school": school})
blocked = (
df.groupby("school")
.apply(lambda g: pd.Series({
"n": len(g),
"tau_b": diff_in_means(g["Y"].to_numpy(), g["D"].to_numpy())
}))
.reset_index()
)
tau_blocked = np.average(blocked["tau_b"], weights=blocked["n"])
# Noncompliance: randomized offer Z, actual take-up D.
z = np.zeros(n, dtype=int)
z[rng.choice(n, size=n1, replace=False)] = 1
complier = rng.binomial(1, 0.72, size=n)
always_taker = rng.binomial(1, 0.08, size=n)
d_actual = np.maximum(always_taker, z * complier)
y_nc = y0 + d_actual * tau + rng.normal(0, 2, size=n)
itt_y = diff_in_means(y_nc, z)
itt_d = diff_in_means(d_actual, z)
late = itt_y / itt_d
print({
"true_ate": round(true_ate, 3),
"rct_tau_hat": round(tau_hat, 3),
"neyman_se": round(se_neyman, 3),
"randomization_p": round(p_value, 4),
"blocked_tau_hat": round(tau_blocked, 3),
"itt_y": round(itt_y, 3),
"itt_d": round(itt_d, 3),
"late_wald": round(late, 3),
})04 / 案例
案例:教育训练营的名额抽签与准实验扩展
- 研究问题:一个暑期数据训练营是否提升后续项目成绩?若报名人数超过名额,可以用抽签 offer 作为随机鼓励。
- 主分析先报告 ITT:被抽中获得名额的学生平均成绩是否提高。这对应政策问题“发放名额/邀请”的效果。
- 若部分被抽中者没有参加,部分未抽中者通过其他渠道参加,则实际参与 D 不是完全随机;在排除限制和单调性可辩护时,可用 offer Z 估计 complier LATE。
- 如果没有抽签,而是按分数线、地区试点、年级批次或政策时间实施,就进入准实验:必须解释这个制度规则为何在局部或时间窗口内近似随机。
- 可信报告需要包括实验流程图、预注册/样本流、基线平衡、attrition、非依从、spillover、multiple testing、随机化推断或聚类稳健标准误,以及所有偏离原设计的说明。
05 / 风险
常见误区
参考资料
- Fisher (1935), The Design of Experimentshttps://archive.org/details/designofexperime00fish
- Neyman (1990 translation), On the Application of Probability Theory to Agricultural Experimentshttps://doi.org/10.1214/ss/1177012031
- Duflo, Glennerster, and Kremer (2007), Using Randomization in Development Economics Researchhttps://doi.org/10.1016/S1573-4471(07)04061-2
- Gerber and Green, Field Experimentshttps://wwnorton.com/books/Field-Experiments/