本文围绕“读博/上大学是否提高工资”与“政策是否改变结果”等例子,整理常见因果推断方法。每章对应一次问答,重点关注:反事实如何构造、识别假设是什么、结果如何检验。

第一章:样本选择、反事实与处理效应

1. 样本选择偏差

比较读博者与未读博者的平均工资,不能直接把差异解释为读博的因果效应。能力、家庭条件、专业和职业偏好等因素,可能同时影响是否读博和工资。

观察到的工资差异=读博的因果效应+两组原本存在的差异\text{观察到的工资差异}=\text{读博的因果效应}+\text{两组原本存在的差异}

后半部分就是选择偏差。

2. 反事实框架

对每个人定义两个潜在结果:

Yi(1)=个体i读博时的工资Y_i(1)=\text{个体}i\text{读博时的工资}
Yi(0)=个体i不读博时的工资Y_i(0)=\text{个体}i\text{不读博时的工资}

个人处理效应为:

τi=Yi(1)−Yi(0)\tau_i=Y_i(1)-Y_i(0)

同一个人在现实中只能处于一个状态,因此只能观察到一个潜在结果;另一个就是反事实。因果推断的核心任务,是合理估计无法观察的反事实。

3. 常见处理效应

平均处理效应:

ATE=E[Y(1)−Y(0)]ATE=E[Y(1)-Y(0)]

它表示让目标总体接受处理时的平均效果。 已处理者平均处理效应:

ATT=E[Y(1)−Y(0)∣D=1]ATT=E[Y(1)-Y(0)\mid D=1]

它表示对现实中已经读博的人而言,读博平均带来了多少工资变化。ATE与ATT可能不同,因为不同人群的读博收益可能不同。

4. 解决选择偏差的常见方法

  • 随机实验:随机分配处理,理论上最干净。
  • 回归控制:控制能力、家庭背景、专业等混杂变量。
  • 匹配或倾向得分:寻找背景相似、处理状态不同的人。
  • 加权:重新加权,使两组协变量分布接近。
  • 工具变量:寻找影响处理、但不直接影响结果的外部变量。
  • 断点回归:利用明确的资格阈值。
  • 双重差分:利用政策前后和组间变化。
  • Heckman选择模型:处理结果变量只在被选择样本中可见的问题。

5. 回归能够识别因果效应的条件

基本回归:

Yi=α+τDi+βXi+εiY_i=\alpha+\tau D_i+\beta X_i+\varepsilon_i

要把 τ\tau 解释为因果效应,通常需要:

  1. 条件可忽略性:控制 X 后,处理近似随机。
(Y(1),Y(0))⊥D∣X(Y(1),Y(0))\perp D\mid X
  1. 重叠性:各种类型的人都具有接受或不接受处理的可能。
0<P(D=1∣X)<10<P(D=1\mid X)<1
  1. 模型设定合理:正确处理非线性、交互关系和固定效应。
  2. 不控制错误变量:优先控制处理前共同原因,不能随意控制处理后的中介变量。

普通回归只能控制已观测且正确纳入模型的混杂因素,不能自动解决隐藏的能力差异。

6. 树模型能否完成因果推断?

普通决策树或随机森林预测的是:

E[Y∣D,X]E[Y\mid D,X]

因果推断关心的是:

E[Y(1)−Y(0)∣X]E[Y(1)-Y(0)\mid X]

可以使用 Causal Tree、Causal Forest、Generalized Random Forest、BART,以及基于树模型的 S/T/X-learner 或 Double Machine Learning。它们适合发现处理效应异质性,但仍不能凭空解决未观测混杂。


第二章:倾向得分匹配(PSM)

1. 基本思想

匹配使处理组与对照组在处理前协变量 X 的分布上接近,从而提高可比性。匹配后并不是永远“不再需要控制 X”:如果仍有残余不平衡,可以在匹配样本上继续回归调整。 PSM仍然依赖“没有遗漏重要混杂变量”。未观测的真实能力若同时影响读博和工资,PSM无法消除其偏差。

2. 倾向得分

倾向得分是个体接受处理的条件概率:

e(X)=P(D=1∣X)e(X)=P(D=1\mid X)

它把多维协变量压缩为一个标量。两个个体的每项特征不必完全相同,只要综合处理倾向接近,就可以考虑匹配。

3. 多维匹配方法

马氏距离匹配

d(i,j)=(Xi−Xj)′S−1(Xi−Xj)d(i,j)=\sqrt{(X_i-X_j)'S^{-1}(X_i-X_j)}

它考虑变量的不同尺度及相关性,适合协变量不太多且连续变量较多的情形。高维时容易出现维度灾难。实践中可以先限定倾向得分卡尺,再在卡尺内按马氏距离选择对象。 严格地说,马氏距离匹配属于协变量匹配,不一定等同于PSM。

共同支撑域

只保留处理组和对照组倾向得分都覆盖的区间。没有合适对照的处理样本应舍弃,不能为了保留全部样本而强行匹配。 这也意味着估计对象可能变化为“存在可比对象的人群”,而非原始总体。

最近邻与卡尺

  • 一对一匹配:每个处理样本匹配一个最近对照。
  • 一对多匹配:每个处理样本匹配 K 个对照,方差可能更小,但偏差可能更大。
  • 有放回匹配:同一个优质对照可以被多次使用,匹配质量更高,但需要权重。
  • 无放回匹配:对照只使用一次,结果可能受匹配顺序影响。
  • K近邻匹配:选择最近的 K 个对照。
  • 卡尺匹配:只允许距离低于阈值的匹配。
∣e(Xi)−e(Xj)∣<c|e(X_i)-e(X_j)|<c

常见做法是“最近邻+卡尺”。卡尺越窄,可比性越好但样本损失越多。

4. 如何检验匹配质量?

重点检验协变量平衡,而不是看结果变量是否显著。均值是否有显著差异。 标准化均值差:

SMD=Xˉ1−Xˉ0(S12+S02)/2SMD= \frac{\bar X_1-\bar X_0} {\sqrt{(S_1^2+S_0^2)/2}}

一般希望 ∣SMD∣<0.1|SMD|<0.1,并通过 Love Plot 比较匹配前后。 还应检查:

  • 方差比是否接近1;
  • 直方图、密度图、箱线图和经验累积分布是否接近;
  • 倾向得分是否具有足够重叠;
  • 匹配前后样本量和未匹配样本数;
  • 对照样本被重复使用的次数;
  • 权重是否过度集中,有效样本量是否过小。

不应主要依赖匹配后协变量的 t 检验,因为其显著性高度依赖样本量。

5. 匹配后的效应

若关心已读博者的收益,通常估计ATT。标准误需与一对多、有放回和估计所得倾向得分等设计相适应,不能简单按两个独立随机样本计算。


第三章:双重差分(DID)与 PSM-DID

1. DID为什么有用?

DID至少需要处理前后两个时期,但不一定必须追踪同一批个体,也可使用重复截面数据。 若未观测能力不随时间变化,对同一个体或群体做前后差分时,它会被消去。DID还可以消除所有单位共同经历的时间冲击。 DID不能自动消除随时间变化、且对两组影响不同的遗漏因素。例如政策实施时处理地区恰好新增高薪产业,产业冲击可能被误认为政策效果。

2. 双重差分

DID=(YT,after−YT,before)−(YC,after−YC,before)DID= (Y_{T,after}-Y_{T,before}) - (Y_{C,after}-Y_{C,before})

例如处理组工资增长5万元、对照组增长2万元,则政策效应估计为3万元。 基础回归:

Yit=α+βTreati+γPostt+δ(Treati×Postt)+εitY_{it}=\alpha+\beta Treat_i+\gamma Post_t +\delta(Treat_i\times Post_t)+\varepsilon_{it}

交互项系数 δ\delta 是DID估计量。 面板数据常写为:

Yit=αi+λt+δDit+εitY_{it}=\alpha_i+\lambda_t+\delta D_{it}+\varepsilon_{it}

αi\alpha_i 是个体固定效应,λt\lambda_t 是时间固定效应。经典DID经常通过双向固定效应模型实现,但DID的核心是反事实识别逻辑,而不是线性形式本身。

3. 平行趋势假设

DID不要求两组的结果水平相同,而要求没有政策时,两组的结果变化趋势相同:

E[Yit(0)−Yi,t−1(0)∣Treat=1]=E[Yit(0)−Yi,t−1(0)∣Treat=0]E[Y_{it}(0)-Y_{i,t-1}(0)\mid Treat=1] = E[Y_{it}(0)-Y_{i,t-1}(0)\mid Treat=0]

样本选择本身不一定破坏DID;真正的问题是选择机制是否造成了两组不同的潜在趋势。

4. 可靠性检验

  • 画政策前后的组间趋势图,关注政策前斜率而非水平。
  • 将政策时间人为提前,进行时间安慰剂检验。
  • 随机指定虚假处理组,进行空间安慰剂检验。
  • 使用理论上不受政策影响的结果变量作为安慰剂结果。
  • 更换对照组和时间窗口。
  • 排除同期其他政策。
  • 检查政策是否改变了样本构成。
  • 按合理层级计算聚类标准误。

安慰剂检验通过不能证明因果关系,只能排除部分替代解释。

5. PSM-DID

第一步用政策前协变量匹配,使两组在可观测特征及政策前结果上更相似;第二步在匹配样本中实施DID。

  • PSM减少可观测差异。
  • DID消除固定的不可观测差异和共同时间冲击。

PSM-DID不能保证平行趋势,只能提高其可信度。匹配必须使用政策前变量,不能使用政策造成的结果或中介变量。

6. 多期DID与事件研究

Yit=αi+λt+∑k≠−1βk1(t−Ti=k)+εitY_{it}=\alpha_i+\lambda_t+ \sum_{k\neq-1}\beta_k1(t-T_i=k)+\varepsilon_{it}

TiT_i 是首次处理时间,k=t−Tik=t-T_i 是相对政策时间,通常省略 k=−1k=-1 作为基准期。 平行趋势检验主要观察政策前系数是否接近0,并联合检验:

H0:β−3=β−2=⋯=0H_0:\beta_{-3}=\beta_{-2}=\cdots=0

“不显著”不等于证明平行趋势成立,还要观察系数大小、置信区间宽度、趋势形态和是否存在预期效应。 若不同地区分批接受处理,传统双向固定效应可能错误地把已处理单位当作其他批次的对照。处理效应存在异质性时,更适合分组—时间ATT、cohort-specific DID 或 interaction-weighted event study,并使用从未处理或尚未处理的单位作对照。


第四章:断点回归(RDD)

1. 基本场景

假设高考500分以上可以获得大学录取资格:

Di=1(Xi≥500)D_i=1(X_i\geq500)

整体比较大学生与非大学生存在能力、家庭背景和学习投入差异,PSM也可能因遗漏变量和共同支撑不足而失败。但499分与501分的学生可能非常相似,只因是否越过阈值而面临不同的升学机会。 RDD利用的是:分数线附近的人不能精确控制自己落在断点哪侧,因此处理分配近似随机。 RDD不是说整体不存在选择,而是断点附近局部可比。它估计的是断点处的局部处理效应:

τRDD=lim⁡x↓500E[Y∣X=x]−lim⁡x↑500E[Y∣X=x]\tau_{RDD}= \lim_{x\downarrow500}E[Y\mid X=x] - \lim_{x\uparrow500}E[Y\mid X=x]

结果不能轻易外推到远离500分的人。

2. 精确断点回归

若500分以上全部上大学、500分以下全部不上大学,就是精确RDD:

Di={1,Xi≥5000,Xi<500D_i= \begin{cases} 1,&X_i\geq500\\ 0,&X_i<500 \end{cases}

局部线性模型可写为:

Yi=α+τDi+β1(Xi−500)+β2Di(Xi−500)+εiY_i=\alpha+\tau D_i+\beta_1(X_i-500) +\beta_2D_i(X_i-500)+\varepsilon_i

τ\tau 是断点处结果变量的跳跃。

3. 模糊断点回归

如果分数线只提高上大学的概率,而不完全决定是否上大学,就是模糊RDD:

P(D=1∣X=500+)>P(D=1∣X=500−)P(D=1\mid X=500^+)>P(D=1\mid X=500^-)

处理效应为:

τFRD=断点处工资的跳跃断点处上大学概率的跳跃\tau_{FRD} = \frac{\text{断点处工资的跳跃}}{\text{断点处上大学概率的跳跃}}

它类似工具变量法:

  • 工具变量:是否超过500分;
  • 内生处理:是否实际上大学;
  • 结果:工资。

估计对象是分数线附近、上大学行为会被阈值改变的人,即局部平均处理效应。

4. 遗漏变量条件

RDD允许存在未观测能力,但要求该变量在断点处连续:

lim⁡x↑500E[A∣X=x]=lim⁡x↓500E[A∣X=x]\lim_{x\uparrow500}E[A\mid X=x] = \lim_{x\downarrow500}E[A\mid X=x]

因此,除处理状态外,其他影响工资的因素不能恰好在500分处跳跃。若500分以上同时获得另一项长期补贴,就无法区分大学教育与补贴的效果。

5. 核心假设与检验

核心假设:

  • 未处理潜在结果在断点处连续;
  • 个体不能精确操纵分数;
  • 处理前样本构成在断点处连续;
  • 不存在其他恰好使用相同断点的干预。
  • 模糊RDD还需要相关性、排除限制和单调性等工具变量假设。

可靠性检查:

  • 绘制成绩与处理概率、成绩与工资的关系;
  • 用密度连续性检验检查阈值附近是否堆积;
  • 检查家庭收入、父母教育等处理前协变量是否跳跃;
  • 在480分、520分等位置做伪断点检验;
  • 更换合理带宽和核函数;
  • 优先使用局部线性回归,避免高阶多项式;
  • 使用偏差校正的置信区间;
  • 去除恰好位于断点的样本后重新估计。

PSM要求重要混杂变量被观测并控制;RDD允许遗漏混杂变量,但要求它们在断点处连续。


第五章:合成控制法(SCM)

1. 基本思想

当一个省实施政策,却找不到单一理想对照省时,可以对多个未处理地区加权,构造“合成处理省”:

合成A省=wBB省+wCC省+wDD省+⋯\text{合成}A\text{省}=w_BB\text{省}+w_CC\text{省}+w_DD\text{省}+\cdots

通常约束:

wj≥0,∑jwj=1w_j\geq0,\qquad \sum_jw_j=1

权重使合成对象在政策前的结果轨迹和预测变量上尽可能接近真实处理对象:

min⁡W(X1−X0W)′V(X1−X0W)\min_W(X_1-X_0W)'V(X_1-X_0W)

2. 处理效应

政策后,合成对象代表“如果A省未实施政策”的反事实:

τ^t=Y1t−∑j=2J+1wjYjt\hat\tau_t=Y_{1t}-\sum_{j=2}^{J+1}w_jY_{jt}

SCM通常展示逐期动态效应,而不只是一个平均系数。

3. 与DID的区别

  • DID通常使用对照组平均趋势构造反事实。
  • SCM从多个对照单位中学习权重,为处理单位定制反事实。

SCM尤其适合:

  • 处理单位很少,甚至只有一个;
  • 对照单位较多;
  • 政策前时期较长;
  • 没有单一理想对照;
  • 处理单位能够由供体池的组合较好拟合。

4. 识别条件

SCM通过拟合较长的政策前结果轨迹,可以间接控制一些难以观测、甚至随时间变化的因素。但它仍要求:

  • 没有政策时,真实处理对象与合成对象在政策后会继续保持相近轨迹;
  • 供体单位未受到政策影响;
  • 不存在溢出效应;
  • 没有只发生于处理单位的同期冲击;
  • 处理单位能被供体池的凸组合表示。

若所有对照地区都远低于处理地区,非负权重无法合成出处理地区,政策前拟合就会很差。

5. 可靠性检验

政策前拟合误差:

RMSPEpre=1T0∑t≤T0(Y1t−Y0tW)2RMSPE_{pre} = \sqrt{ \frac{1}{T_0} \sum_{t\leq T_0} (Y_{1t}-Y_{0t}W)^2 }

还应进行:

  • 空间安慰剂:假设其他未处理地区分别受到政策;
  • 比较 RMSPEpost/RMSPEpreRMSPE_{post}/RMSPE_{pre};
  • 时间安慰剂:人为提前政策时间;
  • Leave-one-out:逐一删除高权重供体;
  • 改变政策前窗口、预测变量和供体池;
  • 检查结果是否依赖单个对照单位。

SCM得到的通常是特定处理单位的效应,不一定能推广到总体。


第六章:CausalImpact

1. 适用场景

CausalImpact使用贝叶斯结构时间序列模型,根据干预前数据预测“如果干预没有发生,干预后指标会是多少”。 典型应用:

  • 广告是否增加销量或点击量;
  • 产品版本上线是否提高日活;
  • 地方政策是否改变就业或税收;
  • 门店改造是否提高营业额;
  • 网站故障造成了多少流量损失。

它适合具有明确干预时间、较长干预前序列、少量处理对象,并且拥有多个与结果相关但不受干预影响的控制序列的场景。

2. 基本原理

DID不需要找到一个变化趋势非常趋同的城市,而且通过类似集成学习的方法,将多个城市的对照时间序列作为输入,并结合自身长期的时间序列波动来拟合出一个策略没上线的虚拟现实。 模型可概括为:

Yt=趋势t+季节性t+β1X1t+β2X2t+εtY_t=\text{趋势}_t+\text{季节性}_t+\beta_1X_{1t}+\beta_2X_{2t}+\varepsilon_t

模型先用干预前数据学习关系,再预测干预后的反事实 Y^t(0)\hat Y_t(0)。 逐期效应:

τt=Yt−Y^t(0)\tau_t=Y_t-\hat Y_t(0)

累计效应:

∑t∈postτt\sum_{t\in post}\tau_t

输出通常包括反事实预测、平均与累计绝对效应、相对效应、后验可信区间和因果效应的后验概率。

3. 关键假设

  • 控制序列没有受到处理影响。
  • 干预前建立的结果—控制变量关系在干预后保持稳定。
  • 干预时没有只影响处理对象的其他同期冲击。
  • 干预时间不是由结果变量的异常变化反向决定的。

CausalImpact与经典SCM并不相同:它结合状态空间模型、趋势、季节性和控制序列,以贝叶斯方式构造反事实。

4. Python操作

安装:

pip install tfcausalimpact

最小示例:

import numpy as np
import pandas as pd
from causalimpact import CausalImpact

rng = np.random.default_rng(42)
dates = pd.date_range("2025-01-01", periods=120, freq="D")

# 未受广告影响的市场指标
market = 100 + np.cumsum(rng.normal(0, 1, 120))

# 正常销量;第91天开始广告投放,每天增加15
sales = 20 + 1.5 * market + rng.normal(0, 3, 120)
sales[90:] += 15

data = pd.DataFrame(
    {"sales": sales, "market": market},
    index=dates,
)

pre_period = [dates[0], dates[89]]
post_period = [dates[90], dates[-1]]

impact = CausalImpact(data, pre_period, post_period)

print(impact.summary())
print(impact.summary(output="report"))
impact.plot()

数据第一列是结果变量,后续列是控制序列;每行代表一个按时间排序、频率一致的观测。 真实CSV示例:

import pandas as pd
from causalimpact import CausalImpact

data = (
    pd.read_csv("sales.csv", parse_dates=["date"])
    .set_index("date")
    .sort_index()
)

impact = CausalImpact(
    data[["sales", "control_sales", "search_index"]],
    pre_period=["2025-01-01", "2025-06-30"],
    post_period=["2025-07-01", "2025-08-31"],
)

print(impact.summary())
print(impact.summary(output="report"))
impact.plot()

5. 结果与可靠性检查

默认图通常包含:

  1. 真实结果与反事实预测;
  2. 每期实际值减反事实值;
  3. 累计处理效应。

后验区间不包含0,只表示在模型及识别假设成立时具有较强效果证据,不能自动证明因果关系。 建议检查:

  • 在真实政策前设置虚假干预点,结果应接近0;
  • 画出控制序列,确认政策时点没有异常跳跃;
  • 改变政策前窗口;
  • 删除部分控制变量重新估计;
  • 检查节假日、促销和统计口径变化;
  • 设置多个虚假干预时间;
  • 确认不存在对控制地区或产品的政策溢出。

6. 方法对比

方法反事实来源核心条件
DID对照组的平均变化平行趋势
SCM多个对照单位的固定加权组合政策前拟合良好,供体不受干预
CausalImpact状态空间模型与多个控制时间序列控制序列未受干预,前后关系稳定

参考资料


总结:如何选择方法?

  • 有充分的处理前协变量且无重要未观测混杂:考虑回归、PSM或加权。
  • 有处理组、对照组和政策前后数据:考虑DID。
  • 有明确且难以精确操纵的处理阈值:考虑RDD。
  • 只有少量处理单位、很多供体且有较长政策前序列:考虑SCM。
  • 有明确干预时间、连续时间序列及未受影响的控制序列:考虑CausalImpact。
  • 需要估计不同人群的异质性效应:考虑因果树、因果森林或元学习器。

所有方法都不是仅凭算法名称产生因果关系。可信结论始终来自:明确的处理、合理的反事实、可辩护的识别假设,以及与假设对应的诊断和稳健性检验。