
第 3 周:面板数据与经典双重差分法
中国人民大学商学院
2026-05-16
核心要点
本节课目标
四个串联的环节
提示
下周预告:W4 会把 2×2 扩展到多期、多批次(staggered)——届时 TWFE 会悄悄失效,我们要用更加现代估计量。
面板数据(Panel Data)
同一批单位(个体 / 企业 / 城市 / 国家)在多个时期被重复观测:
\{Y_{it}, X_{it}\}_{i=1,\dots,N;\ t=1,\dots,T_i}
为什么值得单独开一讲?
考虑基础回归: Y_{it} = X_{it}^\prime \beta + \theta_i + \varepsilon_{it}
混合 OLS 的致命伤
若 \theta_i 与 X_{it} 相关(“能力”“地理”“文化”等),混合 OLS 估计有偏:
\hat{\beta}_{POLS} = \beta + \frac{\operatorname{Cov}(X_{it},\, \theta_i)}{\operatorname{Var}(X_{it})}
固定效应的核心思想
如果我们能“去除” \theta_i,那么与它相关的遗漏变量偏误就消失了。这正是固定效应估计的核心思想。
Within 变换
对每个个体 i 计算时间(组内)均值 \bar{Y}_i, \bar{X}_i,然后用偏差代替原值:
(Y_{it} - \bar{Y}_i) = (X_{it} - \bar{X}_i)^\prime \beta + (\varepsilon_{it} - \bar{\varepsilon}_i)
一阶差分(First Difference, FD)
Y_{it} - Y_{i,t-1} = (X_{it} - X_{i,t-1})^\prime \beta + (\varepsilon_{it} - \varepsilon_{i,t-1})
两期数据下,FE 估计量与 FD 估计量完全等价(作业:自行验证)。
分解样本变异
\operatorname{Var}(X_{it}) = \underbrace{\sum_i \sum_t (X_{it} - \bar{X}_i)^2}_{\text{组内变异}} + \underbrace{\sum_i T_i (\bar{X}_i - \bar{X})^2}_{\text{组间变异}}
FE 只使用组内变异——当 X_{it} 变化很小时,组内变异稀少,估计量方差大。
测量误差放大
若 X_{it} 包含测量误差 u_{it},差分后的信噪比恶化:
\hat{\beta}^{FE}_{bias} = \frac{\operatorname{Var}(X^*_{it} - \bar{X}^*_i)}{\operatorname{Var}(X^*_{it} - \bar{X}^*_i) + \operatorname{Var}(u_{it} - \bar{u}_i)}\beta
这就是衰减偏误(Attenuation Bias)

提示
当 \theta_i 与 X_{it} 无关(RE 假设成立)且组内变异稀少时:
| 维度 | 随机效应(RE) | 固定效应(FE) |
|---|---|---|
| 对 \theta_i 的假设 | E(\theta_i \mid X_i)=0(与 X 无关) | 不作任何假设 |
| 估计效率 | 在假设成立时更有效 | 总是一致(无偏) |
| 何时首选 | 样本 N 大且 \theta_i 与 X 独立 | 担心遗漏变量时 |
| 检验工具 | Hausman 检验 | — |
提示
实操建议
在政策评估研究中,默认使用 FE——几乎不可能说服审稿人“我的随机效应假设成立”。只有在数据天然满足 RE 假设(随机抽样、无系统性选择)时,才考虑 RE。
核心思想
比较两个估计量:RE(H_0 下一致且有效)与 FE(始终一致但效率较低)。
若二者系统性偏离 → H_0 不成立 → 选 FE。
H_0: E(\theta_i \mid X_{it}) = 0 \quad \text{(个体效应与解释变量无关)}
检验统计量:
H = (\hat{\beta}_{FE} - \hat{\beta}_{RE})' \left[\widehat{Var}(\hat{\beta}_{FE}) - \widehat{Var}(\hat{\beta}_{RE})\right]^{-1} (\hat{\beta}_{FE} - \hat{\beta}_{RE}) \;\sim\; \chi^2(k)
实操建议
hausman fe_model re_model, sigmamore最天真的 OLS 假设
“不同时期的误差独立”——在面板里几乎总是错的。
E(u_{it} u_{is}) = 0,\ \forall\, t \neq s \quad \text{(疯狂的假设!)}
序列相关的来源
后果:标准误被严重低估,t 值被放大,假阳性率飙升——这正是本讲后半部分 Monte Carlo 模拟要验证的核心现象。
问题:不能直接“比较政策前后”
2012 年某省实施环保新政,企业排放下降了。这是政策效果,还是:
DiD 的核心思想
找一个未受政策影响的对照组,用对照组的前后变化作为“如果没有政策”的反事实(counterfactual)基准:
\hat{\tau}_{DiD} = \underbrace{(\bar{Y}_{T,\text{post}} - \bar{Y}_{T,\text{pre}})}_{\text{处理组变化}} - \underbrace{(\bar{Y}_{C,\text{post}} - \bar{Y}_{C,\text{pre}})}_{\text{控制组变化}}
新泽西最低工资实验
背景:1992 年新泽西(NJ)把最低工资从 $4.25 提到 $5.05;宾夕法尼亚(PA)保持不变。
设计:调查 NJ 与 PA 东部 410 家快餐店,政策前后各一次就业人数数据。
结果:DiD 估计显示 NJ 就业未下降(甚至略升)——挑战“最低工资必减少就业”的教科书结论。
提示
为什么这篇论文成了经典
注记
最低工资文献
David Neumark and William Wascher, “Minimum Wages and Employment: A Review of Evidence from the New Minimum Wage Research,” NBER Working Paper 12663 (2006), https://doi.org/10.3386/w12663.
Hau, Harald, Yi Huang, and Gewei Wang. “Firm response to competitive shocks: Evidence from China’s minimum wage policy.” The Review of Economic Studies 87.6 (2020): 2639-2671.
潜在结果符号
平均处理效应(ATT)
\tau_{ATT} = E[Y_{it}(1) - Y_{it}(0) \mid D_i = 1,\, t = \text{post}]
DiD 在平行趋势假设下识别 ATT。
平行趋势(Parallel Trends)
若无处理,处理组与控制组的结果变化趋势相同:
\underbrace{E[Y_{it}(0)\mid D=1, \text{post}] - E[Y_{it}(0)\mid D=1, \text{pre}]}_{\text{处理组反事实变化}}
=\underbrace{E[Y_{it}(0)\mid D=0, \text{post}] - E[Y_{it}(0)\mid D=0, \text{pre}]}_{\text{控制组实际变化}}
不可直接检验
我们只能检验处理之前的趋势是否平行(预趋势检验)——但这不能保证处理之后的反事实趋势仍然平行。预趋势检验是必要不充分的条件。
双向固定效应回归(Two-Way Fixed Effects, TWFE)
Y_{it} = \alpha_i + \lambda_t + \tau D_{it} + \varepsilon_{it}
经典 2×2 设定下(一个处理组 + 一个控制组,处理前后各一期)
\hat{\tau}_{TWFE} = (\bar{Y}_{T,1} - \bar{Y}_{T,0}) - (\bar{Y}_{C,1} - \bar{Y}_{C,0}) = \hat{\tau}_{DiD}
TWFE 回归系数恰好等于 DiD 估计量——这是后面现代 DiD 讨论的出发点。
np.random.seed(42)
n_units, n_periods = 200, 10
treat_period = 5
unit_fe = np.random.normal(0, 2, n_units)
time_fe = np.linspace(0, 3, n_periods)
treated = np.arange(n_units) < 100 # 前 100 个单位为处理组
rows = []
for i in range(n_units):
for t in range(n_periods):
d = 1 if (treated[i] and t >= treat_period) else 0
y = unit_fe[i] + time_fe[t] + 2.5 * d + np.random.normal(0, 1)
rows.append({'unit': i, 'time': t, 'treated': treated[i], 'D': d, 'Y': y})
df = pd.DataFrame(rows)
means = df.groupby(['treated', 'time'])['Y'].mean().unstack(level=0)
did = (means[True].iloc[-1] - means[True].iloc[treat_period - 1]) \
- (means[False].iloc[-1] - means[False].iloc[treat_period - 1])
print(f"DiD 估计量 = {did:.3f}(真实效应 = 2.5)")DiD 估计量 = 2.272(真实效应 = 2.5)

图形直觉:处理组在处理点后与控制组路径“分叉”,分叉幅度即 DiD 估计量。
事件研究回归(Event Study)
Y_{it} = \alpha_i + \lambda_t + \sum_{k=-K,\ k \neq -1}^{L} \beta_k \cdot \mathbf{1}(t - g_i = k) + \varepsilon_{it}
两大用途
重复横截面也能跑 DiD
只要我们观察到组层面的 (\text{group}, \text{time}) 结构,DiD 回归就成立:
Y_i = \alpha_0 + \tau \cdot (g_i \times t_i) + \delta t_i + \gamma g_i + \varepsilon_i
提示
面板数据的“奢侈品”优势
安慰剂检验(Placebo Test)
如果“假政策”也显示显著效应 → 平行趋势很可疑
组别特定时间趋势
加入 \text{group} \times \text{time trend} 控制组间差异化趋势:
Y_{it} = \alpha_i + \lambda_t + \tau D_{it} + \gamma_i \cdot t + \varepsilon_{it}
模拟设定: 300 个个体、8 期面板;一半在第 6 期“受处理”. 真实政策效应设为 0,但处理组有一条未观测的缓慢上升趋势. 考虑两种 placebo:

提示
最常见的三种展示
| 规格 | 估计值 | RI p-value | 解读 | |
|---|---|---|---|---|
| 0 | 基准 DiD | 0.778 | — | 真实政策效应明明为 0,但仍估到正效应 |
| 1 | 提前 2 期 placebo | 0.785 | — | 政策前已经出现“假效应” |
| 2 | 随机分配 placebo | — | 0.000 | 真实分配下的估计值落在随机分布尾部 |
| 3 | + 组别线性趋势 | 0.037 | — | 加上 trend 后,主效应明显回落 |
提示
提示
一、双差分、事件研究等双向固定效应模型中的平行趋势假设
1. 概念说明
(1)反事实基础与不可直接检验性
平行趋势假设本质上是一种反事实假设,即假定处理组若未受到干预,其趋势应与对照组一致。然而,由于无法同时观测到处理组的“处理”和“未处理”两种状态,因此平行趋势假设无法被直接检验。我们只能通过事前趋势(pre-treatment trends)的相似性提供间接支持,但无法直接验证这种反事实假设。
(2)事前趋势与平行趋势的关系
事前趋势的相似性既不是平行趋势的必要条件(例如,即便处理前趋势不同,处理后的趋势仍可能满足平行趋势),也不是充分条件(即便处理前趋势一致,处理后的不可观测因素仍可能导致趋势的差异)。因此,事前趋势的检验只能提供提示性证据(suggestive evidence),不能表述为“通过了检验”。
2. 修改建议
(1)小标题避免使用“平行趋势检验”,建议使用“事前趋势检验”或“平行趋势假设评估”等。
(2)正文中避免使用“通过了平行趋势检验”等表述,建议使用“未拒绝事前趋势平行的假设”、“数据分析结果与平行趋势假设一致”或类似措辞。
核心问题 即使事前系数”不显著”,也不能证明平行趋势成立——这可能只是检验力不足(low power)的结果。
Rambachan & Roth (ReStat, 2023) 提出两种放松平行趋势的思路:
思路 A:相对幅度(Relative Magnitudes)
\Delta^{RM}(\bar{M}): \quad |\delta_{post}| \;\leq\; \bar{M}\,\cdot\,\max_{t<0}|\delta_t|
思路 B:平滑性约束(Smoothness)
\Delta^{SD}(M): \quad |(\delta_{t+1}-\delta_t) - (\delta_t-\delta_{t-1})| \leq M
提示
关键输出
R(HonestDiD 包)
# 第1步:TWFE 事件研究回归
library(fixest)
mod <- feols(dins ~ i(Dyear, ref = 2013) |
stfips + year,
cluster = ~stfips, data = df)
# 第2步:提取系数与方差矩阵
betahat <- coef(mod) # 事件研究系数
sigma <- vcov(mod) # 方差-协方差矩阵
# 第3步:相对幅度敏感性分析
library(HonestDiD)
sens_rm <- createSensitivityResults_relativeMagnitudes(
betahat = betahat, sigma = sigma,
numPrePeriods = 5,
numPostPeriods = 2,
Mbarvec = seq(0.5, 2, by = 0.5))
# 第4步:绘制敏感性图
createSensitivityPlot_relativeMagnitudes(
sens_rm, rescaleFactor = 0.01,
OLS_CI = c(betahat[6] - 1.96*sqrt(sigma[6,6]),
betahat[6] + 1.96*sqrt(sigma[6,6])))Stata(honestdid 包)
remotes::install_github("asheshrambachan/HonestDiD")ssc install honestdid 或 net install honestdid, from("https://raw.githubusercontent.com/mcaceresb/stata-honestdid/main")解读击穿值:如果相对幅度的击穿值 \bar{M} \approx 2,意味着只要处理后的平行趋势违反不超过处理前最大违反的 2 倍,DID 估计的符号就不会翻转——这是相当稳健的结果。
典型的 HonestDiD 输出是一张敏感性图(sensitivity plot)

读图三步法:
① 看 \bar{M}=0(最左端)
② 看 CI 何时跨零线
③ 判断稳健程度
| 击穿值 | 解读 |
|---|---|
| < 0.5 | 脆弱:结论依赖严格平行趋势 |
| 0.5–1 | 一般:允许中等违反 |
| 1–2 | 较强:处理后偏离≤处理前最大偏离的1–2倍 |
| > 2 | 很强:结论极难被推翻 |
提示
审稿人视角:在论文中报告 HonestDiD 敏感性图 + 击穿值,已逐渐成为 top field journals 的 DID 稳健性标准配置(参见 Roth et al., JoE 2023 综述)。
考虑个体层面模型:
Y_{i}=\alpha\tau_{t_{i}}(g_i)+Z_{i}'\delta+X'_{g_{i}t_{i}}\beta+\theta_{g_{i}}+\gamma_{t_{i}}+u_{i}
将数据按组-年聚合:
\bar{Y}_{gt}=\alpha\bar{\tau}_{gt}+Z'_{gt}\delta+X_{gt}'\beta+\theta_{g}+\gamma_{t}+\bar{u}_{gt}
两个回归都能给出一致的处理效应估计,但标准误不同——应该用哪个?
个体模型的误差项可以分解为:
u_{i}=\textcolor{red}{\eta_{g_{i}t_{i}}}+\epsilon_{i}
Bertrand, Duflo & Mullainathan (QJE, 2004):若 \eta_{gt} 存在序列相关,仅按“组×年”聚类仍然有问题!
解决方案:
| 情景 | 推荐方法 |
|---|---|
| 组数较多 | 按 block bootstrap |
| 组数中等 | 方差-协方差矩阵的渐近近似 |
| 组数较少 | 将数据折叠为“前”、“后”两期,考虑有效样本量 |
实操指南:Cameron & Miller (2015, JHR)
Monte Carlo 模拟的三大价值
Bertrand, Duflo & Mullainathan (QJE 2004) 的提醒
他们构造全美州级就业面板,人为赋一个“不存在”的政策给随机选中的州,发现:
结论:忽视序列相关,会让 DiD 论文的 t 值严重失真。
数据生成过程(DGP)
提示
为什么这样设计能“捕捉”问题?
真实效应 = 0,按名义 5% 水平只应有 5% 的实验拒绝 H_0。任何超过 5% 的拒绝率,都是推断失真。
def simulate_panel(n_units=500, n_periods=10, rho=0.8, treat_effect=0.0, seed=0):
rng = np.random.default_rng(seed)
unit_fe = rng.normal(0, 1, n_units)
time_fe = rng.normal(0, 1, n_periods)
# AR(1) 误差
eps = np.zeros((n_units, n_periods))
eps[:, 0] = rng.normal(0, 1, n_units)
for t in range(1, n_periods):
eps[:, t] = rho * eps[:, t-1] + rng.normal(0, 1, n_units)
treated = rng.choice(n_units, size=n_units // 5, replace=False)
is_treated = np.zeros(n_units, dtype=bool); is_treated[treated] = True
D = np.zeros((n_units, n_periods))
D[is_treated, 5:] = 1
Y = unit_fe[:, None] + time_fe[None, :] + treat_effect * D + eps
return Y, D, is_treatedfrom scipy import stats
def twfe_three_se(seed):
"""用 Within 变换计算 TWFE 估计 + 三种 SE(iid / HC1 / 按单位聚类)"""
Y, D, _ = simulate_panel(seed=seed)
n, T = Y.shape
# 双向去均值
Y_dm = Y - Y.mean(axis=1, keepdims=True) - Y.mean(axis=0) + Y.mean()
D_dm = D - D.mean(axis=1, keepdims=True) - D.mean(axis=0) + D.mean()
y = Y_dm.flatten(); x = D_dm.flatten()
# OLS on double-demeaned
b = (x * y).sum() / (x * x).sum()
r = y - b * x
df_adj = n * T - n - T # TWFE 自由度
# iid SE
sigma2_iid = (r * r).sum() / df_adj
se_iid = np.sqrt(sigma2_iid / (x * x).sum())
# HC1
se_hc = np.sqrt(((x * r) ** 2).sum() / (x * x).sum() ** 2 * (n * T) / df_adj)
# Cluster on unit
xr = (x * r).reshape(n, T).sum(axis=1)
se_cl = np.sqrt((xr ** 2).sum() / (x * x).sum() ** 2 * n / (n - 1))
# 两尾 t 检验 p 值
p_iid = 2 * (1 - stats.t.cdf(abs(b / se_iid), df=df_adj))
p_hc = 2 * (1 - stats.t.cdf(abs(b / se_hc), df=df_adj))
p_cl = 2 * (1 - stats.t.cdf(abs(b / se_cl), df=n - 1))
return p_iid, p_hc, p_cl
pvals = np.array([twfe_three_se(s) for s in range(300)])
reject = (pvals < 0.05).mean(axis=0)
print(f"拒绝率 — iid: {reject[0]:.1%} HC1: {reject[1]:.1%} cluster: {reject[2]:.1%}")拒绝率 — iid: 27.7% HC1: 27.3% cluster: 5.7%

iid 与 HC1 都严重过度拒绝;按单位聚类后拒绝率才回到 5% 附近。
Cameron & Miller (JHR 2015) 的黄金三条
Cameron, Gelbach & Miller (2011) 公式
同一观测可能同时属于两个“维度”的群组(如:企业属于城市和行业)。
\hat{V}(\hat{\beta}) = \hat{V}^G(\hat{\beta}) + \hat{V}^H(\hat{\beta}) - \hat{V}^{G \cap H}(\hat{\beta})
vce(cluster province industry)cluster = ~ province + industry提示
何时用两维
配套实验室
2026Spring/Labs/L3_Clustering_MonteCarlo.ipynb
提示
建议用法
写稿前先自问
重要
七项未必全做,但被审稿人问到时要有答案
空着等审稿人追问,不如提前在论文附录里“主动回答”。
常见的错误应对
正确的应对
Dube, Lester & Reich (ReStat 2010)
用毗邻郡配对作为对照(更严格的局部比较),重新估计最低工资对就业的影响:
提示
经验法则
第 4 周:交错处理、现代 DiD 与合成控制
核心思想
经典 DiD 在 2×2 下是“干净的”;但现实里政策分批推进——届时 TWFE 可能给出错误符号的估计量。我们需要新的工具去看清楚发生了什么。