“1.RDD断点回归, Stata程序百科全书式的宝典“,“2.最强断点回归RDD方法资料主页!提供replication数据, 编写和注释完整的codes!”,“3.政策评估里的断点回归设计RDD是什么, 如何做?如何简单的理解?”,“4.复现经典RDD断点回归设计文献保姆级教程, 直接上手!” “5.她极度近视, 却凭该TOP5文掌控着关于RDD使用的话语权!

除了DID外,还有其他更可靠的因果识别策略,比如计量微信群里讨论很多的断点回归设计RDD,今天关注一下模糊断点回归设计在TOP刊的具体应用。
参考:关于(模糊)断点回归设计的100篇精选Articles专辑!!!

本文研究的是哥伦比亚在2018年对委内瑞拉强迫移民实施的身份正规化政策(PEP, Permiso Especial de Permanencia)的影响。在政治、经济与人道危机下,大量委内瑞拉人流入邻国,仅哥伦比亚就接收了超过250万人。PEP政策允许部分移民获得临时合法身份,从而进入正式劳动力市场、享受补贴医疗、社会保障等公共服务。本文通过严谨的实证设计评估这一政策对移民福祉的因果影响,并分析潜在的政策机制与财政效果。

作者在2020至2021年间对2232户移民家庭(3896人)进行了电话调查,涵盖哥伦比亚主要接收移民的城市。由于PEP的实施资格是基于一个先前、未公开的登记日期(RAMV截止于2018年6月8日),研究采用模糊断点回归设计(Fuzzy RDD)比较了该日期前后到达的移民群体,确保结果具备因果解释力。研究核心关注三个方面:移民的经济与健康福祉、服务可及性、以及劳动市场状况。

研究发现,PEP显著提升了强迫移民的生活水平。人均消费提高了48%,月劳动收入增长22%,健康状况提升1.2个标准差,综合福祉指数提升达1.65个标准差。这些结果显示出身份正规化在短期内对移民生活具有实质性的改善效应。

PEP改善福祉的主要机制在于增强了服务可及性。相比未正规化者,受益者更可能获得社会保障系统(+57个百分点)、补贴医疗(+27个百分点)、金融服务(+44个百分点)和政府转移支付(+22个百分点)。这些服务原本对非正规移民几乎完全关闭。中介效应分析也表明,服务接入解释了福祉改善效应的近一半,而劳动市场变量的作用相对较小。

虽然大多数PEP受益者仍在非正规部门就业,但正规化带来了10.8个百分点的正式就业提升,同时自雇比例下降了47个百分点。这说明PEP为移民进入正规劳动力市场提供了初步路径,但短期内仍存在结构性障碍。

作者的成本-收益分析显示,正规化移民家庭反而减少了政府财政负担。这是由于他们收入提高,带来了更高的增值税和其他税收,同时他们纳入医保系统后也降低了高昂的紧急医疗支出。这一结果具有重要政策意义,表明“合法化”可以是对政府财政友好的长期选择。

我们着重关注一下本文的识别策略——模糊断点回归设计Fuzzy RDD。以后若你忘记了FRDD方法,可以自觉查看这篇文章的内容。

实证策略

有效性威胁

仅凭上一节的描述性比较,尚不足以揭示 PEP(临时居留许可)对移民福祉的因果效应,原因主要有两点。

第一,如表3 所示,RAMV 登记移民平均比未登记者早 7 个月抵达哥伦比亚,部分差异可能只是更长融入时间的结果。

第二,PEP 在毫无预告的情况下推出,RAMV 亦是在未附带福利预期的背景下启动,两者登记均属自愿。因此,RAMV 与非 RAMV 移民本身或许已存在系统性差异,或者是否登记取决于某些难以观测、且与福祉相关的特征。

表 3 的 B、C 两栏在一定程度上缓解了第一项担忧:在 RAMV 启动之前,两组移民在多项社会人口学指标上大体可比,包括移民前在委内瑞拉的社会经济状况及影响迁移决策的因素。然而,在线附录表 G.1 和 G.2 关于“未登记 RAMV”与“未申请 PEP”原因的统计仍提示可能的混杂:未登记 RAMV 常因信息不足、缺乏国籍证明或无法抽身工作;未申请 PEP 则多与对政策不熟悉或丢失电子邮件形式的 RAMV 凭证有关。

若这些因素与研究关注的结果变量或难以观测的特质(如社交网络、创业意愿)相关,简单对比 RAMV 与非 RAMV 移民便可能对 PEP 效果产生偏误。

识别策略:模糊断点回归设计(fuzzy RDD)

为克服前述识别难题,本文采用模糊断点回归设计来估计 PEP 的因果效应,利用 RAMV 登记截止日所带来的获取资格概率跳跃。

RAMV 仅在 2018 年 4 月 6 日至 6 月 8 日开放登记。只有完成登记的强迫移民才可申请 PEP;6 月 8 日后抵达哥伦比亚的人无法登记,也就失去了申请资格。PEP 推出毫无预警,且除“已登记 RAMV”这一条件外没有其他门槛,也无并行政策干扰,因此适合用 RDD 识别。

具体而言,研究采用以下两阶段模型:

本研究的识别策略依赖于两阶段模型构建。方程(1)用于估计移民获得PEP的概率,该概率取决于其是否在RAMV登记系统关闭之前抵达哥伦比亚;方程(2)则将感兴趣的结果变量Y_ij建模为个体获得PEP的预测概率的函数。

其中,变量PEP_i = 1是一个指示变量,当个体获得PEP时取值为1。变量 T_i表示移民抵达哥伦比亚的时间,x_T表示RAMV系统关闭的日期。指示变量 T_i < x_T表示移民是否在RAMV仍开放期间抵达。因此,处理组包括那些在RAMV截止日前到达并有机会登记RAMV、继而获得PEP资格的强迫移民。

由于PEP的许多权益(如合法就业)主要针对个人,因此在大多数结果指标中,处理变量PEP_i = 1定义在个体层面。然而,对于一些家庭层面的结果变量(例如Sisbén社会保障登记、政府转移支付等),PEP的处理效应则按家庭层面定义,这是因为这些服务在法律层面上是按家庭为单位提供的;此外,像消费这样的变量也是在调查中以家庭为单位收集的。

模糊断点回归设计(fuzzy RDD)中的运行变量为d_i = T_i – x_T,即移民抵达日期与2018年6月8日(RAMV关闭日)之间的天数差。函数f(d_i)为该变量的局部线性多项式形式,允许断点两侧的线性关系不同,以更灵活地刻画政策实施前后的变化。

根据 Cattaneo、Idrobo 和 Titiunik(2020)的方法,本文使用最小均方误差(MSERD)准则为每个结果变量分别估计最优带宽,从而实现稳健的偏差修正推断。每个结果变量都有独立的最优带宽,因此对应的样本量可能不同。为确保稳健性,研究还在不同的多项式阶数和多种带宽设定下重复估算了全部结果。

回归模型中还控制了两组协变量:个体层面的X_ij和家庭层面的Z_i。前者包括RAMV实施前的移民个体特征,如年龄、性别、迁移前受教育年限、在委内瑞拉的工作经历、在哥伦比亚的定居时间,以及从上一次在委内瑞拉就业到迁移之间的时间间隔;后者包括迁移前家庭结构特征,如家庭规模与组成、是否有子女、是否接入公共服务、住房所有权状况、是否拥有智能手机等。此外,家庭是否在哥伦比亚已有亲友、是否在迁移前了解当地就业机会、以及是否因健康原因而迁移等变量,也被纳入控制。

模型中进一步控制了受访者所在抽样城市及当前居住州的固定效应,并设有两个误差项epsilonij和etaij。所有模型结果均报告了FDR(False Discovery Rate)q值,以调整多重假设检验所带来的潜在假阳性问题。

需要强调的是,移民抵达哥伦比亚的具体日期在本研究的识别策略中至关重要。这一变量首先来源于RAMV普查数据,并通过本研究的调查进行了核实。两个数据源在日期记录上的一致性极高,几乎无误。此外,定性访谈显示,移民普遍能清晰记住这一日期,因为对他们而言,那是一个极具转折意义的重要时刻。

点的有效性检验

图 2 上半部分按周绘制了移民申请 PEP 的平均概率。可以看到,随着 RAMV 登记在 2018 年 6 月 8 日关闭,申请概率出现明显跳跃,印证了处理概率的突变。

值得注意的是,少数在截止日后抵达的移民仍拿到了 PEP,与政策规定并不相符。这一现象很可能源于行政流程中的漏洞,而非受访者记忆或填报错误。我们的调查抵达日期与 PEP 申请表记录在 98.2% 的样本中一致;质性访谈亦显示,大多数移民对这一日期记忆清晰。对所有自称已申请 PEP 的受访者,作者均要求出示官方凭证,从而排除虚报可能。

主样本保留了这部分“违背者”,但剔除后重新估计(见在线附录图 H.1、表 H.1–H.3),结果在规模和显著性上几乎不变。

图 2 的灰色柱状图显示,每周抵达哥伦比亚的强迫移民数量在截点前后保持平稳;McCrary 检验同样未发现密度不连续(p = 0.96)。这与事实相符:RAMV 并非用来为移民提供合法化通道,政策出台前也无公开讨论或动员。调查中仅 0.5% 的受访者表示迁移是为了登记 RAMV。

我们还利用哥伦比亚移民局的官方数据,检验了委内瑞拉与哥伦比亚之间的合法迁移流量,结果同样未在截点前后观察到显著变化(见在线附录图 I.1 和 I.2)。

局部连续性假设的检验

表 1 检查了截点前后抵达的移民在个人和家庭特征上的可比性。以截点两侧样本为对象,将移民前及 RAMV 前变量作为因变量,估计尖锐 RDD。22 个系数中仅有 1 个在稳健估计器下达到显著性水平,表明两侧样本在边界附近高度相似。在线附录图 I.5 展示的传统、偏差校正与稳健估计结果同样支持局部连续性假设。

在在线附录表 B.2 和 B.3 中,我们将非 RAMV 样本限制为来自移民社群或熟人推荐的受访者,结论仍然一致。

最后,我们检验了强迫移民的社会经济特征是否随抵达日期系统性变化。首先,用一套详尽的迁前社会经济变量回归抵达日期,协变量整体不显著(见在线附录表 C.1)。其次,构建综合社会经济指数并与抵达日期作图(附录图 C.1),亦未发现明显关联。上述结果共同验证了局部连续性假设的有效性。

研究结果

图3呈现了研究的核心结果,以模糊断点回归设计(fuzzy RDD)的标准图像,展示了三个综合指标——社会经济福祉、服务获取和劳动市场——在政策断点附近的变化情况。图中每个点表示在不同区间内的组均值,曲线则是依据方程(1)和(2)通过两步法估算出的拟合结果,并附有95%置信区间。在RAMV截止日(2018年6月8日)处,可以清晰观察到各指标的明显跳跃,说明在此日期之前(即可注册RAMV并符合PEP资格)与之后抵达的强迫移民,在各项结果上存在显著差异。图中还显示了PEP对劳动市场的积极影响,尽管在这一维度上的估计精度相对较低。以下各节将分别详细介绍主要指标的点估计结果及其稳健性检验。

社会经济福祉

表4汇报了PEP对移民社会经济福祉的影响。第(1)列展示了综合指数的估计值,第(2)至(4)列则分别呈现劳动收入、人均消费和健康状况三个维度的具体估计结果。表中同时列出了标准误和多重假设检验调整后的FDR q值。

结果显示,PEP显著提升了移民的社会经济福祉:综合指数提升了1.65个标准差。其中,人均消费提高了48%,劳动收入增长了22%,健康状况指标提升了1.2个标准差。图J.1进一步印证了这一发现,各指标在政策断点附近均出现明显跳跃。

为更直观理解PEP对消费的提升幅度,作者将其与其他国家现金转移政策的影响进行对比。以哥伦比亚、墨西哥和印尼的有条件现金转移项目为例,其对总消费和食品消费的最大提升分别为15%和23%;而针对难民的现金援助计划(如土耳其、黎巴嫩)对总消费的提升也多在5%至23%之间。相比之下,PEP所带来的48%人均消费增长明显更为可观,是上述项目效果的两到三倍。

上述结论在多种模型设定下均表现稳健。图4显示,在不同带宽选择下,对消费和劳动收入的估计在带宽扩大时更加显著且稳定;健康状况方面的结果在四种最优带宽下均保持一致,尽管在带宽扩大后效应略有减弱。附录表L.4至L.7进一步验证了在不同核函数与多项式设定下的稳健性。值得注意的是,健康状况的结果在36种模型设定中有26种达到显著性标准。图J.4以二次多项式形式呈现的RD图,同样显示出人均消费和劳动收入在断点处的明显跃升。

服务获取

本节及下节将探讨PEP为何能改善移民福祉,重点分析其对服务可及性和劳动市场表现的影响。

表5展示了PEP对服务获取的估计结果。第(1)列为服务获取综合指数,第(2)至(5)列分别为四项具体服务指标:是否登记Sisbén(哥伦比亚社会保障系统)、是否获得补贴医保、是否拥有金融产品、是否获得政府转移支付。

结果显示,PEP显著提升了移民获取各类服务的机会:登记Sisbén的可能性提升了57个百分点;获得补贴医保的可能性提升了27个百分点;拥有金融账户等产品的可能性提升了44个百分点;获得政府转移支付的可能性提升了22个百分点;综合服务获取指数上升了38个百分点。

图J.2展示了上述服务变量的RD图,除了政府转移支付外,其余变量在RAMV截止日前后均出现明显跳跃。政府转移支付则呈现随抵达日期逐步下降的趋势。

值得强调的是,这些效果出现在PEP政策实施不到两年时间内,且对于不符合资格的移民而言,上述服务的获取率几乎为零(详见表5倒数第二行)。因此,可以认为PEP在短期内极大地拓展了服务可及性。不过,研究也指出服务扩张受到了政策供给与需求两方面的约束,包括制度壁垒、信息缺失或歧视等问题。

图5进一步验证了PEP对服务获取的影响在不同带宽设定下的稳健性,特别是在Sisbén、医保和金融产品三个方面。相比之下,政府转移支付的估计结果对带宽更为敏感:在较大带宽下,其效应由最优带宽下的22个百分点下降至14个百分点。附录表L.8至L.12也证实了各项估计在不同函数设定下的一致性。图J.5以二次局部多项式方式呈现的RD图进一步显示,除政府转移支付外,其他指标均在断点处呈现明显跃升。

劳动市场表现

本节进一步分析PEP如何通过改善劳动市场表现,进而提升移民的收入与社会经济地位。

表6报告了PEP对劳动市场的影响,包括一个综合指数和四个具体指标:就业概率、正式就业概率、是否为领薪雇员,以及就业质量(以“不想换工作”的比例反向衡量)。

整体来看,虽然估计结果在统计上不够显著,但其经济意义依然显著:劳动市场综合指数提升了25个百分点;正式就业率提升了10.8个百分点;领薪就业比例增加了47%;就业质量提升了11.9个百分点。

在COVID-19疫情期间,以及哥伦比亚劳动市场高度非正规化(2020年大城市正式就业率仅为55%,低收入群体仅为24%至31%)的背景下,这一短期提升已颇为可观,相当于平均正式就业水平的五分之一,甚至是低收入群体的三分之一。

图J.3显示,就业、正式就业与领薪工作的RD图在断点处均出现跳跃,尽管估计值不够精确。图6及附录表L.13至L.16的稳健性分析显示,除正式就业之外,其他指标对带宽和设定较为敏感,显著性较弱。图J.6也表明,在二次多项式设定下,劳动市场相关变量的图像特征不够清晰。

*下面是对文章里的图标复现的code,可以到社群下载。

*** Figure 4. RD Estimates for the Well-being Outcomes Using Different Bandwidths

global all_controls hhven_parents hhven_spouse hhven_other jobopp labven   ///

typeworkven1 typeworkven2 typeworkven3 ///

written_cont average yrseduc healthmig frdfam ///

smartven owner electven waterven sewageven female ///  

age child_venez time_col

preserve

local fe dpt1 dpt2 dpt3 dpt4 smpl1 smpl2 smpl3  

foreach var of varlist indexwellbeing  labour_income indexhealth {

foreach bw in mserd cersum cerrd msesum {

if “`bw'”==”mserd”                                 {

    local beta mat beta = [_b[Robust]]

    local sd mat sd = [_se[Robust]]

local bandw mat bandw = [e(h_l)]

    }

    else                                               {

    local beta mat beta = [beta_b[Robust]]

local sd mat sd = [sd_se[Robust]]

local bandw mat bandw = [bandwe(h_l)]

    }  

rdrobust `var’ date if sample_reg==1 , c(0) fuzzy(pepramv_i) level(90) ///

                kernel(triangular) bwselect(`bw’) p(1) all  ///

covs($all_controls `fe’) 

display “`bw'”

`beta’

`sd’

`bandw’

   }

forvalues t=50(50)450 {

rdrobust `var’ date if sample_reg==1 , c(0) fuzzy(pepramv_i) level(90)   ///

                kernel(triangular) h(`t’ `t’) p(1) all  ///

covs($all_controls `fe’) 

`beta’

`sd’

`bandw’

}

mat upper = beta + ((1.64)*sd)

mat lower = beta – ((1.64)*sd)  

mat data = [beta, sd, upper, lower, bandw] 

svmat data

rename data1 coef`var’

rename data2 sd`var’

rename data3 upper`var’

rename data4 lower`var’

rename data5 bw`var’

gen num=_n

gen label=””

replace label=”MSERD” if num==1

replace label=”CERSUM” if num==2

replace label=”CERRD” if num==3

replace label=”MSESUM” if num==4

replace label=”bw” if num>=5 & num<=13

local op1 mc(black) msize(*.8)

local op2 mc(gs9) msize(*.8) mlabel(label) mlabs(*.8) mlabc(black) m(T)

local op3 mc(maroon) msize(*.8) mlabel(label) mlabs(*.8) mlabc(maroon) m(D)

twoway (line upper`var’ lower`var’ bw`var’ if label==”bw”, lcolor(gray gray) lpattern(dash dash))  ///

   (connected coef`var’ bw`var’ if label==”bw”, `op1′  lcolor(black))                   ///

   (scatter coef`var’ bw`var’ if label==”MSERD”, `op2′  mlabp(11))     ///

   (scatter coef`var’ bw`var’ if label==”MSESUM”, `op2′  mlabp(4))     ///

   (scatter coef`var’ bw`var’ if label==”CERSUM”, `op2′  mlabp(12))    ///

   (scatter coef`var’ bw`var’ if label==”CERRD”, `op2′  mlabp(4)),   ///

        graphr(color(white)) plotr(m(medium) lc(black) lw(thin)) bgcolor(white)    ///

legend(off) yline(0, lp(shortdash) lcolor(red))                        ///

title({bf:`: var label `var”}, color(black) size(medium))                  ///

xlabel(50(50)450, labs(*.90))                              ///

xtitle(“{bf: Bandwidth (days around June 8, 2018)}”, size(medium))        ///

ylabel(, labs(*.90) nogrid) name(`var’, replace)                

*note(“{bf:Note:} `note'”, size(*.7) pos(7) span)

graph display, xsize(9) ysize(6) 

graph export “$path2.FiguresFig4_RDplot`var’.pdf”, replace 

drop num label

}

restore

preserve

local fe dpt1 dpt2 dpt3 dpt4 smpl1 smpl2 smpl3  

foreach var of varlist gasto_capita {

foreach bw in mserd cersum cerrd msesum {

if “`bw'”==”mserd”                                 {

    local beta mat beta = [_b[Robust]]

    local sd mat sd = [_se[Robust]]

local bandw mat bandw = [e(h_l)]

    }

    else                                               {

    local beta mat beta = [beta_b[Robust]]

local sd mat sd = [sd_se[Robust]]

local bandw mat bandw = [bandwe(h_l)]

    }  

rdrobust `var’ date if sample_reg==1 , c(0) fuzzy(trt) level(90) ///

                kernel(triangular) bwselect(`bw’) p(1) all  ///

covs($all_controls `fe’) 

display “`bw'”

`beta’

`sd’

`bandw’

   }

forvalues t=50(50)450 {

rdrobust `var’ date if sample_reg==1 , c(0) fuzzy(trt) level(90)   ///

                kernel(triangular) h(`t’ `t’) p(1) all  ///

covs($all_controls `fe’) 

`beta’

`sd’

`bandw’

}

mat upper = beta + ((1.64)*sd)

mat lower = beta – ((1.64)*sd)  

mat data = [beta, sd, upper, lower, bandw] 

svmat data

rename data1 coef`var’

rename data2 sd`var’

rename data3 upper`var’

rename data4 lower`var’

rename data5 bw`var’

gen num=_n

gen label=””

replace label=”MSERD” if num==1

replace label=”CERSUM” if num==2

replace label=”CERRD” if num==3

replace label=”MSESUM” if num==4

replace label=”bw” if num>=5 & num<=13

local op1 mc(black) msize(*.8)

local op2 mc(gs9) msize(*.8) mlabel(label) mlabs(*.8) mlabc(black) m(T)

local op3 mc(maroon) msize(*.8) mlabel(label) mlabs(*.8) mlabc(maroon) m(D)

twoway (line upper`var’ lower`var’ bw`var’ if label==”bw”, lcolor(gray gray) lpattern(dash dash))  ///

   (connected coef`var’ bw`var’ if label==”bw”, `op1′  lcolor(black))                   ///

   (scatter coef`var’ bw`var’ if label==”MSERD”, `op2′  mlabp(11))     ///

   (scatter coef`var’ bw`var’ if label==”MSESUM”, `op2′  mlabp(4))     ///

   (scatter coef`var’ bw`var’ if label==”CERSUM”, `op2′  mlabp(12))    ///

   (scatter coef`var’ bw`var’ if label==”CERRD”, `op2′  mlabp(4)),   ///

        graphr(color(white)) plotr(m(medium) lc(black) lw(thin)) bgcolor(white)    ///

legend(off) yline(0, lp(shortdash) lcolor(red))                        ///

title({bf:`: var label `var”}, color(black) size(medium))                  ///

xlabel(50(50)450, labs(*.90))                              ///

xtitle(“{bf: Bandwidth (days around June 8, 2018)}”, size(medium))        ///

ylabel(, labs(*.90) nogrid) name(`var’, replace)                

*note(“{bf:Note:} `note'”, size(*.7) pos(7) span)

graph display, xsize(9) ysize(6) 

graph export “$path2.FiguresFig4_RDplot`var’.pdf”, replace 

drop num label

}

restore

*** Figure 5. RD Estimates for the Service Access Outcomes Using Different Bandwidths

global all_controls hhven_parents hhven_spouse hhven_other jobopp labven   ///

typeworkven1 typeworkven2 typeworkven3 ///

written_cont average yrseduc healthmig frdfam ///

smartven owner electven waterven sewageven female ///  

age child_venez time_col

preserve

local fe dpt1 dpt2 dpt3 dpt4 smpl1 smpl2 smpl3  

foreach var of varlist services  subs  {

foreach bw in mserd cersum cerrd msesum {

if “`bw'”==”mserd”                                 {

    local beta mat beta = [_b[Robust]]

    local sd mat sd = [_se[Robust]]

local bandw mat bandw = [e(h_l)]

    }

    else                                               {

TOP刊上最新模糊RDD实战, 不需要人人都做DID, 附上数据和代码学FRDD操作, 今年必读.

    local beta mat beta = [beta_b[Robust]]

local sd mat sd = [sd_se[Robust]]

local bandw mat bandw = [bandwe(h_l)]

    }  

rdrobust `var’ date if sample_reg==1 , c(0) fuzzy(pepramv_i) level(90) ///

                kernel(triangular) bwselect(`bw’) p(1) all  ///

covs($all_controls `fe’) 

display “`bw'”

`beta’

`sd’

`bandw’

   }

forvalues t=50(50)450 {

rdrobust `var’ date if sample_reg==1 , c(0) fuzzy(pepramv_i) level(90)   ///

                kernel(triangular) h(`t’ `t’) p(1) all  ///

covs($all_controls `fe’) 

`beta’

`sd’

`bandw’

}

mat upper = beta + ((1.64)*sd)

mat lower = beta – ((1.64)*sd)  

mat data = [beta, sd, upper, lower, bandw] 

svmat data

rename data1 coef`var’

rename data2 sd`var’

rename data3 upper`var’

rename data4 lower`var’

rename data5 bw`var’

gen num=_n

gen label=””

replace label=”MSERD” if num==1

replace label=”CERSUM” if num==2

replace label=”CERRD” if num==3

replace label=”MSESUM” if num==4

replace label=”bw” if num>=5 & num<=13

local op1 mc(black) msize(*.8)

local op2 mc(gs9) msize(*.8) mlabel(label) mlabs(*.8) mlabc(black) m(T)

local op3 mc(maroon) msize(*.8) mlabel(label) mlabs(*.8) mlabc(maroon) m(D)

twoway (line upper`var’ lower`var’ bw`var’ if label==”bw”, lcolor(gray gray) lpattern(dash dash))  ///

   (connected coef`var’ bw`var’ if label==”bw”, `op1′  lcolor(black))                   ///

   (scatter coef`var’ bw`var’ if label==”MSERD”, `op2′  mlabp(11))     ///

   (scatter coef`var’ bw`var’ if label==”MSESUM”, `op2′  mlabp(4))     ///

   (scatter coef`var’ bw`var’ if label==”CERSUM”, `op2′  mlabp(12))    ///

   (scatter coef`var’ bw`var’ if label==”CERRD”, `op2′  mlabp(4)),   ///

        graphr(color(white)) plotr(m(medium) lc(black) lw(thin)) bgcolor(white)    ///

legend(off) yline(0, lp(shortdash) lcolor(red))                        ///

title({bf:`: var label `var”}, color(black) size(medium))                  ///

xlabel(50(50)450, labs(*.90))                              ///

xtitle(“{bf: Bandwidth (days around June 8, 2018)}”, size(medium))        ///

ylabel(, labs(*.90) nogrid) name(`var’, replace)                

*note(“{bf:Note:} `note'”, size(*.7) pos(7) span)

graph display, xsize(9) ysize(6) 

graph export “$path2.FiguresFig5_RDplot`var’.pdf”, replace 

drop num label

}

restore

preserve

local fe dpt1 dpt2 dpt3 dpt4 smpl1 smpl2 smpl3  

foreach var of varlist sisben govtr bank {

foreach bw in mserd cersum cerrd msesum {

if “`bw'”==”mserd”                                 {

    local beta mat beta = [_b[Robust]]

    local sd mat sd = [_se[Robust]]

local bandw mat bandw = [e(h_l)]

    }

    else                                               {

    local beta mat beta = [beta_b[Robust]]

local sd mat sd = [sd_se[Robust]]

local bandw mat bandw = [bandwe(h_l)]

    }  

rdrobust `var’ date if sample_reg==1 , c(0) fuzzy(trt) level(90) ///

                kernel(triangular) bwselect(`bw’) p(1) all  ///

covs($all_controls `fe’) 

display “`bw'”

`beta’

`sd’

`bandw’

   }

forvalues t=50(50)450 {

rdrobust `var’ date if sample_reg==1 , c(0) fuzzy(trt) level(90)   ///

                kernel(triangular) h(`t’ `t’) p(1) all  ///

covs($all_controls `fe’) 

`beta’

`sd’

`bandw’

}

mat upper = beta + ((1.64)*sd)

mat lower = beta – ((1.64)*sd)  

mat data = [beta, sd, upper, lower, bandw] 

svmat data

rename data1 coef`var’

rename data2 sd`var’

rename data3 upper`var’

rename data4 lower`var’

rename data5 bw`var’

gen num=_n

gen label=””

replace label=”MSERD” if num==1

replace label=”CERSUM” if num==2

replace label=”CERRD” if num==3

replace label=”MSESUM” if num==4

replace label=”bw” if num>=5 & num<=13

local op1 mc(black) msize(*.8)

local op2 mc(gs9) msize(*.8) mlabel(label) mlabs(*.8) mlabc(black) m(T)

local op3 mc(maroon) msize(*.8) mlabel(label) mlabs(*.8) mlabc(maroon) m(D)

twoway (line upper`var’ lower`var’ bw`var’ if label==”bw”, lcolor(gray gray) lpattern(dash dash))  ///

   (connected coef`var’ bw`var’ if label==”bw”, `op1′  lcolor(black))                   ///

   (scatter coef`var’ bw`var’ if label==”MSERD”, `op2′  mlabp(11))     ///

   (scatter coef`var’ bw`var’ if label==”MSESUM”, `op2′  mlabp(4))     ///

   (scatter coef`var’ bw`var’ if label==”CERSUM”, `op2′  mlabp(12))    ///

   (scatter coef`var’ bw`var’ if label==”CERRD”, `op2′  mlabp(4)),   ///

        graphr(color(white)) plotr(m(medium) lc(black) lw(thin)) bgcolor(white)    ///

legend(off) yline(0, lp(shortdash) lcolor(red))                        ///

title({bf:`: var label `var”}, color(black) size(medium))                  ///

xlabel(50(50)450, labs(*.90))                              ///

xtitle(“{bf: Bandwidth (days around June 8, 2018)}”, size(medium))        ///

ylabel(, labs(*.90) nogrid) name(`var’, replace)                

*note(“{bf:Note:} `note'”, size(*.7) pos(7) span)

graph display, xsize(9) ysize(6) 

graph export “$path2.FiguresFig5_RDplot`var’.pdf”, replace 

drop num label

}

restore

*** Figure 6. RD Estimates for the Labor Outcomes Using Different Bandwidths

global all_controls hhven_parents hhven_spouse hhven_other jobopp labven   ///

typeworkven1 typeworkven2 typeworkven3 ///

written_cont average yrseduc healthmig frdfam ///

smartven owner electven waterven sewageven female ///  

age child_venez time_col

preserve

local fe dpt1 dpt2 dpt3 dpt4 smpl1 smpl2 smpl3  

foreach var of varlist laborindex employed formal typework4_inv change_inv {  

foreach bw in mserd cersum cerrd msesum {

if “`bw'”==”mserd”                                 {

    local beta mat beta = [_b[Robust]]

    local sd mat sd = [_se[Robust]]

local bandw mat bandw = [e(h_l)]

    }

    else                                               {

    local beta mat beta = [beta_b[Robust]]

local sd mat sd = [sd_se[Robust]]

local bandw mat bandw = [bandwe(h_l)]

    }  

rdrobust `var’ date if sample_reg==1 , c(0) fuzzy(pepramv_i) level(90) ///

                kernel(triangular) bwselect(`bw’) p(1) all  ///

covs($all_controls `fe’) 

display “`bw'”

`beta’

`sd’

`bandw’

   }

forvalues t=50(50)450 {

rdrobust `var’ date if sample_reg==1 , c(0) fuzzy(pepramv_i) level(90)   ///

                kernel(triangular) h(`t’ `t’) p(1) all  ///

covs($all_controls `fe’) 

`beta’

`sd’

`bandw’

}

mat upper = beta + ((1.64)*sd)

mat lower = beta – ((1.64)*sd)  

mat data = [beta, sd, upper, lower, bandw] 

svmat data

rename data1 coef`var’

rename data2 sd`var’

rename data3 upper`var’

rename data4 lower`var’

rename data5 bw`var’

gen num=_n

gen label=””

replace label=”MSERD” if num==1

replace label=”CERSUM” if num==2

replace label=”CERRD” if num==3

replace label=”MSESUM” if num==4

replace label=”bw” if num>=5 & num<=13

local op1 mc(black) msize(*.8)

local op2 mc(gs9) msize(*.8) mlabel(label) mlabs(*.8) mlabc(black) m(T)

local op3 mc(maroon) msize(*.8) mlabel(label) mlabs(*.8) mlabc(maroon) m(D)

twoway (line upper`var’ lower`var’ bw`var’ if label==”bw”, lcolor(gray gray) lpattern(dash dash))  ///

   (connected coef`var’ bw`var’ if label==”bw”, `op1′  lcolor(black))                   ///

   (scatter coef`var’ bw`var’ if label==”MSERD”, `op2′  mlabp(11))     ///

   (scatter coef`var’ bw`var’ if label==”MSESUM”, `op2′  mlabp(4))     ///

   (scatter coef`var’ bw`var’ if label==”CERSUM”, `op2′  mlabp(12))    ///

   (scatter coef`var’ bw`var’ if label==”CERRD”, `op2′  mlabp(4)),   ///

        graphr(color(white)) plotr(m(medium) lc(black) lw(thin)) bgcolor(white)    ///

legend(off) yline(0, lp(shortdash) lcolor(red))                        ///

title({bf:`: var label `var”}, color(black) size(medium))                  ///

xlabel(50(50)450, labs(*.90))                              ///

xtitle(“{bf: Bandwidth (days around June 8, 2018)}”, size(medium))        ///

ylabel(, labs(*.90) nogrid) name(`var’, replace)                

*note(“{bf:Note:} `note'”, size(*.7) pos(7) span)

graph display, xsize(9) ysize(6) 

graph export “$path2.FiguresFig6_RDplot`var’.pdf”, replace 

drop num label

}

restore

群友可前往社群下载上述全文PDF和code。

关于断点回归设计RDD,可参看1.断点回归设计RDD分类与操作案例,2.RDD断点回归, Stata程序百科全书式的宝典,3.断点回归设计的前沿研究现状, RDD,4.断点回归设计什么鬼?且听哈佛客解析,5.断点回归和读者的提问解答,6.断点回归设计RDD全面讲解, 教育领域用者众多,7.没有工具变量、断点和随机冲击,也可以推断归因
8.找不到IV, RD和DID该怎么办? 这有一种备选方法,9.2卷RDD断点回归使用手册, 含Stata和R软件操作流程,10.DID, 合成控制, 匹配, RDD四种方法比较, 适用范围和特征,11.安神+克拉克奖得主的RDD论文, 断点回归设计,12.伊斯兰政府到底对妇女友不友好?RDD经典文献,13.PSM,RDD,Heckman,Panel模型的操作程序,14.RDD经典文献, RDD模型有效性稳健性检验,15.2019年发表在JDE上的有趣文章, 计量方法最新趋势,16.关于(模糊)断点回归设计的100篇精选Articles专辑!17.断点回归设计RDD精辟解释, 保证你一辈子都忘不了,18.“RDD女王”获2020年小诺奖!她的RD数据, 程序, GIS和博士论文可下载!关于她学术研究过程的最全采访!19.中国博导要求掌握的RDD方法实证运用范文(配程序code), 不然就不要用RDD做实证研究!20.最近70篇关于中国环境生态的经济学papers合辑!21.事件研究法用于DID的经典文献”环境规制”论文数据和程序,22.环境, 能源和资源经济学手册推荐, 经典著作需要反复咀嚼,23.中文刊上用断点回归RDD和合成控制法SCM的实证文章有哪些?不看至少需要收藏一下!24.上双一流大学能多赚多少钱? 学习断点回归RDD, 机制分析的经典文章!25.JPE上利用地理断点RDD和IV研究中国环境议题的do文件release!26.学习经济学会让你富有吗? 基于大学专业回报的断点回归分析,27.政策评估里的断点回归设计RDD是什么, 如何做?如何简单的理解?28.AER上用断点回归设计的经典文章有哪些?给出了具体的程序和code,29.AER: 严刑竣法真的可以减少犯罪吗? 断点回归设计RDD的经典!30.断点回归设计RDD的原理和实证指南, 年龄, 地理, 分数等断点应有尽有,31.最强断点回归RDD方法资料主页!提供replication数据, 编写和注释完整的codes!32.前沿: 农业与环境经济学中断点回归设计RDD万字综述与最新进展!
下面这些短链接文章属于合集,可以收藏起来阅读,不然以后都找不到了。

7年,计量经济圈近2000篇不重类计量文章,

可直接在公众号菜单栏搜索任何计量相关问题,

Econometrics Circle




数据系列空间矩阵 | 工企数据 | PM2.5 | 市场化指数 | CO2数据 |  夜间灯光 官员方言  | 微观数据 | 内部数据
计量系列匹配方法 | 内生性 | 工具变量 | DID | 面板数据 | 常用TOOL | 中介调节 | 时间序列 | RDD断点 | 合成控制 | 200篇合辑 | 因果识别 | 社会网络 | 空间DID
数据处理Stata | R | Python | 缺失值 | CHIP/ CHNS/CHARLS/CFPS/CGSS等 |
干货系列能源环境 | 效率研究 | 空间计量 | 国际经贸 | 计量软件 | 商科研究 | 机器学习 | SSCI | CSSCI | SSCI查询 | 名家经验