👇 连享会 · 推文导航 | www.lianxh.cn
🍎 Stata:Stata基础 | Stata绘图 | Stata程序 | Stata新命令 📘 论文:数据处理 | 结果输出 | 论文写作 | 数据分享 💹 计量:回归分析 | 交乘项-调节 | IV-GMM | 时间序列 | 面板数据 | 空间计量 | Probit-Logit | 分位数回归 ⛳ 专题:SFA-DEA | 生存分析 | 爬虫 | 机器学习 | 文本分析 🔃 因果:DID | RDD | 因果推断 | 合成控制法 | PSM-Matching 🔨 工具:工具软件 | Markdown | Python-R-Stata 🎧 课程:最新专题 | 计量专题 | 关于连享会
🍓 课程推荐:连享会:2025 寒假前沿班
嘉宾:杨海生,中山大学
时间:2025 年 1 月 13-24 日
咨询:王老师 18903405450(微信)
目录
1. 简介
2. 理论背景
2.1 设定
2.2 一般框架
2.3 预测区间
3. Stata实操
3.1 准备工作
3.2 命令介绍
3.3 具体应用
4. 总结
5. 相关推文
1. 简介
合成控制法 (Synthetic Control Methods,SCM) 是一种使用未受干预个体 (控制组) 的加权平均值,来近似在没有干预的情况下受干预个体 (处理组) 的反事实替身,以此来估计处理效应。合成控制法的实现通常涉及两个主要的估计步骤:
首先,通过回归方法 (通常是有约束的),仅使用干预前数据将 treated unit(s) 与 control units 匹配; 其次,通过将干预前的匹配权重与干预后的 control units 相结合,获得 treated unit(s) 的反事实结果的预测。
因此,合成控制法提供了干预政策实施后,treated unit(s) (因果) 处理效应的预测或点估计。本文拓展了合成控制法的不确定性量化,提出了 SC 框架下的条件预测区间:将潜在的结果变量作为随机变量,并采用有限样本概率集中的方法,为 treated unit(s) 在干预后的反事实结果制定预测区间,从而提供了一种评估统计不确定性的 (有条件的) 替代推断方法。
2. 理论背景
本文提出的方法是通过 (有条件的) 预测区间来量化不确定性,因为在 SC 框架中,处理效应估计量基于干预前数据构建的 SC 估计权重,是从样本外预测问题中出现的随机变量。该方法推断出的不是通常意义上的置信区间 (即为感兴趣的非随机参数在参数空间中给出一个区域),而是一个描述在随机变量的支持下可能观察到的新实现的区域的区间。
SC 预测的统计不确定性由两个不同的随机性来源控制:一个是样本内不确定性——由于干预前期 SC 权重的构造 (可能被错误指定);另一个是样本外不确定性——由于干预后对处理效应分析时不可观测的随机误差。
因此,本文建议的预测区间是在考虑两个随机性来源的情况下构建的:
对于不确定性的第一个来源,提出了一种基于模拟的方法,该方法通过非渐近概率集中来证明其合理性,从而享有概率保证。该方法考虑了 SC 权重的具体构造。 对于第二个不确定性来源,即由于干预后的不可观测误差而导致的样本外预测,讨论了几种基于非参数概率近似和参数概率近似的方法作为原则灵敏度分析的框架。第二个不确定性源较难以非参数方式处理,因此应谨慎考虑其对总体预测区间的影响,文中的方法是采用不可知性敏感性分析。
2.1 设定
考虑具有单个 treated unit 和多个 control units 的标准合成控制框架,允许平稳和非平稳数据。数据可能只包括感兴趣的结果变量,或者包括感兴趣的结果变量加上其他变量。研究观测的是 时期内 ( ) 个个体 ()。
在前 时期内,所有的个体都没有接受干预。从 期开始,个体 1 ( ) 接受干预而其他个体仍然保持不接受干预,此后个体是否接受干预状态保持不变,直到观测期结束。
每一个个体 在时期 都有两种潜在的结果:接受干预的结果 和未接受干预的结果 。即,设定包含两个隐形假设:无溢出 (个体 的潜在结果只取决于其 是否接受干预) 和无预期 ( 时期的潜在结果只取决于同时期是否接受干预)。我们关注的处理效应是接受干预的个体的结果与在不接受干预的情况下该个体应该出现的结果之间的差异,即:
根据所考虑的框架, 可以是随机或非随机的。在本文中,将 视为随机变量。对于每个个体,我们只能观测到与实际干预状态相对应的潜在结果,定义 为实际观测到的结果:
这意味着在 中,treated unit 的潜在结果 对于所有的 是无法观测到的。合成控制法的思想是将控制组干预后观察结果进行适当组合,以接近处理组的反事实干预后结果:。
在 SC 框架中,选择一组权重 使给定的损失函数在约束条件下最小化。给定一组估计权重 ,在 时,处理组的反事实预测结果为 。加权平均 为被处理个体的合成控制,因为它代表了如何将未干预的个体组合起来,为干预后的个体提供最佳的反事实。
当数据只包含与感兴趣结果有关的信息时,选择 使未干预个体结果的加权平均值与干预前一段时间内 treated unit 的结果轨迹很接近。也就是说,权重 的选择满足:
其中,符号 的含义因所考虑的具体框架而异。一个主要例子的约束权重为非负且和为 1,并通过约束最小二乘估计 :
其中 表示截距, 和 表示相应的约束集 (或可行性集)。
然而,SC 方法的这种只考虑结果的方式,不能保证所得到的合成控制个体将在除 (干预前) 结果之外的任何特征上与 treated unit 相似。在实证中往往还会获得其他特征,因此我们还希望确保合成控制在这些其他特征方面与 treated unit 接近。
SC 框架可以通过为这些额外的特性包含额外的方程来处理这种情况,并将综合损失最小化。在这种情况下,让 定义为将被匹配产生权重的变量下标,上述最小化问题可推广为:
其中 和 是正常数,反映了不同方程和周期的相对重要性。
2.2 一般框架
现在讨论一个包含上述两个特殊例子的一般框架,并允许以统一的方式进行协变量调整和非平稳数据。
考虑为 treated unit 的 M 个特征同时构造的合成控制权重,用 表示,其中 。对于每一个特征 ,都存在 个变量,可以用来预测或匹配 维向量 。这些 个变量被分为两组,分别为 和 。
更准确的说,对于每一个 , 对应于在干预前 期间内观测到的第 个个体的第 个特征;对于每一个 , 是另一个控制变量向量,也可能用于预测同一干预前时间跨度内的 。为了方便,设 。
合成控制法的目标是在 M 个特征上搜寻一个公共权重向量 和一个系数向量 ,使得 和 的线性组合在所有 的情况下尽可能匹配 ,设目标通常通过以下优化问题来实现:
其中,
可行性集 和 捕捉了施加的限制。该框架包含了文献中多种先前的合成控制的形式,它们的不同之处在于是否包含额外的协变量,是否假设数据是平稳的,以及使用的约束集 和 的特定选择,以及其他可能性。
为了进一步理解本文的推断方法,定义相对于一个 域的伪真值 和 :
因此,
其中, 是相对于 域的伪真值残差。也就是说, 和 是与 条件下 (可能受约束的) 最佳线性预测系数 和 相关的均方误差估计。
给定估计权重 和 系数 , treated unit 干预后反事实结果为:
其中, 是在时间 上观察到的 control units 的预测因子向量, 是在时间 上观测到的另一组用户指定的预测因子。包含在 和 中的变量不需要与 和 中的变量相同,但必须是 域 上的一部分。分解 treated unit 的潜在结果:
其中 由结构定义。本文假设 和 可能是 和 分别集中在概率周围的随机元素,所以称它们为伪真值。处理组的估计处理效应与目标群体的距离为:
在合成控制框架内,将感兴趣的变量 视为一个随机变量,不称其为“参数”,称 为 的预测,而不是其“估计量”,并着重建立预测区间而不是置信区间,以此表征 的不确定性。
2.3 预测区间
其中, 是由于错误设定以及干预后阶段 () 中出现的任何额外噪声造成的样本外误差, 是来自合成控制权重估计的样本内误差。本文的目标是分别找到这两项的概率边界,从而给出不确定性量化。
本文使用以下引理来构造有效的条件预测区间。假设存在 和 ,可能取决于 和条件 域 ,使得满足以下条件:
那么,
该引理提供了一种简单的方法来构造具有 有效的 条件预测区间, 且 :
一旦为 构建了 条件下 有效的预测区间,treated unit 在干预后时期 的反事实结果的类似预测区间 也很容易得到,根据式 (1),可见:
因此, 是 的条件有效预测区间。
3. Stata实操
3.1 准备工作
在 R、Python 和 Stata 中都有软件包可以实现本文提出的方法。读者可以自行在 https://nppackages.github.io/scpi/ 中获取关于 scpi
的各种资料。本文重点介绍 Stata 实现方法。Stata 的实现依赖于 Python ,因此需要提前安装 Python,并完成 Stata (16.0 以上) 与 Python (3.8 以上) 的连接。
安装 Python 有两种方式:
直接从 https://realpython.com/installing-python/ 下载安装 Python 下载安装 Anaconda Windows,macOS,Linux
Python 中安装 scpi
包:
pip install scpi_pkg
Stata 中安装 scpi
命令:
lxhget scpi.pkg, install replace // https://github.com/nppackages/scpi/tree/main/stata
3.2 命令介绍
3.2.1 数据准备:scdata
scpi
中的 scdata
为点估计和预测准备数据。该函数以 DataFrame 类对象为输入,输出 scpi
类数据对象,包含上述矩阵 、、 和干预后预测因子矩阵 。该命令允许使用者指定结果变量、待匹配 treated unit 的特征变量,以及逐个特征的协变量调整。
scdata features [if] [in] , id(idvar) time(timevar) outcome(outcomevar)
treatment(treatmentvar) dfname(string)
[anticipation(#) cointegrated constant pypinocheck]
其中,
id(idvar)
:个体变量time(timevar)
:时间变量。outcome(outcomevar)
:结果变量。treatment(treatmentvar)
:处理变量,接受干预 (被处理) 取 1,否则取 0。dfname(string)
:指定保存并将传递给scest
或scpi
的 Python 对象的名称。covadj(string)
:用于调整每个特征的变量。如果想为所有特征指定相同的协变量集,则应采取的形式为covadj("cov1,cov2")
。反之,如果必须为每一个特征指定一组不同的协变量,应采取的形式为covadj("cov1,cov2;cov1,cov3")
。注意,在后种情况下,用;
分隔的子列表的数量必须等于特征的数量。字列表的顺序也很重要,第一个子列表是用于调整第一个特征的协变量集,以此类推。anticipation(#)
:潜在预期影响的时期数。默认值为anticipation(0)
。cointegrated
:如果该项被指定,意味着认为这些特征构成协整系统。constant
:该项被指定意味着包含跨特征的常数项。pypinocheck
:如果该项被指定,那么可以避免检查 Python 中scpi_pkg
的版本是否是 Stata 中scdata
所需的版本,如果该项未指定,则执行检查并存储调用的宏,以避免多次检查。
3.2.2 点估计:scest
在创建了所有的设计矩阵 、、 和 后,通过 scest
继续对感兴趣的反事实结果进行点估计/预测。scest
使用最小二乘回归、Lasso 回归、岭回归或单纯形约束来实现合成控制方法的估计程序。
scest, dfname(string) [p(#) direc(string) Q(#) lb(#) name(string)
V(string) opt(string) pypinocheck]
其中,
dfname(string)
:使用scdata
创建的已处理数据的 Python 对象的名称。p(#)
:设置要约束的范数类型。取 0 时不对权重的范数施加约束,取 1 时对权重的 L1 范数施加约束 (默认值),取 2 时对权重的 L2 范数施加约束。direc(string)
:指定权重范数上约束的方向。选项包括:<=
权重范数上的约束是不等式约束,==
权重范数上的约束是等式约束 (默认值)。Q(#)
:指定权重范数上约束的大小。lb(#)
:指定权重的下限,默认是lb(0)
。name(string)
:指定使用的约束的名称:simplex
:单纯形回归,经典合成控制估计,权重约束为非负且 L1 范数必须等于 1;lasso
:使用 Lasso 型惩罚估计权重;ridge
:使用 Ridge 型惩罚估计权重;L1-L2
:使用单纯形约束和岭型惩罚估计权重;ols
:使用最小二次惩罚无约束地估计权重。V(string)
:指定损失函数中使用的加权矩阵。默认值是单位矩阵 (V("separate")
),即所有观测值都具有相同的权重;另一种可能是V("separate")
,即集合拟合。opt(string)
:点估计的底层优化算法的终止条件,默认为非线性约束梯度优化 (SLSQP) 的序列二次规划 (SQP),默认值为opt("'maxeval' = 5000, 'xtol_rel' = 1e-8, 'xtol_abs' = 1e-8, 'ftol_rel' = 1e-12, 'ftol_abs' = 1e-12, 'tol_eq' = 1e-8, 'tol_ineq' = 1e-8"
。当使用 Lasso 型约束,则使用不同的优化算法 (cvxpy),并且不能更改终止条件。
3.2.3 预测区间:scpi
scpi
使用最小二乘、lasso、ridge 或单纯形类型约束来实现合成控制 (SC) 方法的预测区间估计。
scpi, dfname(string) [p(#) direc(string) Q(#) lb(#) V(string) name(string) u_missp)
u_sigma(string) u_order(#) u_lags(#) u_alpha(#) sims(#) e_method(string)
e_order(#) e_lags(#) e_alpha(#) lgapp(string) rho(#) rho_max(#) opt_est(string)
opt_inf(string) pypinocheck]
其中,与上文中相同的选项都具有相同的含义,因此不再做过多的说明,下面介绍其他的选项。
样本内不确定性:
u_missp
:如果被指定,则表示考虑了模型设置错误。u_sigma(string)
:估计伪残差的条件方差时要使用的方差-协方差估计量的类型。包括 HCO,HC1 (默认),HC2,HC3。u_order(#)
:用于估计伪残差条件矩的预测中多项式的阶数。默认值为u_order(1)
。如果存在过度拟合的风险,该选项将自动设置为 0。u_lags(#)
:用于估计伪残差条件矩的预测的滞后时间。默认值为u_lags(0)
。如果存在过度拟合的风险,该选项将自动设置为 0。u_alpha(#)
:样本内不确定性的置信水平,即置信水平为 1-u_alpha。默认值为u_alpha(0.05)
。sims(#)
:样本内不确定性的模拟次数。默认值为sims(200)
。
样本外不确定性:
e_method(string)
:量化样本外不确定性的方式,选项包括gaussian
条件亚高斯边界,ls
location-scale 模型,qreg
分位数回归,all
上面三种都包括 (默认设置)。e_order(#)
:估计样本外误差的条件矩的预测中多项式的阶数。默认值为e_order(1)
。如果存在过度拟合的风险,该选项将自动设置为 0。e_lags(#)
:用于估计样本外误差条件矩的预测的滞后时间。默认值为e_lags(0)
。如果存在过度拟合的风险,该选项将自动设置为 0。e_alpha(#)
:样本外不确定性的置信水平,即置信水平为 1-e_alpha。默认值为e_alpha(0.05)
。
其他选项:
lgapp(string)
:选择模拟中近似局部几何关系的方式,选项包括generalized
和linear
,前一种方式适用于非线性约束,第二种方式适用于线性约束。rho(#)
:在估计的权重向量上施加稀疏性正则化参数。如果未指定,则根据优化不等式计算调整参数。rho_max(#)
:调优参数rho
可以达到的最大值。opt_est(string)
:点估计的底层优化算法的终止条件,默认为非线性约束梯度优化 (SLSQP) 的序列二次规划 (SQP),默认值为opt("'maxeval' = 5000, 'xtol_rel' = 1e-8, 'xtol_abs' = 1e-8, 'ftol_rel' = 1e-12, 'ftol_abs' = 1e-12, 'tol_eq' = 1e-8, 'tol_ineq' = 1e-8"
。opt_inf(string)
:点估计的底层优化算法的终止条件,默认为非线性约束梯度优化 (SLSQP) 的序列二次规划 (SQP),默认值为opt("'maxeval' = 5000, 'xtol_rel' = 1e-8, 'xtol_abs' = 1e-8, 'ftol_rel' = 1e-4, 'ftol_abs' = 1e-4, 'tol_eq' = 1e-8, 'tol_ineq' = 1e-8"
。
3.2.4 绘图:scplot
最后一步,将估计的合成控制可视化,并利用 scplot
将其与观测到的 treated unit 的时间序列进行比较。
scplot, [scest uncertainty(string) joint dots_tr_col(colorstyle)
dots_tr_symb(symbolstyle) dots_tr_size(markersizestyle) dots_sc_col(colorstyle)
dots_sc_symb(symbolstyle) dots_sc_size(markersizestyle) line_tr_col(colorstyle)
line_tr_patt(linepatternstyle) line_tr_width(linewidthstyle) line_sc_col(colorstyle)
line_sc_patt(linepatternstyle) line_sc_width(linewidthstyle) spike_sc_col(colorstyle)
spike_sc_patt(linepatternstyle)spike_sc_width(linewidthstyle) gphoptions(string)
gphsave(string) savedata(dta_name) pypinocheck]
其中,
scest
:如果指定该项,则必须在scest
之后调用scplot
。否则,假定在scpi
之后调用scplot
。uncertainty(string)
:绘制的预测区间的类型。选项包括:insample
:预测区间只量化样本内不确定性。gaussian
:预测区间使用条件亚高斯边界量化样本内和样本外不确定。ls
:预测区间使用 location-scale 模型量化样本内和样本外不确定性。qreg
:预测区间使用分位数回归量化样本内和样本外不确定性。joint
:如果该项被指定,则图中包含同步预测区间。dots
相关选项:绘图时有关标记的选项 (颜色、大小、形式等)。line
相关选项:绘图时有关线条的选项 (颜色、图案、宽度等)。spike
相关选项:绘图时有关条形 (尖峰) 的选项。如果指定了scest
,则这些选项无效。gphoptions(string)
:修改绘图的其他选项。gphsave(string)
:指定命令保存的.gph 文件的路径和名称。savedata(dta_name)
:保存一个名为 dta_name.dta 的文件,包含用于生成绘图的已处理数据。
3.3 具体应用
使用德国的数据,关注 1990 年德国统一对西德人均 GDP 的因果影响。将西德统一后的结果与从 1960 年到 1990 年使用 16 个经合组织国家建立的合成控制个体的结果进行了比较。下面演示仅有一个 treated unit 的实操过程。
3.3.1 一个特征变量 (M=1:gdp)
**加载数据
. lxhuse "scpi_germany.dta", clear
**准备数据
. scdata gdp, dfname("python_scdata") id(country) outcome(gdp) time(year) ///
> treatment(status) cointegrated constant
**点估计 (单纯形 simplex)
. scest, dfname("python_scdata") name(simplex)
. scest, dfname("python_scdata") p(1) q(1) direc("==") lb(0)
-------------------------------------------------------
Call: scest
Synthetic Control Estimation - Setup
Constraint Type: user provided
Constraint Size (Q): 1
Treated Unit: West Germany
Size of the donor pool: 16
Features 1
Pre-treatment period 1960-1990
Pre-treatment periods used in estimation: 31
Covariates used for adjustment: 1
Synthetic Control Estimation - Results
Active donors: 6
Coefficients:
Weights
Treated Unit Donor
West Germany Australia 0.000
Austria 0.441
Belgium 0.000
Denmark 0.000
France -0.000
Greece 0.000
Italy 0.177
Japan 0.014
Netherlands 0.058
New Zealand 0.000
Norway 0.000
Portugal 0.000
Spain 0.000
Switzerland 0.036
UK 0.000
USA 0.274
Covariates
West Germany constant 0.158
**画图
. scplot, scest gphoptions("ytitle(GDP per capita) xtitle(Year)")
**预测区间 (单纯形 simplex,模型设定错误)
. set seed 8894
. scpi, dfname("python_scdata") name(simplex) u_missp u_order(1) u_lags(0) ///
> u_sigma("HC1") e_order(1) e_lags(0) e_method(qreg)
**画图
. scplot, gphoptions("ytitle(GDP per capita) xtitle(Year)")
3.3.2 多个特征变量 (M=2:gdp,trade)
**多个特征
. scdata gdp trade, dfname("python_scdata") id(country) outcome(gdp) ///
> time(year) treatment(status) cointegrated
. scpi, dfname("python_scdata") name(simplex) u_missp u_order(1) ///
> u_lags(0) u_sigma("HC1") e_order(1) e_lags(0) e_method(qreg)
. scplot, gphoptions("ytitle(GDP per capita) xtitle(Year)") joint
* 多个特征和指定特征协变量调整
scdata gdp infrate, dfname("python_scdata") id(country) outcome(gdp) ///
time(year) treatment(status) cointegrated covadj("constant, trend; constant")
4. 总结
本文关注标准的合成控制框架下感兴趣的 的不确定性量化,即干预后时期内实际观测到的处理组的结果与在未接受干预情况下处理组的结果之间的差。本文将 视为随机变量,并且处理组只包含一个个体,因此提出条件预测区间,为反事实处理结果的实现提供了有限样本概率保证。
该方法以 SC 约束最小二乘优化方法为出发点,利用控制组在 T 处的特征的加权 (利用干预前数据估计的权重) 和误差项为处理组在时期 T 中的反事实结果建模。这种分解方法突出了两个不确定性来源,一个来自干预前对 SC 权重的样本内估计,另一个来自于 SC 方法中不可不免的样本外预测而产生的干预后误差。利用有限样本浓度边界,得到了包含两个不确定性来源的预测区间。
该过程可以通过 R、Python 和 Stata 的 scpi
软件包实现合成控制方法的点估计和预测区间、不确定性量化的过程,
5. 相关推文
Note:产生如下推文列表的 Stata 命令为:
lianxh 合成控制, m
安装最新版lianxh
命令:
ssc install lianxh, replace
专题:专题课程 ⏩ 因果推断专题-RDD-DID-IV-合成控制 专题:合成控制法 合成控制法简介 Stata:纠偏合成控制法介绍-allsynth Synth_Runner命令:合成控制法高效实现 Stata:合成控制法程序分享 Stata:合成控制法-synth-命令无法加载-plugin-的解决办法 合成控制法 (Synthetic Control Method) 及 Stata实现 专题:答疑-板书 FAQs答疑-2021寒假-Stata高级班-Day3-连玉君-RDD-合成控制法
尊敬的老师 / 亲爱的同学们:
连享会致力于不断优化和丰富课程内容,以确保每位学员都能获得最有价值的学习体验。为了更精准地满足您的学习需求,我们诚挚地邀请您参与到我们的课程规划中来。请您在下面的问卷中,分享您 感兴趣的学习主题或您希望深入了解的知识领域 。您的每一条建议都是我们宝贵的资源,将直接影响到我们课程的改进和创新。我们期待您的反馈,因为您的参与和支持是我们不断前进的动力。感谢您抽出宝贵时间,与我们共同塑造更加精彩的学习旅程!https://www.wjx.cn/vm/YgPfdsJ.aspx# 再次感谢大家宝贵的意见!
New! Stata 搜索神器:
lianxh
和songbl
GIF 动图介绍
搜: 推文、数据分享、期刊论文、重现代码 ……
👉 安装:
. ssc install lianxh
. ssc install songbl
👉 使用:
. lianxh DID 倍分法
. songbl all
🍏 关于我们
连享会 ( www.lianxh.cn,推文列表) 由中山大学连玉君老师团队创办,定期分享实证分析经验。 直通车: 👉【百度一下: 连享会】即可直达连享会主页。亦可进一步添加 「知乎」,「b 站」,「面板数据」,「公开课」 等关键词细化搜索。