【应用计量系列148】Sant' Anna的DID规定动作(4-1):写好制度背景---处理配置机制

文摘   2024-06-29 09:20   广东  

CIMERS暑期班,因果推断最新进展+量化宏观,全新回归!


👉面板数据模型(DID等)最新进展及其stata应用,点击查看

👉DSGE第一课与Dynare编程,点击查看


成为CIMERS内部学员,你可以获得

⭐ 高质量课程,详细课件,可复用代码及数据

⭐ 许老师详尽答疑服务,知无不言,学无止境

⭐ 高质量的交流社群(主要为硕博以及高校教师)

⭐ 许老师增值讲座,文献解读,模型讲解

⭐ 未来课程内部学员折扣

⭐⭐诚邀您加入CIMERS,许老师正在寻找好的合作者,一起作出高质量研究⭐⭐

报名任意课程即可成为CIMERS内部学员



恳请各位老师同学动动发顶刊的小手,点个赞和在看,让更多人看到我们的研究,您的支持是CIMERS最大的动力!





从今天开始,我们搬运Scott Cunningham的“Pedro’s diff in diff checklist”【有兴趣的人可以点击这里关注他的blog】。

大家也许还记得,Sant' Anna有一个十步DID

第一步:画出处理模式图

第二步:呈现每个处理类别的处理个体数量

第三步:画出每个处理类别的平均结果时序图

第四步:处理配置机制

个体会基于许多因素来决定是否进入处理。例如,人们参与一项疫苗临床试验,被随机配置到打疫苗,而随机配置是根据一个工具(IV)---掷骰子决定的。又例如,由于年龄这样的可观测因素才会配置打疫苗,这个时候我们会选择匹配(matching)方法。又或者仅仅是因为官员的政绩,并要求在6月28日出生前的人才配置打疫苗,而6月28日之后出生的人则不打,这被称之为驱动变量,因此我们要选择断点回归(RD)设计。

总之,每一种处理配置机制都意味着特定的假设,根据这些假设来选择对应的研究设计和估计量。如果配置是随机的,那么,我们仅仅只需要比较处理组和控制组的结果均值。如果存在非遵从性(non-compliance),我们就要使用基于掷骰子的工具变量。如果配置是基于可观测变量,那么我们可以使用匹配方法,如果是基于驱动变量,我们就要使用局部多项式回归。也就是说,处理配置机制决定了研究设计的选择。我们在应用研究中,一定不要省略处理配置机制的阐述(一般在制度背景部分)。

首先,我们来讲讲哪些处理配置机制可以说明平行趋势(选择DID的关键),哪些配置机制不能说明。2024年Pedro Sant'Anna, Dalia Ghanem and Kaspar Wüthrich的工作论文“Selection and parallel trends”。他们在论文中讨论了许多不同类型的选择过程(the various types of selection processes)以证明平行趋势可信。下面,我们以“基于未处理的潜在结果Y(0)来做选择”为例。

基于截面的未处理潜在结果的选择

这是什么意思?这意味着个体根据相对于某个阈值的预期未处理潜在结果决定是否参与。下面用一个例子来说明。

我们假设处理事食品券计划(SNAP),潜在结果是收入。我们想研究SNAP对收入的影响。假设,如果一个人未接受处理的潜在结果低于某个收入阈值(100美元),那么,这个人就会参与SNAP。我们来模拟100万人的数据集:

clear all
set seed 1
set obs 1000000

gen id = _n
gen y0 = 100 + rnormal(0,20)
gen y1 = 150 + rnormal(0,15)
gen delta = y1-y0
su delta // ATE is 49.97953

y0和y1是每个人的潜在结果。yi的平均值是150,y0的平均值是100,因此,ATE是50。个体处理效应范围是-68—177。但注意,此时还没有发生处理。

根据未处理的潜在结果阈值来选择处理

* selection based on y0: y1 _||_ D

gen d=0
replace d=1 if y0<=100 /// 这意味着收入小于100的时候,参加SNAP

* Create the aggregate conditional causal effects
egen ate = mean(delta)
egen att = mean(delta) if d==1
egen atu = mean(delta) if d==0
su ate // ATE is 49.97953
su atu // ATI is 33.97148
su att // ATT is 65.94704

有趣的是,当处理配置基于Y0,而不是Y1时,Y0的平均值在处理组和控制组之间是有差异的,但Y1没有差异。例如:

* Check for independence with respect to y0
summarize y0 if d==0 // 115.9762
summarize y0 if d==1 // 84.05979

* check for independence with respect to y1

summarize y1 if d==0 // 149.9476
summarize y1 if d==1 // 150.0068

从上面结果可以看出,Y0的结果在处理组和控制组差异较大(115 vs 84),而Y1的结果在处理组和控制组没有差异(149 vs 150)。

两期未处理潜在结果的配置机制

我们想知道基于未处理的潜在结果的配置如何影响处理组和控制组Y0的变化:

* selection_outcomes.do: selection into treatment based on Y(0)

* Set up
clear all
set seed 2

* First create the states
quietly set obs 40
gen state = _n

* Generate 1000 workers. These are in each state. So 25 per state.
expand 25
bysort state: gen unit_fe=runiform(1,1000)
label variable unit_fe "Unique worker fixed effect per state"
egen id = group(state unit_fe)

* Generate pontential outcomes
gen y0 = unit_fe + rnormal(0,10)

上述模拟数据生成了40个州,每个州15名工人,共1000人,2年的数据,其中工人固定效应来自均匀分布。基准年份是1990年,处理后年份是1991年。未处理的潜在结果y0仅仅是个体固定效应与误差。

下面,我们来看看处理配置过程。当一个人未处理的潜在结果(收入)低于阈值时,就会进入处理。假设低于25分位,就有资格参加SNAP。

* Determine treatment status in 1990
su y0, detail
gen treat = 0
replace treat = 1 if y0 < `r(p25)'

* Generate the years
expand 2
sort state
bysort state unit_fe: gen year = _n
gen n = year
replace year = 1990 if year == 1
replace year = 1991 if year == 2

* Post-treatment
gen post = 0
replace post = 1 if year == 1991

replace y0 = y0 + 1000 if year == 1991

只要我们确定了处理配置机制(收入低于25分位),就可以创建处理后(1991)未处理的潜在结果y0。同时,我们也要生成处理后的潜在结果y1,用它来计算ATE:

gen y1 = y0
replace y1 = y0 + 7500 if year==1991

* Treatment effect
gen delta = y1 - y0
label var delta "Treatment effect for unit i (unobservable in the real world)"

sum delta if post == 1, meanonly
gen ate = `r(mean)' // $7,500
sum delta if treat==1 & post==1, meanonly
gen att = `r(mean)' // $7,500

* Generate observed outcome based on treatment assignment
gen earnings = y0 //如果个体在对照组或者处理前,那么,收入等于y0,否则为y1
qui replace earnings = y1 if post == 1 & treat == 1

Y(0)与平行趋势

下面,我们来看看处理配置机制(收入低于25分位)如何产生平行趋势。

* Illustrate parallel trends assumption
su y0 if treat==1 & post==0
gen ey0_10 = `r(mean)'
su y0 if treat==1 & post==1
gen ey0_11 = `r(mean)'
su y0 if treat==0 & post==0
gen ey0_00 = `r(mean)'
su y0 if treat==0 & post==1
gen ey0_01 = `r(mean)'

gen parallel_trends = (ey0_11 - ey0_10) - (ey0_01 - ey0_00)

reg y0 post##treat, robust

su parallel_trends
image.png

我们可以看出,当选择进入处理是基于Y0,例如,1990年的未处理结果,那么,这会产生平行趋势。这是因为潜在结果Y0并不基于处理状态,而是处理状态基于Y0。

我们来看看 DID:

1000名工人参加SNAP的ATT是7500,DID估计量是:

* Diff-in-diff
su earnings if treat==1 & post==0
gen ey_10 = `r(mean)'
su earnings if treat==1 & post==1
gen ey_11 = `r(mean)'
su earnings if treat==0 & post==0
gen ey_00 = `r(mean)'
su earnings if treat==0 & post==1
gen ey_01 = `r(mean)'

gen did = (ey_11 - ey_10) - (ey_01 - ey_00)

reg earnings post##treat, robust

su did att
image.png

总而言之,这意味着,制度背景中要给出的信息应该是:如果你认为人们正在看自己的基期收入,并认为自己的收入太低,可以选择进入处理,但是他们并不是在想处理的因果效应(即仅仅基于Y0,而不是Y1-Y0),那么,这种处理配置机制与平行趋势一致,我们就可以使用DID研究设计




宏观研学会
关注宏观经济与宏观经济学研究前沿问题,推广、普及DSGE及其他宏观经济研究方法。
 最新文章