Stata论文复现:份额移动法工具变量(Shift-Share IV)

发布时间:2022-04-04 阅读 2413

Stata连享会   主页 || 视频 || 推文 || 知乎 || Bilibili 站

温馨提示: 定期 清理浏览器缓存,可以获得最佳浏览体验。

New! lianxh 命令发布了:
随时搜索推文、Stata 资源。安装:
. ssc install lianxh
详情参见帮助文件 (有惊喜):
. help lianxh
连享会新命令:cnssc, ihelp, rdbalance, gitee, installpkg

课程详情 https://gitee.com/lianxh/Course

课程主页 https://gitee.com/lianxh/Course

⛳ Stata 系列推文:

PDF下载 - 推文合集

作者:秦范 (北京大学)
邮箱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-


目录


1. Shift-Share IV 简介

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 回归估计因果效应,并分析结论的稳健性。

2. ADH 复现

2.1 ADH 简介

为研究中国进口渗透率增长对美国劳动力市场的影响,ADH 基于 1990-2000 和 2000-2007 两期数据,构建 SSIV:

其中,snt 表示  地 n 制造业在 t 期对应滞后一期 (十年) 的就业人数,占  地区制造业就业总人数的比例。t 取值为 1990 或 2000,gnt 则表示 t 期与美国可比的八个发达经济体 (包括澳大利亚、丹麦等国) n 制造业的中国进口增长率。

gnt 反映了中国生产率和其他八个发达经济体的供需冲击,消除了美国特定的冲击偏误,从而一定程度上满足 Shock 外生。但仍有可能存在相关技术冲击造成美国各行业的中国进口增长率 (Shock) 非随机。

在后文中,冲击统一指行业层面的中国进口增长率,SSIV 统一指冲击和行业份额交乘项。

2.2 安慰剂检验

为了验证 Shocks 的准随机性 (同期,对各行业的 Shock 是近似随机分配的),作者进行了两方面的安慰剂检验 (Falsification Tests 或平衡性检验):

  • 一是将行业层面的相关变量对冲击做回归。如果中国进口增长率同期对各行业的冲击是随机的,则中国进口增长率对各行业的相关特征变量不具有解释力;
  • 二是将地区层面的相关变量对 SSIV 做回归。类似地,如果同期对各行业的冲击是随机的,SSIV 对各地变量特征的影响也应不显著。

上述两个回归都加入了时期固定效应 (即 year 变量,取值为 1990 或 2000)。由此,为进行相关检验所选取的行业和地区变量很关键,下面详细说明。

2.2.1 行业层面平衡性检验

行业层面的生产特征变量选取了 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

2.2.2 地区层面平衡性检验

地区层面的特征变量选取了 ADH 的 5 个特征变量:地区大学学历人口占比、外国出生人口占比、女性工人占比、常规性职业就业占比、职业平均离岸指数,这些变量主要反映地区劳动力构成。进一步通过将事前趋势变量,即 1970s 和 1980s 的制造业就业增长率对 SSIV 回归,检验地区性事前平行趋势。

具体检验过程中,因为基于 Borusyak 等 (2022) 提出的准随机框架,冲击是在行业层面近似随机分配的,需要使用 ssaggregate 命令,故先将地区层面变量加总转换到行业层面 (冲击层面)。加总转换的逻辑是,将地区层面特征变量和 SSIV 对控制变量回归获取残差项。

其中,控制变量是滞后一期 (十年) 的总体行业份额加权的时期固定效应 (美国总体各行业就业份额与时期变量的交乘项);再将残差项 (partial out 不同时期与总体行业份额的影响后的地区特征变量) 加总平均,v¯n=esnvesnv¯n 表示冲击层面的特征变量均值, e 表示地区 l 就业人数,sn 表示地区 l 行业 n 就业份额。

运行代码后可以发现,转换后的数据集只剩下时期和行业识别变量、地区特征变量、地区事前趋势变量、总体中各行业份额和 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

2.3 主要结果和稳健性检验

本文主要使用 SSIV 估计中国进口增长率对美国地区制造业就业增长率的影响。回归结果显示中国进口冲击对美国本地制造业就业有显著负向影响。其中,y 表示被解释变量制造业就业增长率,X 为内生解释变量中国进口增长率,对应 SSIV 估计系数。所有模型标准误均调整为在三位行业代码 (SIC3) 层面聚类的冲击-稳健标准误,并报告了第一阶段 F 值。

controlset 表示每列回归结果控制变量的编号 (比较原文列示结果和代码直接导出的结果)。其中,列 (1) 控制了 ADH 时期固定效应、普查划分 (地区) 固定效应、初期状态变量 (2.2.2 所述地区层面特征变量)、期初制造业份额。由于存在不完全份额问题 (incomplete shares issue),即暴露份额加总 S=nsn 可能随地区 l 变化,列 (2) 控制滞后一期制造业份额,列 (3) 进一步控制滞后一期制造业份额与时期变量交乘项。

为了排除前文提出的数据在外国出生人口占比上表现出的非平衡性问题,列 (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

3. 参考文献

  • Bartik T J. Who benefits from state and local economic development policies? Kalamazoo, MI: WE Upjohn Institute for Employment Research[M]. 1991. -PDF-
  • Goldsmith-Pinkham P, Sorkin I, Swift H. Bartik instruments: What, when, why, and how[J]. American Economic Review, 2020, 110(8): 2586-2624. -PDF-
  • Acemoglu D, Autor D, Dorn D, et al. Import competition and the great US employment sag of the 2000s[J]. Journal of Labor Economics, 2016, 34(S1): S141-S198. -PDF-
  • 赵奎, 后青松, 李巍. 省会城市经济发展的溢出效应——基于工业企业数据的分析[J]. 经济研究, 2021, 56(03):150-166. -Link-

4. 相关推文

Note:产生如下推文列表的 Stata 命令为:
lianxh 论文复现, m
安装最新版 lianxh 命令:
ssc install lianxh, replace

相关课程

免费公开课

最新课程-直播课

专题 嘉宾 直播/回看视频
最新专题 文本分析、机器学习、效率专题、生存分析等
研究设计 连玉君 我的特斯拉-实证研究设计-幻灯片-
面板模型 连玉君 动态面板模型-幻灯片-
面板模型 连玉君 直击面板数据模型 [免费公开课,2小时]
  • Note: 部分课程的资料,PPT 等可以前往 连享会-直播课 主页查看,下载。

课程主页

课程主页

关于我们

  • Stata连享会 由中山大学连玉君老师团队创办,定期分享实证分析经验。
  • 连享会-主页知乎专栏,700+ 推文,实证分析不再抓狂。直播间 有很多视频课程,可以随时观看。
  • 公众号关键词搜索/回复 功能已经上线。大家可以在公众号左下角点击键盘图标,输入简要关键词,以便快速呈现历史推文,获取工具软件和数据下载。常见关键词:课程, 直播, 视频, 客服, 模型设定, 研究设计, stata, plus, 绘图, 编程, 面板, 论文重现, 可视化, RDD, DID, PSM, 合成控制法

连享会小程序:扫一扫,看推文,看视频……

扫码加入连享会微信群,提问交流更方便

✏ 连享会-常见问题解答:
https://gitee.com/lianxh/Course/wikis

New! lianxhsongbl 命令发布了:
随时搜索连享会推文、Stata 资源,安装命令如下:
. ssc install lianxh
使用详情参见帮助文件 (有惊喜):
. help lianxh