You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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")

关键注意事项

  1. 必须给rdplot添加returnplot = TRUE参数,才能提取拟合系数和数据,否则无法自定义添加置信区间。
  2. 确保在rdplot执行后立即运行添加线条的代码,不要插入其他清空绘图设备的命令(比如dev.new())。

内容的提问来源于stack exchange,提问作者ak7880

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 13:44:55