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