R | 教程 RDD断点有效性和稳健性分析

“社会科学中的机器学习”第466篇推送

导言
以往推送介绍了如何利用rdrobust进行断点回归并呈现结果。但要利用RD进行研究设计首先需要证明断点的有效性,其次还需要对回归结果进行稳健性检验。本次推送就将结合rdrobust介绍如何进行断点有效性和结果稳健性检验。

RDD中的有效性检验

一般来说,像利用DID需要满足平行趋势一样,利用RD也需要满足一些先决条件。
局部平滑性假设
除了结果变量,所有其它变量在断点处都没有出现跳跃现象。
该假设可通过将其它变量作为结局变量,利用rdrobust函数进行检验。预期结果应该为其它变量的系数在统计学上不显著,具体代码如下
rdrobust(y = other variables, x = assignment variable) %>% summary()
驱动变量的有效性
驱动变量在断点附近样本个数应当相近,没有被认为操纵的迹象。
该假设可通过rddensity中的对应函数进行McCrary检验,文章数据仍然为上期推送的参议员数据,具体代码如下
library(rdrobust)
library(rddensity)
data(rdrobust_RDsenate)

rdplotdensity(rddensity(rdrobust_RDsenate$margin), X = rdrobust_RDsenate$margin)

上图中断点前后样本个数无显著差异,从而排除了驱动变量受到操控的假设。

RDD中的稳健性检验

对于RDD中的稳健性检验,一般对断点、样本选择和带宽进行分析。
断点的稳健性检验
在只有单一断点的情况下,若改变断点回归结果不再显著,可证明结果的稳健性。具体可使用rdrobust进行检验,预期结果为系数不再显著。具体代码如下
## 除c以外的参数应当与benchmark一致
sen_cut_1 <- rdrobust(rdrobust_RDsenate$vote, rdrobust_RDsenate$margin, c = -2, p = 1, kernel = 'triangular', bwselect = 'msetwo')
sen_cut_2 <- rdrobust(rdrobust_RDsenate$vote, rdrobust_RDsenate$margin, c = -1, p = 1, kernel = 'triangular', bwselect = 'msetwo') 
sen_cut_3 <- rdrobust(rdrobust_RDsenate$vote, rdrobust_RDsenate$margin, c = 0, p = 1, kernel = 'triangular', bwselect = 'msetwo') 
sen_cut_4 <- rdrobust(rdrobust_RDsenate$vote, rdrobust_RDsenate$margin, c = 1, p = 1, kernel = 'triangular', bwselect = 'msetwo') 
sen_cut_5 <- rdrobust(rdrobust_RDsenate$vote, rdrobust_RDsenate$margin, c = 2, p = 1, kernel = 'triangular', bwselect = 'msetwo')

## 创建含有coef和se的数据帧
coef <- c(sen_cut_1$coef[1], sen_cut_2$coef[1], sen_cut_3$coef[1], sen_cut_4$coef[1], sen_cut_5$coef[1])
se <- c(sen_cut_1$se[1], sen_cut_2$se[1], sen_cut_3$se[1], sen_cut_4$se[1], sen_cut_5$se[1])
robust_cutpoint <- data.frame(position = c(-2:2), coef, se)

## 利用ggplot2画图
(photo2 <- ggplot(data = robust_cutpoint, aes(x = position)) + geom_point(aes(y = coef), shape = 15)) + geom_errorbar(aes(ymin=coef-1.96*se, ymax=coef+1.96*se), width=.03) + geom_hline(yintercept = 0, colour = 'red')

上图中改变断点位置后系数不再显著,可证明结果稳健性
样本选择的稳健性检验
我们也可以随机去除断点附近的样本来证明结果的稳健性。若去除一定数量的样本后结果依然显著,则结果稳健。具体代码如下
## 生成去除30%、40%和50%样本个体的子样本
rdrobust_RD_hole_1 <- subset(rdrobust_RDsenate, abs(margin) > 0.3)
rdrobust_RD_hole_2 <- subset(rdrobust_RDsenate, abs(margin) > 0.4)
rdrobust_RD_hole_3 <- subset(rdrobust_RDsenate, abs(margin) > 0.5)

sen_hole_1 <- rdrobust(rdrobust_RD_hole_1$vote, rdrobust_RD_hole_1$margin, c = 0, p = 1, kernel = 'triangular', bwselect = 'msetwo')
sen_hole_2 <- rdrobust(rdrobust_RD_hole_2$vote, rdrobust_RD_hole_2$margin, c = 0, p = 1, kernel = 'triangular', bwselect = 'msetwo')
sen_hole_3 <- rdrobust(rdrobust_RD_hole_3$vote, rdrobust_RD_hole_3$margin, c = 0, p = 1, kernel = 'triangular', bwselect = 'msetwo')

带宽的稳健性检验
同样,我们也可以改变带宽进行稳健性检验。一般来说,可以尝试使用rdbwselect计算得出的若干种最优带宽。若回归系数依然显著,则可证明结果稳健性。具体代码如下
sen_bandwidth_1 <- rdrobust(rdrobust_RD_hole_1$vote, rdrobust_RD_hole_1$margin, c = 0, p = 1, kernel = 'triangular', bwselect = 'msetwo')
sen_bandwidth_2 <- rdrobust(rdrobust_RD_hole_2$vote, rdrobust_RD_hole_2$margin, c = 0, p = 1, kernel = 'triangular', bwselect = 'cerrd')
sen_bandwitch_3 <- rdrobust(rdrobust_RD_hole_3$vote, rdrobust_RD_hole_3$margin, c = 0, p = 1, kernel = 'triangular', bwselect = 'cercomb')

注:操作平台为RStudio v1.4 Preview Release

文章来源:https://blog.rstudio.com/2020/09/30/rstudio-v1-4-preview-visual-markdown-editing/,更多请点击“阅读原文”

(0)

相关推荐