合成控制法是什么?
合成控制法回答的是:当只有一个或少数处理单位时,能否用多个未处理单位的加权组合构造一个可信的反事实。它的核心不是回归系数,而是政策前拟合出来的 synthetic control 是否像处理单位。
先用一句话理解
把合成控制想成拼一个影子城市。没有政策时,真实城市会怎么走看不到,于是用一组未处理城市加权拼出一个政策前走势很像它的影子城市。
什么时候用
| 判断项 | 教科书式判断 |
|---|---|
| 适合用在 | 处理单位很少,政策发生在明确时间,且有一组长期未处理的 donor pool。 |
| 先不要用在 | 政策前拟合很差,或 donor pool 本身受到政策影响。 |
| 最关键的前提 | 政策前合成对象要足够接近处理单位。 |
| 读表顺序 | 先看政策前拟合,再看政策后 gap,最后看 placebo/permutation。 |
| 论文表述边界 | 合成控制估计的是处理单位的个案或局部政策效应。 |
把它和相近方法分清楚
| 容易混淆的对象 | 怎么区分 | 初学者记法 |
|---|---|---|
| DID | 使用处理组和对照组平均趋势比较。 | 适合多单位分组处理。 |
| 合成控制 | 用加权 donor pool 构造单个处理单位反事实。 | 重视政策前拟合。 |
| Synthetic DID | 结合合成控制权重和 DID 差分。 | 同时使用单位和时间权重。 |
核心直觉和模型公式
加权反事实
合成控制的反事实通常写成:
\[\widehat{Y}_{1t}(0)=\sum_{j=2}^{J+1}w_jY_{jt},\quad w_j\ge0,\quad \sum_jw_j=1\]
权重 w_j 选择得越好,政策前合成路径越接近处理单位,政策后 gap 才更可信。
公式里的符号怎么读
| 符号 | 含义 | 在本页怎么理解 |
|---|---|---|
| Y_1t | 处理单位结果 | 接受政策的城市、企业或地区。 |
| Y_jt | donor 单位结果 | 未处理候选对照单位。 |
| w_j | 合成权重 | 每个 donor 在合成对象中的权重。 |
| Y_hat_1t(0) | 反事实路径 | 处理单位若未受政策时的预测结果。 |
| gap | 政策后差距 | 真实路径减去合成反事实路径。 |
专业使用口径
专业合成控制报告重点是政策前拟合质量和 donor 权重。
| 口径 | 专业写法 |
|---|---|
| donor pool | 说明哪些单位可作为未处理对照,为什么不受政策污染。 |
| 预测变量 | 说明用于匹配的政策前结果和协变量。 |
| 拟合质量 | 展示政策前 RMSPE 或路径图。 |
| 安慰剂检验 | 用 in-space 或 in-time placebo 判断 gap 是否异常。 |
一步一步做:从问题到结果的五步
| 步骤 | 这一页具体做什么 | 做到什么程度才算读懂 |
|---|---|---|
| 1. 定义处理单位 | 明确哪个单位何时被处理。 | 处理单位不清楚就不能合成。 |
| 2. 选择 donor pool | 排除可能被政策影响的单位。 | 污染 donor 会污染反事实。 |
| 3. 匹配政策前特征 | 用政策前结果和协变量求权重。 | 拟合质量是核心。 |
| 4. 计算政策后 gap | 比较真实路径和合成路径。 | gap 不是回归系数。 |
| 5. 做 placebo | 看其他未处理单位是否也出现类似 gap。 | 没有 placebo 很难判断异常程度。 |
结果怎么读:先读口径,再读数字
本页案例读表时,先记住这个口径:处理企业 = 600101;用一个高 DFI 暴露企业演示合成控制流程。
| 读表顺序 | 本页怎么读 | 不要这样读 |
|---|---|---|
| 先看政策前拟合 | 合成路径是否贴近真实路径。 | 拟合差时政策后 gap 不可信。 |
| 再看权重 | 哪些 donor 支撑了反事实。 | 权重集中说明结论依赖少数单位。 |
| 然后看政策后 gap | gap 是否在政策后持续扩大或符合理论。 | 单期跳动不够。 |
| 最后看 placebo | 处理单位 gap 是否相对异常。 | 不要只凭一张图下结论。 |
初学者最容易错在哪里
| 误读 | 为什么错 |
|---|---|
| 政策前拟合差还解释政策后 gap | 错。反事实没有构造好。 |
| donor pool 被政策污染 | 错。合成对象不再代表未处理世界。 |
| 把 gap 当全样本平均效应 | 错。通常是处理单位的个案效应。 |
| 不做 placebo | 不够。很难判断 gap 是否异常。 |
先看这个案例的结论
- 处理企业 = 600101;用一个高 DFI 暴露企业演示合成控制流程。
- 政策前平均 gap = -0.1225;处理企业与合成对照的预处理差距。
- 政策后平均 gap = -0.0986;政策后差距变化。
- 这些数字来自页面里的结果表;写论文时先解释数值含义,再讨论理论含义。
变量要求和案例口径
| 字段 | 口径 |
|---|---|
| 数据 | CSMAR 风格 A 股企业创新面板 |
| 原始样本 | 196 家上市公司,2015-2020 年,约 1200 个公司-年观测;各方法有效样本以本页输出表 N 为准 |
| 因变量 | patent_count;回归页通常使用 ln(1 + patent_count) |
| 核心解释变量 | dfi_index,数字普惠金融指数;部分案例输出展示的是标准化后的 dfi_index |
| 控制变量 | roa、lev、size、growth、cashflow、tobinq、top1、dual、board、indep、soe、age |
| 输出文件 | synth_results.csv |
| 角色要求 | 因变量、核心解释变量 |
| 依赖包 | synth |
实际代码
下面是本页案例里的最小 Stata 代码。它的作用是帮助你看清变量怎么进入模型、结果文件怎么生成,而不是要求你在网页里手动运行。
import delimited "$DATA_PATH", clear varnames(1) encoding(UTF-8)
gen ln_patent1 = ln(1 + patent_count)
egen firm_id = group(stkcd)
xtset firm_id year
global y ln_patent1
global count_y patent_count
global x dfi_index
global controls roa lev size growth cashflow tobinq top1 dual board indep soe age
gen post = year >= 2018
bysort firm_id: egen pre_dfi = mean(cond(year < 2018, dfi_index, .))
quietly summarize pre_dfi, detail
gen treat = pre_dfi >= r(p50)
gen did = treat * post
gen high_patent = patent_count > 2
gen running_dfi = dfi_index - 260
gen rdd_treat = running_dfi >= 0
synth $y $x roa lev size growth, trunit(1) trperiod(2018) xperiod(2015(1)2017)
export delimited using "$JOB_DIR/synth_results.csv", replace
实际输出表
这张表是本方法页配套案例的输出结果,用来把前面的公式、变量口径和代码对应到实际数字。
| 指标 | 数值 | 解释 |
|---|---|---|
| 样本 | 1200 obs / 196 firms / 2015-2020 | 来自共用案例 CSV |
| 因变量 | ln(1 + patent_count) | 企业创新产出 |
| 核心解释变量 | dfi_index | 数字普惠金融指数 |
| 输出文件 | synth_results.csv | empirical-wizard 对应方法产物 |
| 处理企业 | 600101 | 用一个高 DFI 暴露企业演示合成控制流程 |
| 政策前平均 gap | -0.1225 | 处理企业与合成对照的预处理差距 |
| 政策后平均 gap | -0.0986 | 政策后差距变化 |
| gap 变化 | 0.0239 | 合成控制页核心读数 |
案例图
这是一张由同一份案例数据生成的页面内诊断图。

论文里怎么写
本文进一步采用合成控制法检验数字普惠金融变化对企业创新的影响。处理组、对照组和政策后变量均基于同一 firm-year 样本构造,结果报告在 synth_results.csv 中。若处理效应方向与基准回归一致,可作为政策评估维度的补充证据;若不一致,应优先解释识别假设和样本切分差异。
检查清单
- 先看政策前拟合质量,处理前都拟合不好时不要解释政策后 gap。
- 报告 donor pool 和权重,说明合成对象由哪些对照单位构成。
- 合成控制的结论通常是个案层面的,外推到全部样本要谨慎。