我使用{ggplot2}绘制分组变量的平均值和可信区间,并注意到如果我手工计算或使用stat_summary()计算可信区间,我得到的结果略有不同.

有人知道是什么导致了这种差异吗?

下面是可复制的代码(注意-变量y故意倾斜以模拟我的实际数据集,但想知道这是否是导致问题的原因).

# Generate data
# Number of observations per group
n_per_group <- 50

# Generate left-skewed data
group1 <- rgamma(n_per_group, shape = 2, scale = 1)
group2 <- rgamma(n_per_group, shape = 3, scale = 1.5)
group3 <- rgamma(n_per_group, shape = 4, scale = 2)

# Combine data into a single data frame
df <- data.frame(
  y = rep(c("Group 1", "Group 2", "Group 3"), each = n_per_group),
  x = c(group1, group2, group3)
)

# Using stat_summary()
df %>%
  ggplot(., aes(x = x, y = y, group = y)) +
  stat_summary(fun = "mean", geom = "point") +
  stat_summary(fun.data = "mean_se", 
               geom = "errorbar", 
               width = 0.1) +
  scale_x_continuous(breaks = seq(1, 10, by = 0.5))

# By hand
df %>%
  group_by(y) %>%
  summarise(mean = mean(x, na.rm = T), 
            std.dev = sd(x, na.rm = T), 
            n = n(),
            se = std.dev / sqrt(n)) %>%
  
  ggplot(., aes(y = y)) + 
  geom_errorbar(aes(xmin = mean - 1.96*se, 
                    xmax = mean + 1.96*se), 
                width = 0.1) + 
  geom_point(aes(x = mean)) +
  scale_x_continuous(breaks = seq(1, 10, by = 0.5))

推荐答案

mean_se函数的ggplot默认添加1个标准差,而不是1.96.你可以让你的情节像这样匹配:

df %>%
  ggplot(., aes(x = x, y = y, group = y)) +
  stat_summary(fun = "mean", geom = "point") +
  stat_summary(fun.data = \(x) mean_se(x, mult = 1.96),
               geom = "errorbar", 
               width = 0.1) +
  scale_x_continuous(breaks = seq(1, 10, by = 0.5))

您可以在控制台中键入mean_se以查看其定义:

# mean_se
function (x, mult = 1) 
{
    x <- stats::na.omit(x)
    se <- mult * sqrt(stats::var(x)/length(x))
    mean <- mean(x)
    data_frame0(y = mean, ymin = mean - se, ymax = mean + se, 
        .size = 1)
}
# <bytecode: 0x10bd2b7d8>
# <environment: namespace:ggplot2>

R相关问答推荐

按R中的组查找相邻列的行累积和的最大值

在数学中正确显示摄氏度、开氏度或华氏度

我想在R中总结一个巨大的数据框架,使我只需要唯一的lat、lon、Date(Year)和Maxium Value""""""""

R s iml包如何处理语法上无效的因子级别?'

R中有约束的优化问题:如何用复数和对数效益函数解决问题?

R如何将列名转换为更好的年和月格式

有没有办法一次粘贴所有列

解析嵌套程度极高的地理数据

SHILINY中DT列的条件着色

整理曲线图、曲线图和点图

当由base::限定时,`[.factor`引发NextMethod错误

如何将宽格式的患者信息数据高效地转换为患者计数的时间序列?

使用R、拼图和可能的网格包绘制两个地块的公共垂直线

使用LAG和dplyr执行计算,以便按行和按组迭代

基于R中的引用将向量值替换为数据框列的值

如何将字符类对象中的数据转换为R中的字符串

如何在不使用SHINY的情况下将下拉滤镜列表添加到ggploy?

汇总数据:在跨越()all_of()Dynamic_list_of_vars=>;所选内容不能有缺失值的汇总()中出错

如何使用包含要子集的值的列表或数据框来子集多个列?

向内存不足的数据帧添加唯一行