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

如何在ggplot2双向条形图中添加聚类标准误误差棒?

为ggplot2双向条形图添加聚类标准误/95%置信区间

核心思路

直接基于原始数据计算以受访者为聚类单元的均值、稳健标准误和95%置信区间,再用ggplot2绘图。无需依赖仅适用于回归结果的包,直接处理你的12000条观测数据。


步骤1:加载所需包

library(tidyverse)
# 用于计算聚类稳健标准误(可选,也可手动计算)
library(estimatr)

步骤2:模拟匹配你的数据结构(替换为你的真实数据)

模拟1200名受访者、10个X类别、Y为评分的数据集:

set.seed(123) # 保证结果可复现
dat <- tibble(
  respondent_id = rep(1:1200, each = 10), # 每个受访者对应10个X类别
  X = rep(paste0("类别_", 1:10), 1200),   # 10个X类别
  Y = rnorm(12000, 
            mean = rep(c(2, 3, -1, 4, -2.5, 3.5, -0.5, 4.5, -1.5, 3), 1200), 
            sd = 1)
)

步骤3:计算聚类统计量(两种方法可选)

方法1:用estimatr包快速计算(推荐)

通过lm_robust拟合截距模型,指定聚类变量respondent_id,直接得到聚类稳健标准误和95%置信区间:

cluster_stats <- dat %>%
  group_by(X) %>%
  summarise(
    # 对每个X类别,拟合仅含截距的回归,聚类到受访者
    model = list(lm_robust(Y ~ 1, data = cur_data(), clusters = respondent_id)),
    .groups = "drop"
  ) %>%
  # 提取均值、标准误、置信区间
  mutate(
    mean_Y = map_dbl(model, ~ .x$coefficients[1]),
    se_Y = map_dbl(model, ~ .x$std.error[1]),
    ci_low = map_dbl(model, ~ .x$conf.low[1]),
    ci_high = map_dbl(model, ~ .x$conf.high[1])
  ) %>%
  select(-model) # 移除模型对象,保留统计量

方法2:手动计算聚类标准误(无需额外包)

基于受访者层面的均值计算聚类标准误,公式为sqrt(受访者均值的方差 / 受访者数量):

manual_cluster_stats <- dat %>%
  # 先按受访者和X提取每个受访者在对应X的评分(每个受访者每个X仅1条数据)
  group_by(respondent_id, X) %>%
  summarise(y_i = mean(Y), .groups = "drop") %>%
  # 按X类别计算总体均值、聚类方差、标准误、95%置信区间
  group_by(X) %>%
  summarise(
    mean_Y = mean(y_i),
    var_clustered = var(y_i),
    n_respondents = n(),
    se_Y = sqrt(var_clustered / n_respondents),
    # 用t分布计算置信区间(自由度为受访者数量-1)
    ci_low = mean_Y - qt(0.975, df = n_respondents - 1) * se_Y,
    ci_high = mean_Y + qt(0.975, df = n_respondents - 1) * se_Y
  ) %>%
  ungroup()

步骤4:绘制双向条形图+聚类置信区间

以cluster_stats为例,绘制均值双向条形,并添加95%置信区间误差棒:

ggplot(cluster_stats, aes(x = X, y = mean_Y)) +
  # 双向条形:正负均值用不同颜色区分
  geom_col(aes(fill = mean_Y > 0), position = "identity") +
  # 添加聚类95%置信区间误差棒
  geom_errorbar(aes(ymin = ci_low, ymax = ci_high), width = 0.2, color = "black") +
  # 调整x轴标签避免重叠
  theme(axis.text.x = element_text(angle = 45, hjust = 1)) +
  # 自定义填充色
  scale_fill_manual(values = c("TRUE" = "#2196F3", "FALSE" = "#F44336"), guide = "none") +
  # 坐标轴标签
  labs(x = "X类别", y = "Y的均值(带聚类95%置信区间)")

自定义调整说明

  • 若要切换为显示聚类标准误而非置信区间,将geom_errorbar的ymin和ymax改为mean_Y - se_Y和mean_Y + se_Y即可。
  • 若需调整双向条形的方向(比如负均值向右、正均值向左),可以修改y轴映射:aes(x = X, y = ifelse(mean_Y < 0, mean_Y, -mean_Y)),同时调整y轴标签。
  • 若需修改置信水平,在lm_robust中添加conf.level = 0.99参数,或手动计算时调整qt()的分位数(如0.995对应99%置信区间)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 20:44:57