ChatGPT辅助Stata学术应用--合成控制法synth操作合集
synth-- 用于比较案例研究的合成控制方法
1、语法
synth depvar predictorvars , trunit(#) trperiod(#) [ counit(numlist) xperiod(numlist) mspeperiod() resultsperiod()
nested allopt unitnames(varname) figure keep(file) customV(numlist) optsettings ]
数据集必须使用 tsset panelvar timevar
声明为(平衡的)面板数据集;请参见 tsset
。在 depvar
和 predictorvars
中指定的变量必须是数值变量;不允许使用缩写。
2、描述
synth
实现了合成控制方法,用于在比较案例研究中进行因果推断。synth
通过比较受到干预的单位的聚合结果 depvar
的演变与合成控制组的同一聚合结果的演变,来估计感兴趣干预的效果。synth
通过寻找一个控制单位的加权组合来构建这个合成控制组,以便在结果预测变量方面近似受到干预的单位。合成控制组的结果演变是对受到干预单位在没有干预情况下将观察到的反事实的估计。synth
还可用于进行多种安慰剂和置换测试,以产生信息丰富的推断,无论可用的比较单位数量和时间段数量如何。有关详细信息,请参见 Abadie 和 Gardeazabal (2003) 以及 Abadie、Diamond 和 Hainmueller (2010, 2014)。
所需设置
depvar
:结果变量。predictorvars
:预测变量列表。默认情况下,所有预测变量在整个干预前期(从tsset timevar
指定的面板时间变量中可用的最早时间期到指定的trperiod
之前的时期)内进行平均。缺失值在平均时被忽略。用户有两个选项可以灵活地指定预测变量平均的时间段:
(1)
xperiod(numlist)
允许指定一个公共时期,以便对所有预测变量进行平均;请参见下文的详细信息。(2) 对于每个特定预测变量,用户可以指定该变量进行平均的时期。为此,
synth
使用特殊语法。时间期在变量名称后面用括号指定,例如varname(period)
,变量名称与其时间期之间没有空格。period
可以包含一个单一时期、一个数字列表或几个用“&”连接的时期。这些时期指的是在tsset timevar
中指定的面板时间变量。例如,假设时间周期以年份为单位,有四个预测变量X1
、X2
、X3
和X4
:
synth Y X1(1980) X2(1982&1986&1988) X3(1980(1)1990) X4
这表示:
X1(1980)
:1980年变量X1
的值作为预测变量。X2(1982&1986&1988)
:变量X2
在1982、1986和1988年的平均值作为预测变量。X3(1980(1)1990)
:变量X3
在1980年到1990年的平均值作为预测变量。X4
:由于没有提供特定时间期,该变量X4
将在整个干预前期(默认)或在xperiod(numlist)
中指定的时间期内进行平均,然后作为预测变量。trunit(#)
:受干预影响的单位编号,来自于tsset panelvar
中指定的面板 ID 变量;请参见tsset
。请注意,只能指定一个单位编号。如果感兴趣的干预影响了多个单位,用户可以先将这些单位组合在一起,然后将它们视为受干预影响的单个单位。trperiod(#)
:干预发生的时间期。时间期指的是在tsset timevar
中指定的面板时间变量;请参见tsset
。只能指定一个数字。
选项
counit(numlist)
:控制单位的单位编号列表,来自于tsset panelvar
中指定的面板 ID 变量;请参见tsset
。counit()
应作为整数列表(请参见numlist
)指定,并且必须至少包含两个控制单位。指定的控制单位列表构成所谓的“供体池”,即构建合成控制单位的潜在控制单位集。请注意,counit
是可选的,如果未指定,则供体池默认为在tsset
中指定的面板 ID 变量中可用的所有单位,排除trunit
中指定的受干预单位。xperiod(numlist)
:对predictorvars
中指定的预测变量进行平均的时间期列表。时间期列表指的是在tsset timevar
中指定的面板时间变量。例如,如果指定的面板时间变量以年份为单位,则xperiod(1980(1)1988)
表示预测变量在1980年到1988年的所有年份中进行平均。请参见numlist
了解如何指定数字列表。如果未指定
xperiod
,则xperiod
默认设置为整个干预前期,默认情况下,范围从面板时间变量中可用的最早时间期到干预前的时间期。请注意,干预的时间期本身不包括在平均中,缺失条目被忽略。同时请注意,特定变量的时间期总是优先于xperiod
。通常,xperiod
被指定为包含多个干预前期的时间段,尽管可以在干预后期包含时间段,如果预测变量不受干预影响。mspeperiod(numlist)
:用于最小化均方预测误差(MSPE)的干预前期时间段列表。时间段列表指的是在tsset timevar
中指定的面板时间变量;请参见tsset
。MSPE 指的是受干预单位与合成控制单位在mspeperiod(numlist)
中指定的所有干预前期的结果之间的平方偏差的总和。请参见numlist
了解如何指定数字列表。如果未指定
mspeperiod()
,则mspeperiod()
默认设置为整个干预前期,范围从面板时间变量中可用的最早时间期到干预前的时间期。请注意,干预的时间期本身不包括在mspeperiod()
中。通常,mspeperiod()
被指定为涵盖整个干预前期直至干预时间,但其他选择也是可能的。resultsperiod(numlist)
:在可选图形中(见figure
)、可选结果数据集(见keep
)和返回矩阵(见ereturn results
)中应获得synth
结果的时间期列表。时间期列表指的是在tsset timevar
中指定的面板时间变量。如果未指定resultsperiod
,则resultsperiod
默认设置为整个时期,默认情况下,范围从面板时间变量中可用的最早到最新时间期。nested
:默认情况下,synth
使用数据驱动的回归方法来获得V
矩阵中的变量权重。该方法依赖于约束二次规划例程,找到条件于回归基础的V
矩阵的最佳拟合W
权重。此过程快速,通常在最小化 MSPE 方面提供令人满意的结果。指定nested
将提高性能,但会增加计算时间。如果指定nested
,则synth
将进行完全嵌套的优化过程,搜索所有(对角)正半定V
矩阵和W
权重集合,以找到控制单位的最佳拟合凸组合。完全嵌套优化包含基于回归的V
作为起点,但通常会产生实现更低 MSPE 的凸组合。如果指定customV
并指定nested
,用户提供的V
矩阵将是嵌套优化的起点。用户可以根据其应用调整两个优化器的所有参数(请参见optimset
)。allopt
:如果指定了nested
(见nested
),用户还可以指定allopt
,如果她愿意为获得完全稳健的结果而付出更多的计算时间。有时,搜索空间可能包含局部最小值,以至于从回归基础的V
矩阵开始的嵌套优化程序可能无法在参数空间中找到全局最小值。allopt
通过使用三个不同的起点(基于回归的V
、相等的 权重和随机权重)来解决这个问题,尝试找到更优的解决方案。unitnames(varname)
:用于在可选图形中标记受干预单位和控制单位的变量名称;请注意,变量名称必须是面板 ID 变量的名称。figure
:如果指定,synth
将生成一幅包含结果变量在受干预单位和合成控制单位之间比较的图形。该图将包括受干预单位的实际结果和合成控制单位的预测结果(即反事实)。此外,用户还可以选择使用resultsperiod
指定的时间段来生成图形。keep(file)
:允许将所有结果保存在一个用户指定的.dta
文件中。结果包括受干预单位和合成控制单位的结果,以及生成的中间结果,供进一步分析使用。customV(numlist)
:用户提供的V
矩阵的上三角部分的值;必须提供(N*(N+1)/2)
个值,其中N
是counit
中指定的控制单位的数量。这个选项允许用户定义用于加权控制单位的相关性。请注意,如果未指定customV
,将使用基于预测变量的最小二乘回归生成的V
矩阵。optsettings
:允许指定优化设置的字符串,例如收敛标准、最大迭代次数和容忍度等,以调整优化过程的精确度和效率。
优化设置
控制参数margin(real)
:约束违规容忍度的边界,默认值为 5%(即 0.05)。maxiter(#)
:最大迭代次数,默认值为 1000。sigf(#)
:精确度(有效数字的数量),默认值为 7。bound(#)
:变量的裁剪边界,默认值为 10。
附加控制参数
在指定 nested
时,将进行嵌套优化,默认使用最大化设置。用户可以根据应用需求调整这些设置(例如,使用 synth ..., iterate(20)
)。
保存的结果
默认情况下,synth
会返回以下矩阵,用户可通过输入 ereturn list
来查看结果:
e(V_matrix)
:包含归一化变量权重的对角矩阵。e(X_balance)
:对比受干预单位和合成控制单位的预测变量值的矩阵。e(W_weights)
:控制单位的单位编号和权重矩阵。e(Y_treated)
:受干预单位在指定时间段的响应变量值矩阵。e(Y_synthetic)
:合成控制单位的响应变量值矩阵。e(RMSPE)
:包含均方根预测误差的矩阵。
4、示例
以下是一些使用 synth
命令的示例,以展示如何构建合成控制组:
加载示例数据
这是一个包含39个美国州在1970-2000年间的信息的面板数据集(参考Abadie, Diamond和Hainmueller (2010))。. use synth_smoking
声明数据集为面板数据
. tsset state year
示例 1 - 构建合成控制组
synth cigsale beer(1984(1)1988) lnincome retprice age15to24 cigsale(1988) cigsale(1980) cigsale(1975), trunit(3) trperiod(1989)
在这个例子中,受干预单位为单位编号3(加州),干预发生在1989年。未指定
counit()
时,默认捐赠池为其他38个州。示例 2 - 使用图形选项
synth cigsale beer lnincome(1980&1985) retprice cigsale(1988) cigsale(1980) cigsale(1975), trunit(3) trperiod(1989) fig
在此示例中,
beer
变量的平均值覆盖整个干预前期,而lnincome
仅覆盖1980和1985年。示例 3 - 限制控制单位
synth cigsale retprice cigsale(1970) cigsale(1979), trunit(33) counit(1(1)20) trperiod(1980) fig resultsperiod(1970(1)1990)
在此示例中,受干预单位为州编号33,控制单位限制为编号1至20的州。
示例 4 - 保存结果数据集
synth cigsale retprice cigsale(1970) cigsale(1979), trunit(33) counit(1(1)20) trperiod(1980) resultsperiod(1970(1)1990) keep(resout)
这个例子与上一个类似,但通过
keep(resout)
选项保存结果数据集。示例 5 - 嵌套优化
synth cigsale beer lnincome retprice age15to24 cigsale(1988) cigsale(1980) cigsale(1975), trunit(3) trperiod(1989) xperiod(1980(1)1988) nested
在此示例中,指定了
nested
选项,通常会在牺牲一些计算时间的情况下获得更好的拟合效果。**示例 6 - 运行安慰剂检验
. tempname resmat
forvalues i = 1/4 {
synth cigsale retprice cigsale(1988) cigsale(1980) cigsale(1975), trunit(`i') trperiod(1989) xperiod(1980(1)1988)
matrix `resmat' = nullmat(`resmat') \ e(RMSPE)
local names `"`names' `"`i'"'"'
}
mat colnames `resmat' = "RMSPE"
mat rownames `resmat' = `names'
matlist `resmat', row("Treated Unit")该示例演示了如何通过将干预迭代性地重新分配到前四个州来运行地方效应研究,并存储每次运行的均方根预测误差(RMSPE)。