Stata连享会 主页 || 视频 || 推文 || 知乎 || Bilibili 站
温馨提示: 定期 清理浏览器缓存,可以获得最佳浏览体验。
New!
lianxh
命令发布了:
随时搜索推文、Stata 资源。安装:
. ssc install lianxh
详情参见帮助文件 (有惊喜):
. help lianxh
连享会新命令:cnssc
,ihelp
,rdbalance
,gitee
,installpkg
⛳ Stata 系列推文:
作者:秦范 (北京大学)
邮箱:qf13032861571@163.com
编者按:本文主要摘译自下文,特此致谢!
Source:Borusyak K, Hull P, Jaravel X. Quasi-experimental shift-share research designs[J]. The Review of Economic Studies, 2022, 89(1): 181-213. -PDF- -Replication-
目录
Shift-Share IV (SSIV),或 Bartik IV,由一系列冲击按暴露程度份额加权构成。比如经典的 Bartik IV 是地方各行业份额与全国各行业增长率的内积 (Bartik,1991;Goldsmith-Pinkham 等,2020;赵奎等,2021)。其中,全国不同行业的增长率构成一系列冲击,各地行业份额组成不同,对同一冲击的暴露度不同,构成相应权重。
同时,当且仅当工具变量满足外生性和相关性条件,IV 估计量才满足一致性。针对 SSIV 所需满足的外生性条件,目前主要有两种观点:
一是 Share 需满足外生性。基于 Bartik IV 的两阶段最小二乘回归估计量 (TSLS estimators) 在数值上等于以地方行业份额为 IV、以全国增长率为权重矩阵所估计得出的 GMM estimator,并认为份额测度了对相同冲击的暴露度,SSIV 的因果识别以份额的外生性为前提 (Goldsmith-Pinkham 等,2020)。
二是 Shocks 需满足外生性。基于 SSIV 和不可观测的残差项的正交性,与潜在冲击和冲击层面不可观测因素的正交性等价,即 SSIV 回归估计量等价于在冲击层面的回归估计量,并认为一旦冲击是准随机分配的,暴露度份额即使是内生的,SSIV 也能实现因果识别 (Borusyak 等,2022)。而且相比于各地暴露份额都满足外生性,一系列冲击满足外生性要容易得多。
本文主要复现 Borusyak 等 (2022) 运用准实验理论框架 (冲击是外生的) 对 Autor, Dorn, and Hanson (2013,简称 ADH) 一文的研究思路,即先验证冲击是否满足一定外生性,再使用冲击层面的 IV 回归估计因果效应,并分析结论的稳健性。
为研究中国进口渗透率增长对美国劳动力市场的影响,ADH 基于 1990-2000 和 2000-2007 两期数据,构建 SSIV:
其中,
在后文中,冲击统一指行业层面的中国进口增长率,SSIV 统一指冲击和行业份额交乘项。
为了验证 Shocks 的准随机性 (同期,对各行业的 Shock 是近似随机分配的),作者进行了两方面的安慰剂检验 (Falsification Tests 或平衡性检验):
上述两个回归都加入了时期固定效应 (即 year 变量,取值为 1990 或 2000)。由此,为进行相关检验所选取的行业和地区变量很关键,下面详细说明。
行业层面的生产特征变量选取了 Acemoglu 等 (2016,简称 AADHP) 一文中的变量,具体包括:1991 年行业生产工人就业占比、资本与增加值之比、实际工资对数、1990 年电脑占总投资份额、高新技术设备占总投资份额等。这 5 个变量反映各行业的就业和技术结构。
所有回归聚类到三位行业代码层面 (SIC3),即采用冲击层面的稳健标准误 (exposure-robust SE)。Table3A 结果显示 Shock 在同期内对各个特征变量没有显著影响。
* 安装必要命令
ssc install ivreg2, replace
ssc install ivreghdfe, replace
ssc install estout, replace
ssc install ssaggregate, replace
* 获取相关数据
lxhget adh.zip, replace
unzipfile adh, replace
* Table 3A: industry-level balances
use ./adh/Data/industry_level, clear
local industry_vars prode_share1991 cap_va1991 log_avg_wage1991 ind_ci_1990 ind_htsh1_1990
* normalize g (shock)
qui sum g [aw=s_n] // weight = ind_share
replace g = (g-r(mean)) / r(sd)
eststo clear
foreach v of local industry_vars {
eststo : reg `v' g year [aw=s_n], cluster(sic3) // cluster 到 3 位行业代码
}
esttab using "./adh/Results/Table3A.csv", b(%9.3f) se(%9.3f) nocon ///
star(* 0.1 ** 0.05 *** 0.01) r2 replace obslast indicate(year) ///
title(Table3A) // obslast: observation num last
. esttab, b(%9.3f) se(%9.3f) nocon star(* 0.1 ** 0.05 *** 0.01) r2 replace ///
> obslast indicate(year) title(Table3A) compress
Table3A
---------------------------------------------------------------------------
(1) (2) (3) (4) (5)
prod~1991 cap_~1991 log_~1991 ind_ci_~0 ind_hts~0
---------------------------------------------------------------------------
g -0.011 -0.007 -0.005 0.750 0.532*
(0.012) (0.019) (0.022) (0.465) (0.296)
year Yes Yes Yes Yes Yes
---------------------------------------------------------------------------
R-sq 0.006 0.003 0.000 0.016 0.012
N 794 794 794 794 794
---------------------------------------------------------------------------
Standard errors in parentheses
* p<0.1, ** p<0.05, *** p<0.01
地区层面的特征变量选取了 ADH 的 5 个特征变量:地区大学学历人口占比、外国出生人口占比、女性工人占比、常规性职业就业占比、职业平均离岸指数,这些变量主要反映地区劳动力构成。进一步通过将事前趋势变量,即 1970s 和 1980s 的制造业就业增长率对 SSIV 回归,检验地区性事前平行趋势。
具体检验过程中,因为基于 Borusyak 等 (2022) 提出的准随机框架,冲击是在行业层面近似随机分配的,需要使用 ssaggregate
命令,故先将地区层面变量加总转换到行业层面 (冲击层面)。加总转换的逻辑是,将地区层面特征变量和 SSIV 对控制变量回归获取残差项。
其中,控制变量是滞后一期 (十年) 的总体行业份额加权的时期固定效应 (美国总体各行业就业份额与时期变量的交乘项);再将残差项 (partial out 不同时期与总体行业份额的影响后的地区特征变量) 加总平均,
运行代码后可以发现,转换后的数据集只剩下时期和行业识别变量、地区特征变量、地区事前趋势变量、总体中各行业份额和 SSIV。为获取行业冲击变量和三位 code 行业聚类变量,再匹配其他数据集。最后,在行业/冲击层面,将转换后的地区特征变量和事前趋势变量对冲击 g 回归。
Table3B 结果显示,地区受到的冲击越大,外国出生人口 (移民) 占比越高。同时,SSIV 与 1970s 制造业就业增长显著正相关,后续将讨论如何处理这种不平衡性 (稳健性检验)。但除此之外,冲击对其它特征变量均没有显著影响。
use ./adh/Data/location_level, clear
local location_vars l_sh_popedu_c l_sh_popfborn l_sh_empl_f l_sh_routine33 ///
l_task_outsource y1970 y1980
local basecontrols t2##c.Lsh_manuf
// period 与滞后一期的制造业各行业就业份额的交乘项:份额加权的时期 FE
* normalize z (SSIV)
qui sum z [aw=wei] // wei: Beginning-of-period total employment weight
replace z = (z-r(mean))/r(sd)
* to get conventional SE: implement reg at location level
foreach v of local location_vars {
ivreg2 `v' z `basecontrols' [aw=wei], cluster(clus) //location clus
local convse_`v' = _se[z]
}
* to get exposure-robust SE: implement reg at shock(industry) level
ssaggregate `location_vars' z [aw=wei], controls("`basecontrols'") l(czone) ///
t(year) sfilename(Lshares) n(sic87dd) s(ind_share)
/*
控制变量:地区层面变量和 SSIV 对控制变量回归/ partial out,获得残差项
两个数据集共有:l 识别变量地区;t 时期识别变量
外部数据集:行业权重外部数据 Lshares;n 行业识别变量;s 行业权重变量
*/
merge 1:1 sic87dd year using shocks, assert(3) nogen // assert:keep is _merge ==3
merge m:1 sic87dd using ./adh/Data/industries, assert(3) nogen
eststo clear
foreach v of local location_vars {
eststo : ivreg2 `v' (z=g) year [aw=s_n], cluster(sic3)
estadd scalar convse = `convse_`v''
}
esttab using "./adh/Results/Table3B.csv", b(%9.3f) se(%9.3f) nocon ///
star(* 0.1 ** 0.05 *** 0.01) r2 replace obslast indicate(year) ///
title(Table3B)
. esttab, b(%9.3f) se(%9.3f) nocon star(* 0.1 ** 0.05 *** 0.01) r2 replace ///
> obslast indicate(year) title(Table3B) compress
Table3B
----------------------------------------------------------------------------------------
(1) (2) (3) (4) (5) (6) (7)
l_sh_po~c l_sh_po~n l_sh_em~f l_sh_r~33 l_task_~e y1970 y1980
----------------------------------------------------------------------------------------
z 0.915 2.920*** -0.159 -0.302 0.087 0.543** 0.055
(1.196) (0.952) (0.521) (0.272) (0.075) (0.227) (0.187)
year Yes Yes Yes Yes Yes Yes Yes
----------------------------------------------------------------------------------------
R-sq 0.032 0.123 -0.004 0.002 0.058 0.116 0.001
N 794 794 794 794 794 794 794
----------------------------------------------------------------------------------------
Standard errors in parentheses
* p<0.1, ** p<0.05, *** p<0.01
本文主要使用 SSIV 估计中国进口增长率对美国地区制造业就业增长率的影响。回归结果显示中国进口冲击对美国本地制造业就业有显著负向影响。其中,y 表示被解释变量制造业就业增长率,X 为内生解释变量中国进口增长率,对应 SSIV 估计系数。所有模型标准误均调整为在三位行业代码 (SIC3) 层面聚类的冲击-稳健标准误,并报告了第一阶段 F 值。
controlset 表示每列回归结果控制变量的编号 (比较原文列示结果和代码直接导出的结果)。其中,列 (1) 控制了 ADH 时期固定效应、普查划分 (地区) 固定效应、初期状态变量 (2.2.2 所述地区层面特征变量)、期初制造业份额。由于存在不完全份额问题 (incomplete shares issue),即暴露份额加总
为了排除前文提出的数据在外国出生人口占比上表现出的非平衡性问题,列 (4) 剔除 ADH 控制变量。进一步借鉴 AADHP 控制行业特征变量,列 (5)-(7) 依次加入行业组固定效应 (一位行业代码)、生产特征 (2.2.1 所述行业特征变量) 以及滞后行业份额。可以发现回归结果没有显著差异。
此外,作者还在文中列示了 ADH 采用的地区层面聚类的 SE (convse
)。为获得更好的有限样本性质,作者还自行编写了 ssiv_null_imposed
命令,用于计算 null-imposed(impose null hypothesis) 置信区间。
local adhcontrols reg* l_sh_popedu_c l_sh_popfborn l_sh_empl_f l_sh_routine33 ///
l_task_outsource // Autor et al. (2013, ADH)
local aadhp_czcontrols cz_prode_share1991 cz_cap_va1991 cz_log_avg_wage1991 ///
cz_ind_ci_1990 cz_ind_htsh1_1990 // Acemoglu et al. (2016, AADHP)
local aadhpcontrols prode_share1991 cap_va1991 log_avg_wage1991 ind_ci_1990 ind_htsh1_1990
local controls1 `adhcontrols' l_shind_manuf_cbp t2
local controls2 `adhcontrols' Lsh_manuf t2
local controls3 `adhcontrols' t2##c.Lsh_manuf
local controls4 t2##c.Lsh_manuf
local controls5 `adhcontrols' t2##c.Lsh_manuf Lsh_sicgroup*
local controls6 `adhcontrols' t2##c.Lsh_manuf `aadhp_czcontrols'
local controls7 `adhcontrols' t2##c.Lsh_manuf Lsh_sicgroup* ind_share*
local indcontrols1
local indcontrols2
local indcontrols3 year
local indcontrols4 year
local indcontrols5 year i.sicgroup
local indcontrols6 year `aadhpcontrols'
local indcontrols7 year
// conventional SE
use "./adh/Data/location_level", clear
merge 1:1 czone year using "./adh/Data/Lshares_wide", assert(3) nogen
forvalues r=1/7 {
qui ivreg2 y (x=z) `controls`r'' [aw=wei], cluster(clus) partial(`controls`r'')
local beta_y_`r' = _b[x]
local conv_y_`r' = _se[x]
}
// industry level regressions
use "./adh/Data/industry_level_ext", clear
/*the extended industry-level file (数据已从地区数据处理为行业数据:
partial out controls 影响后的残差项按地区行业份额加权平均) */
tab sic87dd if sic87dd!=0, gen(ind_)
drop ind_1
tsset, clear
eststo clear
forvalues r=1/7 {
if (`r'==1) local iff = ""
else local iff = "if sic87dd!=0"
* produce and save SE with the null plugged in
adopath + "./adh/Code" // 设定文件夹中寻找相应 ado 文件
if (`r'!=7) ssiv_null_imposed `iff', range(-4 4) vce(cluster(sic3)) ///
controls(`indcontrols`r'') y(y`r') x(x`r')
else ssiv_null_imposed `iff', range(-4 4) vce(cluster(sic3)) ///
controls(`indcontrols`r'' ind_*) partial(ind_*) y(y`r') x(x`r')
local nullimp_left = r(cileft)
local nullimp_right = r(ciright)
* produce and save SSIV F-stat
if (`r'!=7) ivreg2 x`r' (z`r'=g) `indcontrols`r'' `iff' [aw=s_n], cluster(sic3)
else ivreghdfe x`r' (z`r'=g) `iff' [aw=s_n], cluster(sic3) absorb(sic87dd year)
local fs_f = (_b[z`r']/_se[z`r'])^2 // F = t^2
* now main industry-level regressions
if (`r'!=7) eststo : ivreg2 y`r' (x`r'=g) `indcontrols`r'' `iff' [aw=s_n], cluster(sic3)
else eststo : ivreghdfe y`r' (x`r'=g) `iff' [aw=s_n], cluster(sic3) absorb(sic87dd year)
estadd local controlset = "`r'"
estadd scalar fs_f = `fs_f'
estadd scalar convse = `conv_y_`r''
estadd scalar nullimp_left = `nullimp_left'
estadd scalar nullimp_right = `nullimp_right'
}
esttab using "./adh/Results/Table4.csv", b(%9.3f) se(%9.3f) ///
star(* 0.1 ** 0.05 *** 0.01) rename(x1 X x2 X x3 X x4 X x5 X x6 X x7 X) ///
title(Table4) scalars(controlset fs_f convse nullimp_left nullimp_right) ///
replace obslast drop(_cons prode_share1991 cap_va1991 log_avg_wage1991 ///
ind_ci_1990 ind_htsh1_1990 year *sicgroup* )
. esttab, b(%9.3f) se(%9.3f) star(* 0.1 ** 0.05 *** 0.01) compress ///
> rename(x1 X x2 X x3 X x4 X x5 X x6 X x7 X) title(Table4) ///
> scalars(controlset fs_f convse nullimp_left nullimp_right) ///
> replace obslast drop(_cons prode_share1991 cap_va1991 ///
> log_avg_wage1991 ind_ci_1990 ind_htsh1_1990 year *sicgroup*)
Table4
-----------------------------------------------------------------------------------------------------
(1) (2) (3) (4) (5) (6) (7)
y1 y2 y3 y4 y5 y6 y7
-----------------------------------------------------------------------------------------------------
X -0.596*** -0.489*** -0.267*** -0.314*** -0.310** -0.290** -0.432**
(0.114) (0.100) (0.099) (0.107) (0.134) (0.129) (0.205)
-----------------------------------------------------------------------------------------------------
controlset 1 2 3 4 5 6 7
fs_f 185.586 166.730 123.638 272.349 64.590 63.293 27.613
convse 0.099 0.086 0.086 0.097 0.104 0.101 0.193
nullimp_~t -1.059 -0.832 -0.568 -0.637 -0.705 -0.699 -1.207
nullimp_~t -0.395 -0.309 -0.028 -0.018 -0.002 0.002 0.122
N 796 794 794 794 794 794 794
-----------------------------------------------------------------------------------------------------
Standard errors in parentheses
* p<0.1, ** p<0.05, *** p<0.01
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