从今天开始,我们搬运Scott Cunningham的“Pedro’s diff in diff checklist”【有兴趣的人可以点击这里关注他的blog】。
大家也许还记得,
Sant' Anna有一个十步DID
:
第一步:画出处理模式图
第二步:呈现每个处理类别的处理个体数量
第三步:画出每个处理类别的平均结果时序图
第四步:处理配置机制---理论篇
第四步:处理配置机制---应用篇
第四步:处理配置机制---阿什费尔特沉降(Ashenfelter's Dip)
在上一篇推文中
第四步:处理配置机制---应用篇
,提到了
阿什费尔特的沉降(Ashenfelter's Dip)
。我曾在
【应用计量系列49】从DID到事件研究(五):教练可能是背锅侠
用足球数据讨论过这个问题。
阿什费尔特的沉降(Ashenfelter's Dip)
也是一种处理配置机制(即基于
阿什费尔特的沉降(Ashenfelter's Dip)
而选择进入处理)。今天想要讨论的问题很有趣:
3、如果你要修正处理前趋势中的问题,那么只能通过打破处理后时期平行趋势来解决。
理解DID的处理配置机制:
阿什费尔特的沉降(Ashenfelter's Dip)
约翰尼是一名自由职业者,他一直努力工作以维持生计。尽管他付出了努力,但他经常觉得自己运气不好,很难取得进步。一天,约翰尼在浏览报纸时,看到了一则 Python 编程课程的广告。他很感兴趣,但又不确定,于是和自己做了一个约定:如果明年工资至少没有今年高,他就报名参加这门课程。这种内心的约定反映了一种常见的决策过程,这种决策过程是由工人的工资下滑所驱动的——这种现象在劳动经济学界被称为“阿什费尔特下降”。
奥利·阿什费尔特 (Orley Ashenfelter) 在其 1978 年的论文《评估培训计划对收入的影响》中首次提出了阿什费尔特下降现象。该现象指的是收入暂时下降的个人更有可能参加培训计划,希望改善他们的未来前景。在他的研究中,阿什费尔特从两项劳动力调查中收集了丰富的面板数据——一项调查有职业培训参与者,另一项没有。他观察到,受训者群体的收入在培训当年大幅下降,之后大幅增加(下表 1)。例如,从 1963 年到 1964 年,白人男性受训者的收入从 1810 美元下降到 1551 美元,而他们的对照组没有经历这种下降。
image.png
这种选择机制,即决策受到近期收入变化的影响,在理解经济研究中的因果推断方面发挥着至关重要的作用。它不仅仅关乎数字,还关乎这些数字背后的人性故事——像约翰尼的故事一样,个人经历和经济机会交织在一起,形成了可以改变人生轨迹的决策。约翰尼和奥利的选择机制就是吉姆·赫克曼创造的“阿什费尔特下降”的形式。当一年的收入低于前一年时,个人更有可能参加项目,这反映了更广泛的经济行为模式和初始条件下的不平等。
我将 Ashenfelter's Dip 简单定义为工人在接受处理前一年的收入增长为负数时参加职业培训计划的情况。我尽量保持简单,但我会包含几个协变量。
首先,生成数据
我们生成4个地区,每个州1000名工人,他们属于四个不同的种族(标记为1-4)。每个工人的固定效应都来自于(1000-2500)的均匀分布。数据有6年——1987-1992年。
* step 4c.do. Ashenfelter's Dip as a treatment assignment mechanism clear all set seed 2 * First create the states quietly set obs 4 gen state = _n * Generate 1000 workers in each state expand 1000 bysort state: gen unit_fe=runiform(1000,2500) label variable unit_fe "Unique worker fixed effect per state" egen id = group(state unit_fe) * Generate race variable for different trends gen race = mod(_n, 4) + 1 * Generate the years expand 6 sort state bysort state unit_fe: gen year = _n gen n = year replace year = 1987 if year == 1 replace year = 1988 if year == 2 replace year = 1989 if year == 3 replace year = 1990 if year == 4 replace year = 1991 if year == 5 replace year = 1992 if year == 6
第二,产生潜在结果Y0
* Generate potential outcomes gen y0 = unit_fe + rnormal(0,10) if year == 1987 * Introduce trend and noise for subsequent years gen trend = 5 bysort state unit_fe: replace y0 = y0[_n-1] + trend + rnormal(0,10) if year == 1988 bysort state unit_fe: replace y0 = y0[_n-1] + trend + rnormal(0,10) if year == 1989 bysort state unit_fe: replace y0 = y0[_n-1] + trend + rnormal(0,10) if year == 1990 bysort state unit_fe: replace y0 = y0[_n-1] + trend + rnormal(0,10) if year == 1991 bysort state unit_fe: replace y0 = y0[_n-1] + trend + rnormal(0,10) if year == 1992
我将使用潜在结果对所有内容进行建模,因为这有助于我们更好地理解平行趋势,也使 ATT 变得更加容易估计,也容易根据基线 Y(0) 的变化配置处理。在第一年,一个人未经处理的收入等于他们的初始收入(即从 1,000 美元到 2,500 美元不等,作为他们的固定效应)加上一些正态分布的冲击。这让我们得到 1987 年的最低收入为 991 美元,最高收入为 2511 美元。
然后我们开始模拟趋势。1988 年,收入增加 5 美元,再加上另一个正态分布的冲击。然后 1989 年、1990 年、1991 年、1992 年再次呈现这些趋势。由于这个 Y(0) 是决定对照组和处理组在处理后是否处于可比路径上的潜在结果变量。但目前还没有人接受处理。
第三,根据阿什费尔特下降的特征来选择工人是否参加职业培训
下面,我们使用阿什费尔特下降的配置机制来将4000人中的部分工人配置到就业计划中。要实现这一点,请记住,我们将使用他们为处理的潜在收入是否“下降”作为标准,即1989-1990年的收入是否负增长。
* Determine treatment status based on negative change from 1989 to 1990 bysort state unit_fe: gen delta_pre = y0 - y0[_n-1] if year == 1990 bysort state unit_fe: gen treat = 0 replace treat = 1 if delta_pre < 0 & year == 1990 // Define the labels for each unique value label define treat_date_lbl 0 "never treated" /// 1 "Treated" // Assign the labels to the treat_date variable label values treat treat_date_lbl * Ensure treatment status remains consistent bysort id: egen max_treat = max(treat) bysort id: replace treat = max_treat * Plot the treatment group and control group kdensity delta_pre, kernel(rectangle) xtitle("Change in earnings from 1989 to 1990") xline(0, lwidth(medthick) lpattern(dash) lcolor(cranberry)) title("Change in Earnings from 1989 to 1990") subtitle("4000 workers") note("Ashenfelter Dip selected group is left of red dashed line.") graph export "./ashenfelter_dip.png", replace reg treat i.state i.race, robust
上述代码第一行计算了1989-1990年的收入变化,即“delta_pre”。按照我们的处理配置机制,如果“delta_pre<0”,则工人参加职业培训计划(处理组),否则不参加(控制组)。下面,我们看看工人的收入分布密度:大概有32%的工作1989-1990年收入下降了,因此,他们参加职业培训计划。
下面,我们来看看处理组和对照组在基期时收入差异:差异不大。处理组比控制组仅少36美元(相较于1500+收入)。同样的,处理组和对照组在居住地和种族方面似乎也非常相似。我也可以用处理状态对居住地和种族虚拟变量进行回归。也就是说,在基期处理组和对照组在很多方面不存在系统性差异。
image.png
选择进入处理的机制实际上并没有考虑居住地和种族特征,选择处理仅仅基于Y0(level),或者两期Y0的变化(change)。因此,结果的level与协变量特征无关,change也无关。
第四,生成Y和处理效应
我们要估计DID,因此,我们将生成一个处理后的虚拟变量(1991和1992年是处理后时期),并生成结果结果Y1。在处理前,Y1=Y0(注意,也隐含着无预期假设)。也就是说,个体在处理前没有处理效应,直到处理后1991和1992年才有处理效应,1991年职业培训带来100的处理效应,1992年带来300。这意味着ATT=(100+300)/2=200。
* Post-treatment variable gen post = 0 replace post = 1 if year >= 1991 * Generate y1 by adding treatment effect for treated units gen y1 = y0 replace y1 = y0 + 100 if year == 1991 & treat == 1 replace y1 = y0 + 300 if year == 1992 & treat == 1 * Treatment effect gen delta = y1 - y0 label var delta "Treatment effect for unit i (unobservable in the real world)" sum delta if treat==1 & post==1, meanonly gen att = `r(mean)' su att // ATT is $200 * Generate observed outcome based on treatment assignment gen earnings = y0 qui replace earnings = y1 if post == 1 & treat == 1
第五,可视化Y0和Y
在现实的观测研究中,我们是观测不到Y0的,但是在这个模拟中,我们可以。因此,记住,Y0并不是实际结果,对于处理组我们只关注反事实结果。
* Visualize the evolution of Y(0) preserve collapse (mean) y0, by(treat year) xtset treat year * Create individual plots with reference lines twoway (line y0 year if treat == 1, lcolor(blue) lwidth(medium)) /// (line y0 year if treat == 0, lcolor(red) lwidth(medium)), /// xline(1990.5, lcolor(black) lpattern(dash)) /// legend(order(1 "Treated" 2 "Control") pos(6) col(2)) /// title("Evolution of Y(0) for Treatment and Control Groups") /// xtitle("Year") ytitle("Mean Y(0)") /// xlabel(1987(1)1992)
image.png
上图展示了处理组和控制组的Y0趋势。在基期时(1990年),它们之间相差36美元,在其余时期,它们相差大约20美元。上图有一个有趣的现象:我们基于阿什费尔特下降来配置处理,这意味着处理组在1989-1990年的收入出现下降,但是我们也看到对照组出现上升。这意味着对照组现在只包括当年收入增加的工人。这可能是由于样本规模不够大,随着样本的增加,对照组处理前的收入增加可能并不会出现。
第二件值得注意的是,当这种选择机制在“delta_pre<0”上进行选择时,它还会产生水平差异,而不仅仅是基期本身的水平差异。我对此没有很好的(或任何)解释。只能说一定是 1989 年至 1990 年的收入变化选择了其他年份也更穷的人。我们知道基期的 Y(0) 是变化的一部分,因为每年收入都是 Y(0) + 5 + e(0,10),所以 Y(0) 符合规则,但它应该在差分中抵消,因为选择进入处理应该只针对误差项本身。所以我需要对此进行更多的思考。但出于某种原因,我们正在切掉两个随机变量的总和,这两个变量纯粹是随机性的,在两个时期内产生了足够的冲击,导致它下降。可能想用更大的样本进行实验,看看这些差距是否会缩小,如果没有,那么我需要对此进行更多的思考。
第三,看看处理后时期。虽然他们的收入在 1990 年有所下降,但请注意处理后工人的收入恢复了。这是因为整个样本具有相同的潜在结果趋势,都是trend=5。
看看每个人的Y0等于基期 Y0 + 5 +均值为零的噪声?那么,唯一可能违反平行趋势的情况是,如果样本被分成在处理后 Y0 中具有不同轨迹的组群。但请注意,无论你如何分配处理,Y0 始终是“某个基期值加 5 加平均值为 0的误差项”。因此,
这保证了平行趋势
。
为了真正开始更深入地研究这个问题(我可能改天再做),我们需要在 Y0 中产生更多的异质性——例如按种族和州。但目前,我想说的是,由于所有个体都遵循相同的轨迹,阿什费尔特下降可能不会对平行趋势产生实质性影响,尽管你会看到它确实有影响。
第六,可视化结果的变化
在现实研究中,我们唯一可以做的就是画出实际结果的时序变化图:
在这里,你可以看到像前面一样的处理前时期下降,你可以看到像以前一样的基期差异,你可以看到处理后收入的大幅相对增长。现在让我们将处理组和对照组的收入与处理组的反事实收入 (Y(0)) 叠加,这样你就可以看到,尽管出现了下降,但平行趋势仍然保持适度成立。
image.png
第七,估计ATT和事件研究
接下来,我使用静态TWFE模型和动态模型估计 ATT。我还将绘制事件研究图。回想一下,ATT 为 200 美元。1991 年的处理效应为 100 美元,1992 年为 300 美元。我们在估计动态处理效应做得比估算静态ATT要好,这值得思考。为什么您可能会认为静态 ATT 在处理后系数比点估计略有偏差。(提示:考虑一下第一次回归与第二次回归的基期是什么……)
* Regressions estimates clear reg earnings post##treat, robust reg earnings treat##ib1990.year, robust
image.png
第一个回归中的基期是整个处理前时期,我们知道 Y0 在基线时下降,导致平行趋势假设略有变化。但是当我们仅使用 1990 年的基期值时,如您在上图中看到的那样,它基本上已经恢复了。现在让我们看看第二个回归中的事件研究图。
* Event study reg earnings treat##ib1990.year, robust coefplot, keep(1.treat#*) omitted baselevels cirecast(rcap) /// rename(1.treat#([0-9]+).year = \1, regex) at(_coef) /// yline(0, lp(solid)) xline(1990.5, lpattern(dash)) /// title("Event study estimates of job trainings on worker wages") /// xlab(1987(1)1992)
image.png
我们可以看出,1991 年和 1992 年的 ATT 估计值完全准确。它们的真实值是 100 美元和 300 美元,估计值也是 100 美元和 300 美元。1991 年估计值的 95% 置信区间范围为 60 美元至 140 美元。1992 年估计值的 95% 置信区间范围为 259 美元至 339 美元。相当不错吧?
第八,事件研究的偏误
但仔细看看处理前趋势。它们不在0(而且都在0的一边)。虽然它们在统计上不显著,但从技术上讲它们不是零。我将很快重新估计包括工人固定效应在内的处理前点估计量。你们可能会有点惊讶。
areg earnings treat##ib1990.year, robust a(id)
image.png
首先,请注意置信区间变得不可见。这是因为系数的估计非常精确。所以这实际上是个好消息。当我们包括工人固定效应时,ATT 估计值要精确得多。1991 年的 95% 置信区间约为 +/- 70 美分。而 1992 年的置信区间约为 +/- 150 美元。因此,我们对真实效应的点估计值进行了非常精确的估计。
但正如蜘蛛侠所说,能力越大,责任越大。请注意,现在的处理前趋势非常糟糕。它们都是正,且显著。这是为什么?由于处理前趋势不为零,平行趋势是否不成立了?好吧,我们可以实际检查一下,因为我们有 Y(0) 变量,而通常你没有。因此运行此命令:
* Event study on y0 areg y0 treat##ib1990.year, robust a(id) coefplot, keep(1.treat#*) omitted baselevels cirecast(rcap) /// rename(1.treat#([0-9]+).year = \1, regex) at(_coef) /// yline(0, lp(solid)) xline(1990.5, lpattern(dash)) /// title("Event study estimates of parallel trends violations using Y(0)") /// note("Worker fixed effects included") /// xlab(1987(1)1992)
哇喔。发生了什么事?好吧,在我告诉你发生了什么之前,让我给你引用一下Kahn-Lang and Lang (2020) 摘要中的一段话。 完整截图如下:
仔细看摘要中的第 (3) 点:“(3) 处理前时期的平行趋势暗示了反事实的平行趋势,但平行的处理前趋势对于平行反事实趋势成立既不是必要的也不是充分的。”
好吧,我们刚刚证明了他们实际上是对的。处理前趋势不为零,但 Y(0) 中的处理后趋势(即平行趋势偏差的度量)为零。为什么?
原因是,选择处理是基于基期的下降。具体来说,是 Y0 的变化。但对于这些事件研究,平行趋势始于t-1 (即 1990 年才是基期)。而实际情况是,处理后,Y(0) 不再有任何突然变化,所有处理后平行趋势假设都是正确的。事实上,从 1990 年到 1991 年或从 1990 年到 1992 年,Y(0) 的变化正是我们的对照组的变化。但从 1987 年到 1990 年或从 1988 年到 1990 年,Y(0) 的变化并不是,因为在1990 年,收入相较于1989年出现了下降。
您可以尝试其他声明(也许用 1989 年代替 1990 年,或者用 1987 年代替 1990 年作为基期),这都无关紧要。因为虽然将基期回溯到较早的时期可能会导致处理前系数随时间逐年变化为零,但您违反了这些较早时期的平行趋势。请记住 -
平行趋势始终来自您选择的基期,并且仅来自您选择的基期
。我们的平行趋势始终与 1990 年有关,即使 1990 年正是他们看到下降的那一年(阿什费尔特的沉降(Ashenfelter's Dip))。如果我们回溯到更早期的删除年份,那么处理前趋势的系数确实会变为零,但此时也不能识别出“真实处理效应”。
* Regressions estimates clear areg earnings treat##ib1990.year, robust a(id) cap n estimates store att1 cap n estadd ysumm areg earnings treat##ib1989.year, robust a(id) cap n estimates store att2 cap n estadd ysumm areg earnings treat##ib1988.year, robust a(id) cap n estimates store att3 cap n estadd ysumm areg earnings treat##ib1987.year, robust a(id) cap n estimates store att4 cap n estadd ysumm
image.png
我们看看结果:1990 年(我们将 1990 年作为基期)具有正确的 ATT 的事件研究估计量,但具有显著的处理前趋势。但是,当我们删除 1989、1988 或 1987 时,看看会发生什么——事件研究的处理前趋势和处理后估计系数变得稳定
但错误
。这很有趣,因为通常研究者告诉我们,如果我们尝试不同的事件研究声明,并且我们感兴趣的点估计变得稳定,
因此我们就得到了稳健的结果
。但事实上情况并非如此。我们的点估计变得稳定,因为其他三年的平行趋势偏差总是错误的,约为 -16 美元。
那么,让我们选择其中之一,并在事件研究中加以说明,这样您就可以看到。请记住——我们知道 1991 年的 ATT 是 100,我们知道 1992 年的 ATT 是 300。所以我们知道第 1 列(去掉 1990 年)是正确的事件研究声明,因为那是平行趋势成立的点估计量,这就是那些估计是正确的原因。但现在让我们试着想象一下当我们使用第 2 列回归声明(去掉 1989 年)时发生了什么。
image.png
如您所见,这里的点估计量是错误的。真实效应是红色的 X。如果我们使用这个错误的回归声明进行估计,黑点就是我们的估计值。同样,为什么会发生这种情况?因为在我们使用的 Ashenfelter Dip 选择机制中,平行趋势假设是针对 1990 年,而不是 1989 年。因此,虽然我们可以继续回滚基期,并且事件研究图上的估计 ATT 变得“稳定”,但它们不是真实处理效应,会出现偏误。
第三部分:讨论
我想说点什么呢?首先,我们看到了阿什费尔特下降的一个例子。这很有趣,因为它很经典。你可以回到 Orley 的早期引述,他指出,他的受训人员在接受处理之前收入有所下降,这就是我们在这里产生的。
但是我们的 Ashenfelter's Dip 是一种非常特殊的处理分配机制,这种特殊的机制会给您带来问题,原因如下。由于选择处理是由于收入从t-2下降到t-1 ,所以所有处理前趋势图必然为非零。从机械上讲,它们都是非零的。但所有处理后估计量都是无偏的。我们通过多种方式证明了这一点——我们使用事件研究图证明了这一点,我们在事件研究图中证明了这一点估计 Y(0) 本身。平行趋势假设在处理后趋势中成立,但在处理期趋势不成立。
你需要记住的一件事——当有人告诉你,他们“证明了平行趋势成立”是因为处理前趋势成立时。请记住,他们并不完全正确。处理前趋势是我们选择正确控制组的最佳猜测,但奇怪的是,在这种情况下,即使这个控制组满足平行趋势,你也会抛弃这个控制组并寻找另一个控制组。
这就是悖论 ——如果不了解处理分配机制,你根本无法辨别这种处理选择是否会成为问题。换句话说,有些配置机制将个体分配给处理,这些机制满足平行趋势,但有趣的是,它们违反了处理前趋势!