如何在R语言的RDplot中添加置信区间虚线?
问题原因与解决方法
核心问题
你代码里的abline(v = c(lower_bound, upper_bound))完全逻辑错误:est1$ci是RD处理效应(x=0处的跳跃幅度)的置信区间,属于y轴数值范围,但你用v=画垂直于x轴的线,两者坐标维度不匹配,自然看不到预期效果。另外,rdplot默认不会保留拟合数据,直接用abline也无法精准对应绘图逻辑。
解决方案分两种场景
场景1:给x=0处的处理效应(跳跃)加置信区间虚线
如果要展示x=0位置,处理组拟合值的置信区间上下限(水平虚线),可以这样做:
# 计算RD估计值 est1 = rdrobust(y = y1, x = x, c=0, cluster=cluster, covs=covs) # 运行rdplot并提取拟合数据(关键:加returnplot=TRUE) plot_obj <- rdplot(y=y1, x=x, subset=-est1$bws[1,1]<= x & x <= est1$bws[1,2], covs=covs, binselect="esmv", kernel="triangular", h=c(est1$bws[1,1], est1$bws[1,2]), p=1, title="", y.label="School records", x.label="Margin of Victory", returnplot = TRUE) # 提取控制组和处理组的拟合截距 control_intercept <- plot_obj$rdplot$coefs[1, 1] # 计算x=0处处理组拟合值的置信区间上下限 treat_ci_lower <- control_intercept + est1$ci[1, 1] treat_ci_upper <- control_intercept + est1$ci[1, 2] # 添加水平虚线(置信区间)和x=0参考线 abline(h = c(treat_ci_lower, treat_ci_upper), lty = "dotted", col = "darkred") abline(v = 0, lty = "solid", col = "black")
场景2:给整条拟合线加置信区间虚线
如果要给控制组、处理组的拟合线分别添加全程置信区间虚线,代码如下:
# 计算RD估计值 est1 = rdrobust(y = y1, x = x, c=0, cluster=cluster, covs=covs) # 运行rdplot并提取拟合数据 plot_obj <- rdplot(y=y1, x=x, subset=-est1$bws[1,1]<= x & x <= est1$bws[1,2], covs=covs, binselect="esmv", kernel="triangular", h=c(est1$bws[1,1], est1$bws[1,2]), p=1, title="", y.label="School records", x.label="Margin of Victory", returnplot = TRUE) # ---------------------- 处理控制组拟合线的置信区间 ---------------------- x_control <- seq(-est1$bws[1,1], 0, length.out=100) # 控制组拟合值 y_control <- plot_obj$rdplot$coefs[1,1] + plot_obj$rdplot$coefs[1,2] * x_control # 计算控制组标准误(基于rdrobust的方差矩阵) se_control <- sqrt(vcov(est1)[1,1] + vcov(est1)[2,2]*x_control^2 + 2*vcov(est1)[1,2]*x_control) # 置信区间上下限 y_control_lower <- y_control - 1.96*se_control y_control_upper <- y_control + 1.96*se_control # ---------------------- 处理处理组拟合线的置信区间 ---------------------- x_treat <- seq(0, est1$bws[1,2], length.out=100) # 处理组拟合值 y_treat <- plot_obj$rdplot$coefs[2,1] + plot_obj$rdplot$coefs[2,2] * x_treat # 计算处理组标准误 se_treat <- sqrt(vcov(est1)[3,3] + vcov(est1)[4,4]*x_treat^2 + 2*vcov(est1)[3,4]*x_treat) # 置信区间上下限 y_treat_lower <- y_treat - 1.96*se_treat y_treat_upper <- y_treat + 1.96*se_treat # 添加置信区间虚线 lines(x_control, y_control_lower, lty="dotted", col="steelblue") lines(x_control, y_control_upper, lty="dotted", col="steelblue") lines(x_treat, y_treat_lower, lty="dotted", col="steelblue") lines(x_treat, y_treat_upper, lty="dotted", col="steelblue")
关键注意事项
- 必须给
rdplot添加returnplot = TRUE参数,才能提取拟合系数和数据,否则无法自定义添加置信区间。 - 确保在
rdplot执行后立即运行添加线条的代码,不要插入其他清空绘图设备的命令(比如dev.new())。
内容的提问来源于stack exchange,提问作者ak7880
相关产品推荐
相关产品推荐

