【问题标题】:Standard error bars using stat_summary使用 stat_summary 的标准误差线
【发布时间】:2013-10-08 21:08:45
【问题描述】:

以下代码使用 Hmisc、ddply 和 ggplot 生成带有标准误差线的条形图:

means_se <- ddply(mtcars,.(cyl),
                  function(df) smean.sdl(df$qsec,mult=sqrt(length(df$qsec))^-1))
colnames(means_se) <- c("cyl","mean","lower","upper")
ggplot(means_se,aes(cyl,mean,ymax=upper,ymin=lower,group=1)) + 
  geom_bar(stat="identity") +  
  geom_errorbar()

但是,使用诸如 mean_sdl 之类的辅助函数来实现上述功能似乎要好得多。例如,以下代码会生成一个带有 95% CI 误差线的图:

ggplot(mtcars, aes(cyl, qsec)) + 
  stat_summary(fun.y = mean, geom = "bar") + 
  stat_summary(fun.data = mean_sdl, geom = "errorbar")

我的问题是如何将 stat_summary 实现用于标准误差线。问题是要计算 SE,您需要每个条件的观察次数,并且必须在 mean_sdl 的乘数中访问。

如何在 ggplot 中访问这些信息?有没有一个简洁的非hacky解决方案?

【问题讨论】:

  • 抱歉,当您写“您需要每个条件的观察次数并且必须在 mean_sdl 的乘数中访问”时,我不太明白您的意思。来自?smean.sdl:“mult 是用于获取样本均值的覆盖区间的标准差的乘数。默认值为 mult=2 以使用正负 2 个标准差”。我假设您已经看过 stat_summary 上的所有示例 here 和错误栏,它们似乎是“自动”运行的。
  • 标准误差是 SD 除以 sqrt(n)。正如您在我的第一个代码中看到的那样,sn-p 这样做是为了得到标准错误。但是,在 ggplot 中,您无法访问数据框的每一折的 N,因为这种“汇总”是在内部完成的。在 ddply 中,它很容易“手动”访问折叠以查询它们的长度 (n)。您将如何在 stat_summary 中执行此操作?
  • 为了清楚起见,这个参数必须看起来像这样:stat_summary(fun.data = mean_sdl, mult = sqrt(length(df$qsec))^-1), geom = "errorbar" )。问题是我无法访问 mtcars 的每个子集的 df$qsec 来获取长度

标签: r ggplot2 plyr


【解决方案1】:

好吧,我不能告诉你如何按组将乘数转换为stat_summary

但是,您的目标似乎是绘制均值和误差线,它们表示与 ggplot 中的均值相比的一个标准误差,而无需在绘制之前汇总数据集。

ggplot2 中有一个 mean_se 函数,我们可以使用它来代替 Hmisc 中的 mean_cl_normalmean_se 函数的默认乘数为 1,因此如果我们想要标准误差线,我们不需要传递任何额外的参数。

ggplot(mtcars, aes(cyl, qsec)) + 
    stat_summary(fun.y = mean, geom = "bar") + 
    stat_summary(fun.data = mean_se, geom = "errorbar")

如果您想使用 Hmisc 中的 mean_cl_normal 函数,您必须将乘数更改为 1,以便从平均值中得到一个标准误差。 mult 参数是 mean_cl_normal 的参数。您需要传递给正在使用的汇总函数的参数需要作为列表提供给fun.args 参数:

ggplot(mtcars, aes(cyl, qsec)) + 
    stat_summary(fun.y = mean, geom = "bar") + 
    stat_summary(fun.data = mean_cl_normal, geom = "errorbar", fun.args = list(mult = 1))

ggplot2的pre-2.0版本中,参数可以直接传递:

ggplot(mtcars, aes(cyl, qsec)) + 
  stat_summary(fun.y = mean, geom = "bar") + 
  stat_summary(fun.data = mean_cl_normal, geom = "errorbar", mult = 1) 

【讨论】:

  • 太棒了!我的印象是 mean_cl_normal 产生了 95% CI。如果不是 1,那么默认乘数是多少?
  • 基于来自Hmiscsmean.cl.normal 的帮助页面,它是基于置信区间大小(默认为95%)。所以它是mult=qt((1+conf.int)/2,n-1)
  • 根据intromean_cl_normal 返回“样本均值和假设正态性的 95% 置信区间”。
  • @aosmith:感谢您的解决方案!在我更新到最新版本的 ggplot2 (2.2.0) 之前,它一直对我有用。现在,我不能再使用 mean_cl_normal 来计算标准误差线了。有没有人解决这个问题?
  • @SolLago 我更新了答案以使用当前版本的 ggplot2 提供解决方案
猜你喜欢
  • 2018-10-08
  • 1970-01-01
  • 2021-10-30
  • 2014-02-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多