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

如何在R语言百分比绘图中添加标准误误差条

核心逻辑说明

你当前绘图的y轴实际使用的是0-1区间的比例值,scale_y_continuous(labels = scales::percent)只是将数值标签转换为百分比格式,本质数值尺度没有变化,因此误差条不需要特殊适配百分比尺度:比例对应的标准误本身就是0-1区间的数值,直接和比例值配套使用即可。


方案1:简化版二项分布标准误实现(忽略嵌套结构)

适合快速验证可视化效果,直接基于二项分布公式计算比例的标准误:

library(tidyverse)

# 先计算分组统计量:样本量、比例、标准误、置信区间
plot_data <- data %>%
  # 按RC和RTA分组统计每类的数量
  group_by(RC, RTA) %>%
  summarise(n = n(), .groups = "drop_last") %>%
  # 计算每个RC分组的总样本量、比例、标准误
  mutate(total_n = sum(n),
         prop = n / total_n,
         # 二项分布比例标准误公式
         se = sqrt(prop * (1 - prop) / total_n),
         # 95%置信区间上下限,可根据需要调整为±1倍SE展示标准误
         ci_low = pmax(0, prop - 1.96 * se), # 避免区间低于0
         ci_high = pmin(1, prop + 1.96 * se)) # 避免区间高于1

# 绘图
ggplot(plot_data, aes(x = RC, y = prop, fill = RTA, color = RTA)) +
  geom_col(position = position_dodge(width = 0.9), alpha = 0.7) +
  # 添加误差条,dodge宽度和柱子对齐
  geom_errorbar(aes(ymin = ci_low, ymax = ci_high),
                position = position_dodge(width = 0.9),
                width = 0.25) +
  scale_y_continuous(labels = scales::percent, limits = c(0, max(plot_data$ci_high) * 1.1)) +
  geom_text(aes(label = scales::percent(prop, accuracy = 0.1)),
            position = position_dodge(width = 0.9), vjust = -0.3)

方案2:适配嵌套结构的标准误计算(更准确)

你的数据存在「被试-作答题目」的嵌套结构,直接用汇总样本计算标准误会低估抽样误差,建议用混合效应模型估计边缘比例和对应标准误:

library(tidyverse)
library(lme4)
library(emmeans)

# 1. 转换二分类变量:将RTA转为0/1变量用于逻辑回归
data <- data %>%
  mutate(RTA_bin = ifelse(RTA == "SN1", 1, 0))

# 2. 拟合混合效应逻辑回归,控制被试和题目的随机截距
mod <- glmer(RTA_bin ~ RC * RTA + (1|Part) + (1|Item), 
             data = data, family = binomial)

# 3. 估计每个RC+RTA分组下的预测比例和标准误
plot_data <- emmeans(mod, ~ RTA | RC, type = "response") %>%
  as.data.frame()

# 4. 绘图逻辑和方案1完全一致,直接使用emmeans输出的概率、置信区间即可
ggplot(plot_data, aes(x = RC, y = prob, fill = RTA, color = RTA)) +
  geom_col(position = position_dodge(width = 0.9), alpha = 0.7) +
  geom_errorbar(aes(ymin = asymp.LCL, ymax = asymp.UCL),
                position = position_dodge(width = 0.9),
                width = 0.25) +
  scale_y_continuous(labels = scales::percent, limits = c(0, max(plot_data$asymp.UCL) * 1.1)) +
  geom_text(aes(label = scales::percent(prob, accuracy = 0.1)),
            position = position_dodge(width = 0.9), vjust = -0.3)

如果混合模型收敛困难,也可以先按「被试+RC+RTA」分组聚合,计算每个被试在对应分组下的RTA选择占比,再按RC和RTA分组计算占比的均值、标准误,同样可以控制被试间的变异。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 21:24:05