实证方法教程 / synth

合成控制法

把处理组、对照组和政策时点落到代码里

这节课解决什么适合政策评估、处理组/对照组和处理时间明确的准实验问题。
先准备哪些变量因变量 / 核心解释变量
会看到哪张表synth_results.csv
论文里怎么克制解释报告处理组定义、对照组来源、样本窗口和识别假设。

合成控制法是什么?

合成控制法回答的是:当只有一个或少数处理单位时,能否用多个未处理单位的加权组合构造一个可信的反事实。它的核心不是回归系数,而是政策前拟合出来的 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_jtdonor 单位结果未处理候选对照单位。
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 支撑了反事实。权重集中说明结论依赖少数单位。
然后看政策后 gapgap 是否在政策后持续扩大或符合理论。单期跳动不够。
最后看 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.csvempirical-wizard 对应方法产物
处理企业600101用一个高 DFI 暴露企业演示合成控制流程
政策前平均 gap-0.1225处理企业与合成对照的预处理差距
政策后平均 gap-0.0986政策后差距变化
gap 变化0.0239合成控制页核心读数

案例图

这是一张由同一份案例数据生成的页面内诊断图。

合成控制法 的共用案例输出图。
合成控制法 的共用案例输出图。

论文里怎么写

本文进一步采用合成控制法检验数字普惠金融变化对企业创新的影响。处理组、对照组和政策后变量均基于同一 firm-year 样本构造,结果报告在 synth_results.csv 中。若处理效应方向与基准回归一致,可作为政策评估维度的补充证据;若不一致,应优先解释识别假设和样本切分差异。

检查清单

  • 先看政策前拟合质量,处理前都拟合不好时不要解释政策后 gap。
  • 报告 donor pool 和权重,说明合成对象由哪些对照单位构成。
  • 合成控制的结论通常是个案层面的,外推到全部样本要谨慎。

返回教程库 · 查看共用案例