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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 13:50:04