如何用ggplot绘制运行变量两侧各5分箱的断点回归图(x轴连续)
ggplot绘制断点回归图:纯ggplot实现分箱均值方案
需求:仅用ggplot(不使用其他包)绘制断点回归图,截断点0两侧各设5个分箱,显示分箱条件均值点,保持x轴连续。原代码按单个
running_var值计算均值,不符合分箱要求。
纯ggplot解决方案(无需额外包)
library(ggplot2) # 过滤数据(保留原逻辑) filtered_data <- subset(mydata, absolute_running_var < 0.10) # 绘制断点回归图 ggplot(filtered_data, aes(x = running_var, y = outcome_var)) + # 绘制分箱均值点:左右各5个等宽箱 stat_summary_bin( fun = mean, # 计算分箱内的均值 breaks = seq(-0.1, 0.1, by = 0.02), # 手动设置分箱断点:±0.1范围内分10个箱,左右各5个 geom = "point", # 用点展示均值 size = 2, color = "black" ) + # 截断点左侧线性拟合 geom_smooth( data = subset(filtered_data, running_var <= 0), method = "lm", se = TRUE, color = "blue" ) + # 截断点右侧线性拟合 geom_smooth( data = subset(filtered_data, running_var > 0), method = "lm", se = TRUE, color = "red" ) + # 添加截断点竖线 geom_vline(xintercept = 0, linetype = "dashed", color = "gray50") + # 标签与主题设置 labs(x = "running_var", y = "outcome_var", title = "断点回归图") + theme(plot.title = element_text(color = "black", size = 14, face = "bold"))
代码关键说明
- 分箱设置:通过
breaks = seq(-0.1, 0.1, by = 0.02)手动指定10个等宽分箱,每个箱宽度0.02,刚好在截断点0两侧各5个箱,完全匹配需求 - 均值计算:
stat_summary_bin直接在ggplot内部计算每个分箱的结果变量均值,无需额外数据预处理 - x轴连续:分箱断点基于连续的
running_var范围,x轴自动保持连续状态,不会显示分组标签 - 回归拟合:仍基于原始过滤数据的左右子集拟合线性模型,保证拟合结果的准确性
可选:等数量分箱方案(需dplyr,若允许使用)
如果需要按等数量分箱(每个箱内样本数相近),可以结合dplyr预处理数据,代码如下:
library(dplyr) library(ggplot2) filtered_data <- mydata %>% filter(absolute_running_var < 0.10) # 预处理分箱 binned_data <- filtered_data %>% mutate(side = ifelse(running_var <= 0, "left", "right")) %>% group_by(side) %>% mutate(bin = cut_number(running_var, n = 5)) %>% group_by(bin) %>% summarise( bin_center = mean(running_var), bin_mean = mean(outcome_var) ) # 绘图 ggplot() + geom_point(data = binned_data, aes(x = bin_center, y = bin_mean), size = 2, color = "black") + geom_smooth(data = subset(filtered_data, running_var <= 0), aes(x = running_var, y = outcome_var), method = "lm", color = "blue") + geom_smooth(data = subset(filtered_data, running_var > 0), aes(x = running_var, y = outcome_var), method = "lm", color = "red") + geom_vline(xintercept = 0, linetype = "dashed") + labs(x = "running_var", y = "outcome_var", title = "断点回归图") + theme(plot.title = element_text(color = "black", size = 14, face = "bold"))
内容的提问来源于stack exchange,提问作者Shiv Hastawala
相关产品推荐
相关产品推荐

