Stata连享会 主页 || 视频 || 推文 || 知乎 || Bilibili 站
温馨提示: 定期 清理浏览器缓存,可以获得最佳浏览体验。
New!
lianxh
命令发布了:
随时搜索推文、Stata 资源。安装:
. ssc install lianxh
详情参见帮助文件 (有惊喜):
. help lianxh
连享会新命令:cnssc
,ihelp
,rdbalance
,gitee
,installpkg
⛳ Stata 系列推文:
作者:高净鹤 (东北财经大学)
邮箱:jh.gaook@gmail.com
编者按:本文主要摘译自下文,特此致谢!
Source:Cattaneo M D, Feng Y, Titiunik R. Prediction intervals for synthetic control methods[J]. Journal of the American Statistical Association, 2021, 116(536): 1865-1880. -PDF- -Supplemental Material- -R-
目录
合成控制法 (Synthetic Control Methods,SCM) 是一种使用未受干预个体 (控制组) 的加权平均值,来近似在没有干预的情况下受干预个体 (处理组) 的反事实替身,以此来估计处理效应。合成控制法的实现通常涉及两个主要的估计步骤:
因此,合成控制法提供了干预政策实施后,treated unit(s) (因果) 处理效应的预测或点估计。本文拓展了合成控制法的不确定性量化,提出了 SC 框架下的条件预测区间:将潜在的结果变量作为随机变量,并采用有限样本概率集中的方法,为 treated unit(s) 在干预后的反事实结果制定预测区间,从而提供了一种评估统计不确定性的 (有条件的) 替代推断方法。
本文提出的方法是通过 (有条件的) 预测区间来量化不确定性,因为在 SC 框架中,处理效应估计量基于干预前数据构建的 SC 估计权重,是从样本外预测问题中出现的随机变量。该方法推断出的不是通常意义上的置信区间 (即为感兴趣的非随机参数在参数空间中给出一个区域),而是一个描述在随机变量的支持下可能观察到的新实现的区域的区间。
SC 预测的统计不确定性由两个不同的随机性来源控制:一个是样本内不确定性——由于干预前期 SC 权重的构造 (可能被错误指定);另一个是样本外不确定性——由于干预后对处理效应分析时不可观测的随机误差。
因此,本文建议的预测区间是在考虑两个随机性来源的情况下构建的:
考虑具有单个 treated unit 和多个 control units 的标准合成控制框架,允许平稳和非平稳数据。数据可能只包括感兴趣的结果变量,或者包括感兴趣的结果变量加上其他变量。研究观测的是
在前
每一个个体
根据所考虑的框架,
这意味着在
在 SC 框架中,选择一组权重
当数据只包含与感兴趣结果有关的信息时,选择
其中,符号
其中
然而,SC 方法的这种只考虑结果的方式,不能保证所得到的合成控制个体将在除 (干预前) 结果之外的任何特征上与 treated unit 相似。在实证中往往还会获得其他特征,因此我们还希望确保合成控制在这些其他特征方面与 treated unit 接近。
SC 框架可以通过为这些额外的特性包含额外的方程来处理这种情况,并将综合损失最小化。在这种情况下,让
其中
现在讨论一个包含上述两个特殊例子的一般框架,并允许以统一的方式进行协变量调整和非平稳数据。
考虑为 treated unit 的 M 个特征同时构造的合成控制权重,用
更准确的说,对于每一个
合成控制法的目标是在 M 个特征上搜寻一个公共权重向量
其中,
可行性集
为了进一步理解本文的推断方法,定义相对于一个
因此,
其中,
给定估计权重
其中,
其中
在合成控制框架内,将感兴趣的变量
其中,
本文使用以下引理来构造有效的条件预测区间。假设存在
那么,
该引理提供了一种简单的方法来构造具有
一旦为
因此,
在 R、Python 和 Stata 中都有软件包可以实现本文提出的方法。读者可以自行在 https://nppackages.github.io/scpi/ 中获取关于 scpi
的各种资料。本文重点介绍 Stata 实现方法。Stata 的实现依赖于 Python ,因此需要提前安装 Python,并完成 Stata (16.0 以上) 与 Python (3.8 以上) 的连接。
安装 Python 有两种方式:
Python 中安装 scpi
包:
pip install scpi_pkg
Stata 中安装 scpi
命令:
lxhget scpi.pkg, install replace // https://github.com/nppackages/scpi/tree/main/stata
scpi
中的 scdata
为点估计和预测准备数据。该函数以 DataFrame 类对象为输入,输出 scpi
类数据对象,包含上述矩阵
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
所需的版本,如果该项未指定,则执行检查并存储调用的宏,以避免多次检查。在创建了所有的设计矩阵 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),并且不能更改终止条件。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"
。最后一步,将估计的合成控制可视化,并利用 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 的文件,包含用于生成绘图的已处理数据。使用德国的数据,关注 1990 年德国统一对西德人均 GDP 的因果影响。将西德统一后的结果与从 1960 年到 1990 年使用 16 个经合组织国家建立的合成控制个体的结果进行了比较。下面演示仅有一个 treated unit 的实操过程。
**加载数据
. 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)")
**多个特征
. 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")
本文关注标准的合成控制框架下感兴趣的
该方法以 SC 约束最小二乘优化方法为出发点,利用控制组在 T 处的特征的加权 (利用干预前数据估计的权重) 和误差项为处理组在时期 T 中的反事实结果建模。这种分解方法突出了两个不确定性来源,一个来自干预前对 SC 权重的样本内估计,另一个来自于 SC 方法中不可不免的样本外预测而产生的干预后误差。利用有限样本浓度边界,得到了包含两个不确定性来源的预测区间。
该过程可以通过 R、Python 和 Stata 的 scpi
软件包实现合成控制方法的点估计和预测区间、不确定性量化的过程,
Note:产生如下推文列表的 Stata 命令为:
lianxh 合成控制, m
安装最新版lianxh
命令:
ssc install lianxh, replace
免费公开课
最新课程-直播课
专题 | 嘉宾 | 直播/回看视频 |
---|---|---|
⭐ 最新专题 | 文本分析、机器学习、效率专题、生存分析等 | |
研究设计 | 连玉君 | 我的特斯拉-实证研究设计,-幻灯片- |
面板模型 | 连玉君 | 动态面板模型,-幻灯片- |
面板模型 | 连玉君 | 直击面板数据模型 [免费公开课,2小时] |
⛳ 课程主页
⛳ 课程主页
关于我们
课程, 直播, 视频, 客服, 模型设定, 研究设计, stata, plus, 绘图, 编程, 面板, 论文重现, 可视化, RDD, DID, PSM, 合成控制法
等
连享会小程序:扫一扫,看推文,看视频……
扫码加入连享会微信群,提问交流更方便
✏ 连享会-常见问题解答:
✨ https://gitee.com/lianxh/Course/wikis
New!
lianxh
和songbl
命令发布了:
随时搜索连享会推文、Stata 资源,安装命令如下:
. ssc install lianxh
使用详情参见帮助文件 (有惊喜):
. help lianxh