推荐8篇《数量经济技术经济研究》上应用 honestdid 进行DID平行趋势/置信区间敏感性检验论文
Roth 等(2023)指出政策前趋势检验并非平行趋势假设的有效证据,传统检验方法可能造成估计偏差和扭曲。
假定在不满足平行趋势假设时,对政策后点估计量的置信区间进行敏感性分析,若其置信区间在一定相对偏离程度下仍未穿过临界值,则说明平行趋势假设的成立较为稳健。
1、全国统一大市场与经济增长——来自安徽省加入长三角城市经济协调会的证据
借鉴Beck等(2010)的做法,构建渐进双重差分模型
基准回归
平行趋势检验
平行趋势敏感性经验
稳健性检验
1.溢出效应检验 2.排除其他政策干扰 3.地理断点回归 4.Goodman-Bacon分解 安慰剂检验 其他稳健性检验
2、法律制度完善、跨区域合作与省际边界地区绿色发展——来自《旅游法》实施的准自然实验
双重差分模型
基准回归
稳健性检验
平行趋势检验
诚实双重差分方法(Honest DID)
双重机器学习检验
安慰剂检验
替换被解释变量
缩小样本区间
控制高维固定效应
排除替代性假设
3、“亩均论英雄”改革与企业高质量发展——基于效率变革和动力变革的视角
渐进式双重差分模型
平行趋势检验
诚实双重差分方法(Honest DID)
双向固定效应偏误识别与异质性处理效应检验
安慰剂检验
稳健性检验
论文5:环境规制会改变劳动力需求结构吗?——基于“大气十条”的理论分析与实证检验
来源:最新--《数量经济技术经济研究》2024年第10期目录及命令汇总
倾向得分匹配代码(PSM)
psmatch2
双重差分法
reghdfe
动态效应分析/事件研究
reghdfe
简单绘图
coefplot
平行趋势检验
honestdid
论文4:法律制度完善、跨区域合作与省际边界地区绿色发展--来自《旅游法》实施的准自然实验
来源:《数量经济技术经济研究》,网络首发时间:2024-09-27 12:04:08
模型
利用《旅游法》实施的准自然实验构建双重差分模型,计量模型设定如下:
基准回归
稳健性检验
利用平行趋势检验、双重机器学习、安慰剂检验、替换被解释变量、缩小样本区间、高维固定效应、排除替代性假设等方法进行稳健性检验
该文平行趋势检验部分,采用诚实双重差分方法(Honest DID)进行平行趋势敏感性检验。
论文3:企业间技术转让的知识溢出效应——来自专利转让的证据
来源:最新--《数量经济技术经济研究》2024年第9期目录及命令汇总
匹配后平衡性检验
pstest
基准估计
reghdfe
平行趋势假设敏感性检验
reghdfe honestdid
双重差分方法的稳健估计
排除工具变量内生性的再检验
ivreghdfe
论文2:市场激励型环境规制与能源消费结构转型——来自中国碳排放权交易试点的经验证据
主要采用 honestdid 命令进行相关检验
论文1、绿色信贷政策与中国企业出口产品绿色重构
该文采用面板回归模型
稳健性检验主要包括:
预期效应检验
平行趋势检验
还利用变更基期、置信区间敏感性分析、三重差分方法进一步验证
安慰剂检验
采用 honestdid 命令进行相关检验
上图分别展示了在不同相对偏离程度下待检验处理效应的平行趋势敏感性分析结果 。
DID平行趋势检验命令honestdid
编者按:本文主要摘译自下文,特此致谢!
Source:https://github.com/mcaceresb/stata-honestdid
honestdid软件包实现了由Rambachan and Roth (2022)提出的用于稳健估计和双重差分DID的敏感性分析和事件研究。
背景
Rambachan 和 Roth 中的稳健估计方法,主要用于平行趋势检验,即直觉认为事前平行趋势能提供关于平行趋势的相关信息,它们提供了几种不同的方法来说明这是什么检验方法。
相对规模的边界。将这个想法形式化的一种方法是 要说处理后违反的平行趋势 程度不能比处理前的程度大得多。
这可以通过强加处理后违反平行趋势不超过一些常量 大于 在预处理期间最大限度地违反平行趋势。例如, 的值强加了处理后违反平行趋势不超过最差的处理前违反平行趋势(连续周期之间)。同样 设置 意味着处理后违反 平行趋势不超过处理前时期的两倍。
平滑度限制。正式化的第二种方法是说 处理后违反平行趋势也不能偏离 很大程度上来自前趋势的线性外推。特别是,我们可以 强制要求趋势前的斜率在连续周期内变化不超过 M。
因此,施加 的平滑度限制意味着 趋势的反事实差异完全是线性的,而较大的 的值允许更多的非线性。
其他限制。Rambachan 和 Roth 框架允许 对趋势差异的各种其他限制。但是,并非所有这些都已在此Stata版本中实现 的包。此功能计划在将来的版本中发布。
稳健的置信区间。给定类型的限制如上所述,Rambachan 和 Roth 提供了创建稳健的方法 保证包含真实参数的置信区间 至少95%的时间,当施加的限制满足。这些置信区间解释了存在估计的事实 治疗效果估计和我们对前预趋势。
敏感性分析。上述方法自然而然地适合本身进行敏感性分析。也就是说,研究人员可以报告 不同假设下的处理后违反平行趋势的严重程度(例如,不同的 或 .)置信区间,他们还可以报告“细分值” (或)表示特定结论---例如最大的 的值,其效果仍然很大。
软件包安装
可以使用以下命令安装软件包:net install
local github https://raw.githubusercontent.com
net install honestdid, from(`github'/mcaceresb/stata-honestdid/main) replace
honestdid _plugin_check
也可以在Stata软件界面输入help honestdid进行下载,如下图所示:
案例 -- 医疗补助扩展
作为该包的说明,我们将检查使用公开数据扩大医疗保险范围 。我们首先加载与 分析。
* Install here coefplot, ftools, reghdfe, plot scheme
local github https://raw.githubusercontent.com
ssc install coefplot, replace
ssc install ftools, replace
ssc install reghdfe, replace
net install scheme-modern, replace from(`github'/mdroste/stata-scheme-modern/master)
set scheme modern
* Load data
local mixtape https://raw.githubusercontent.com/Mixtape-Sessions
use `mixtape'/Advanced-DID/main/Exercises/Data/ehec_data.dta, clear
l in 1/5
+--------------------------------------------+
| stfips year dins yexp2 W |
|--------------------------------------------|
1. | alabama 2008 .6814122 . 613156 |
2. | alabama 2009 .6580621 . 613156 |
3. | alabama 2010 .6313651 . 613156 |
4. | alabama 2011 .6563886 . 613156 |
5. | alabama 2012 .6708115 . 613156 |
+--------------------------------------------+
数据是州级面板,其中包含有关健康保险的信息 覆盖范围和医疗补助扩展。该变量显示 在该州有健康保险的低收入无子女成年人。这 变量给出州扩大医疗补助覆盖范围的年份 根据“平价医疗法案”,如果该州从未扩大。
估计标准DID
为简单起见,我们将首先重点评估对违反非交错 DiD中的平行趋势。因此,我们限制样本到 2015 年及更早的年份,并删除少量 2015年首次接受治疗的州。我们现在只剩下一个面板数据集,其中某些单元在 2014 年首次处理,其余单元在采样期间不接受处理。然后我们可以使用典型的双向固定效应事件研究规范来估计医疗补助扩张的影响,
其中,如果一个单位在 2014年首次处理,则 D 为1 ,否则为 0。
* Keep years before 2016. Drop the 2016 cohort
keep if (year < 2016) & (missing(yexp2) | (yexp2 != 2015))
* Create a treatment dummy
gen byte D = (yexp2 == 2014)
gen `:type year' Dyear = cond(D, year, 2013)
* Run the TWFE spec
reghdfe dins b2013.Dyear, absorb(stfips year) cluster(stfips) noconstant
local plotopts ytitle("Estimate and 95% Conf. Int.") title("Effect on dins")
coefplot, vertical yline(0) ciopts(recast(rcap)) xlabel(,angle(45)) `plotopts'
使用相对幅度限制进行灵敏度分析
我们现在准备应用 honestdid软件包来做灵敏度分析。假设我们有兴趣评估 2014年的估计值,即处理后的第一年。和 选项指定相应系数的指数 具有处理前和处理后事件研究系数 (不包括2013年的那个,标准化为零);Stata的符号是允许的。最后,指定 的值。pre()``post()``numlist``mvec()
honestdid, pre(1/5) post(7/8) mvec(0.5(0.5)2)
| M | lb | ub |
| ------- | ------ | ------ |
| . | 0.029 | 0.064 | (Original)
| 0.5000 | 0.024 | 0.067 |
| 1.0000 | 0.017 | 0.072 |
| 1.5000 | 0.008 | 0.080 |
| 2.0000 | -0.001 | 0.088 |
(method = C-LF, Delta = DeltaRM, alpha = 0.050)
首先,请注意,在这种情况下,系数是有序的,并且主要是连续,pre为之前1 至 5期,post为 7 至 8。如果系数恰好在 不同的 orders, positions, ,或者如果控制变量包含在 回归,用户可以将任意索引列表传递。例如pre(1/5)``post(7/8)``pre()``post()
honestdid, pre(1 2 3 4 5) post(7 8) mvec(0.5(0.5)2)
给出相同的结果。其次,请注意返回的系数向量包括的条目,参考周期为 从回归中省略,但包含在估计向量中。可以告诉忽略省略的回归量,当 指定可变索引;这在以下情况下特别有用 是许多这样的协变量。例如reghdfe``2013``honestdid
reghdfe dins b2013.year##D, absorb(stfips year) cluster(stfips) noconstant
matrix list e(b)
honestdid, pre(1/5) post(6/7) mvec(0.5(0.5)2) omit
给出相同的结果(即系数向量包含几个 省略回归量的零,但对于我们只需要的选项 为包含的回归量指定索引)。重要的是 这里的后期指数是6和7,因为参考期是 不再包括在内。此外,该选项不排除 零;相反,它排除了指示被省略的向量条目 来自回归(基于系数向量的列名; 请参阅了解更多信息)。omit``omit``help _ms_omit_info
最后,在没有控件或 用户已将处理前和后处理系数收集到自定义中 载体,也可以只指定预处理的数量 期间通过和将自动承担 第一个条目是预处理系数,其余条目是 后处理系数。numpre()``honestdid``numpre
reghdfe dins b2013.Dyear, absorb(stfips year) cluster(stfips) noconstant
honestdid, numpre(5) mvec(0.5(0.5)2) omit
mata index = 1..5, 7..8
mata st_matrix("b", st_matrix("e(b)")[index])
mata st_matrix("V", st_matrix("e(V)")[index, index])
matrix list b
matrix list V
honestdid, numpre(5) mvec(0.5(0.5)2)
在所有情况下,命令的输出都显示 不同值的置信区间。我们看到 显著效果的“细分值”为 , 这意味着重大结果对于允许违规是稳健的 的并行趋势高达最大违规的两倍 治疗前期。honestdid
我们还可以使用该选项可视化灵敏度分析。我们可以在 CI 计算时传递选项,或者我们 可以使用来自(缓存在内存中的)的最后一个结果。coefplot``honestdid
honestdid, coefplot cached
其他选项将传递给coefplot
local plotopts xtitle(Mbar) ytitle(95% Robust CI)
honestdid, cached coefplot `plotopts'
使用平滑度限制进行灵敏度分析
我们还可以根据平滑度进行灵敏度分析 限制---即强加趋势差异的斜率 变化不超过M期间之间。
local plotopts xtitle(M) ytitle(95% Robust CI)
honestdid, pre(1/5) post(6/7) mvec(0(0.01)0.05) delta(sd) omit coefplot `plotopts'
| M | lb | ub |
| ------- | ------ | ------ |
| . | 0.029 | 0.064 | (Original)
| 0.0000 | 0.026 | 0.061 |
| 0.0100 | 0.013 | 0.079 |
| 0.0200 | 0.003 | 0.091 |
| 0.0300 | -0.007 | 0.101 |
| 0.0400 | -0.017 | 0.111 |
| 0.0500 | -0.027 | 0.121 |
(method = FLCI, Delta = DeltaSD, alpha = 0.050)
我们看到显著效应的击穿值为 , 这意味着我们可以拒绝零效应,除非我们愿意允许 连续周期的线性外推偏差为 超过0.03个百分点。
平均效应或其他周期的敏感性分析
到目前为止,我们专注于第一次后处理的效果 句点,这是 HonestDiD 中的默认值。如果我们感兴趣 在两个治疗后时期的平均值中,我们可以使用 选择:l_vec(matrix_name)
matrix l_vec = 0.5 \ 0.5
local plotopts xtitle(Mbar) ytitle(95% Robust CI)
honestdid, l_vec(l_vec) pre(1/5) post(6/7) mvec(0(0.5)2) omit coefplot `plotopts'
| M | lb | ub |
| ------- | ------ | ------ |
| . | 0.040 | 0.075 | (Original)
| 0.0000 | 0.041 | 0.075 |
| 0.5000 | 0.033 | 0.080 |
| 1.0000 | 0.020 | 0.090 |
| 1.5000 | 0.006 | 0.103 |
| 2.0000 | -0.008 | 0.117 |
(method = C-LF, Delta = DeltaRM, alpha = 0.050)
更一般地说,该包支持任何标量的推理 形式为 的参数,其中 是动态向量 治疗效果。因此,例如,创建和设置允许我们对 治疗后的第二个时期。matrix l_vec = 0 \ 1``l_vec(l_vec)
使用并行包加速
honestdid内置支持用户编写的parallel包(最新稳定版))。可以指定parallel processes; default 4。parallel(#)表示M。例如
net install parallel, from(https://raw.github.com/gvegayon/parallel/stable) replace
mata mata mlib index
honestdid, pre(1/5) post(7/8) mvec(0.5(0.5)2) parallel(4)
交错DID
到目前为止,我们专注于一个简单的案例,不是交错/多时点DID。幸运的是,HonestDiD方法适用于交错处理下DiD的最新介绍方法。下面,我们将展示如何将该包与实现Callaway and Sant’Anna的 did 包一起使用。
local mixtape https://raw.githubusercontent.com/Mixtape-Sessions
use `mixtape'/Advanced-DID/main/Exercises/Data/ehec_data.dta, clear
qui sum year, meanonly
replace yexp2 = cond(mi(yexp2), r(max) + 1, yexp2)
qui csdid dins, time(year) ivar(stfips) gvar(yexp2) long2 notyet
csdid_estat event, window(-4 5) estore(csdid)
estimates restore csdid
local plotopts xtitle(Mbar) ytitle(95% Robust CI)
honestdid, pre(3/6) post(7/12) mvec(0.5(0.5)2) coefplot `plotopts'
交错DID
HonestDiD还与中引入的Chaisemartin and D'Haultfoeuille (2020)估计兼容 ,可用于Stata命令did_multiplegt进行操作
local mixtape https://raw.githubusercontent.com/Mixtape-Sessions
use `mixtape'/Advanced-DID/main/Exercises/Data/ehec_data.dta, clear
gen byte D = (year >= yexp2) & !mi(yexp2)
did_multiplegt dins stfips year D, robust_dynamic dynamic(5) placebo(5) breps(50) cluster(stfips)
honestdid, pre(7/11) post(1/6) vcov(didmgt_vcov) b(didmgt_results_no_avg)