ggplot2箱线图:显示95%置信区间并移除异常值。

5
我希望有一个箱线图,它看起来就像下面这个。但是我想呈现(1)95%置信区间(2)没有离群值,而不是默认值。
95%的置信区间可以表示为(i)扩展框并删除虚线或(ii)只具有均值和虚线,并删除框。如果人们对在这样的图中呈现95%置信区间有其他想法,我很乐意听取建议。最终目标是在同一图上显示多个类别的数据的平均值和置信区间。
set.seed(1234)
df <- data.frame(cond = factor( rep(c("A","B"), each=200) ), 
                   rating = c(rnorm(200),rnorm(200, mean=.8))
ggplot(df, aes(x=cond, y=rating, fill=cond)) + geom_boxplot() + 
    guides(fill=FALSE) + coord_flip()

这里输入图片描述

图片和代码来源: http://www.cookbook-r.com/Graphs/Plotting_distributions_(ggplot2)/


3
这不是一个好主意,因为这不再是一个箱线图,可能会很容易混淆。第一四分位数和第三四分位数可以轻松落在置信区间之外(这是样本大小的函数)- 因此,箱须会被盖住!为什么不直接使用geom_crossbar、geom_errorbar或geom_linerange呢?这实际上就是答案-只需使用不同的geom构建自己的箱线图元素即可。 - Andy W
我同意@AndyW的观点,不应该改变箱线图的基本原理。使用geom_errorbargeom_violin的组合可能适合您的目的。 - CMichael
@Jaap 不知怎么错过了这个!谢谢提醒。 - Dr. Beeblebrox
2个回答

8

我使用以下内容显示95%区间。根据我的阅读,这不是箱形图的常见用法,但它并非默认设置,因此您需要清楚地说明图表中显示的内容。

quantiles_95 <- function(x) {
  r <- quantile(x, probs=c(0.05, 0.25, 0.5, 0.75, 0.95))
  names(r) <- c("ymin", "lower", "middle", "upper", "ymax")
  r
}

ggplot(df, aes(x=cond, y=rating, fill=cond)) +
    guides(fill=F) +
    coord_flip() +
    stat_summary(fun.data = quantiles_95, geom="boxplot")

enter image description here

不要使用geom_boxplot,而是使用stat_summary与自定义函数,指定要使用的限制:
  • "ymin" 是下须的下限
  • "lower" 是下箱的下限
  • "middle" 是箱子的中间(通常是中位数)
  • "upper" 是上箱的上限
  • "ymax" 是上须的上限。
在提供的函数(quantiles_95)中,使用内置的quantile函数和自定义的probs参数。按照给定的方式,须将跨度扩展到您的数据的90%:从底部的5%到上面的95%。箱子将像往常一样跨越中间两个四分位数,从25%到75%。
您可以随时更改自定义函数以选择不同的分位数(甚至不使用分位数),但这需要非常小心。正如评论中指出的那样,当一个人看到箱形图时会有一定的期望。如果您使用相同形状的图表来传达不同的信息,您很可能会让人们感到困惑。
如果您想去掉“whiskers”,将“ymin”设置为“lower”,将“ymax”设置为“upper”。如果您想要所有的“whiskers”而没有“box”,则将“upper”和“lower”都设置为“middle”(或者只使用“geom_errorbars”)。

2
我认为这显示的是95%区间而不是95%的置信区间。我已经使用Rmisc::CI函数和统计测试验证了这种方法,它确实没有可视化预期的置信区间。 - Rafs
1
不错的解决方案,但0.95分位数 != 0.95置信区间。请参阅此处:https://stats.stackexchange.com/questions/220242/relationship-between-percentile-and-confidence-interval-on-a-mean - kikatuso

7

您可以通过将大小设置为0来隐藏离群值:

ggplot(df, aes(x=cond, y=rating, fill=cond)) + 
  geom_boxplot(outlier.size = 0) + 
  guides(fill=FALSE) + coord_flip()

您可以使用 stat_summary 函数将均值添加到图表中:
ggplot(df, aes(x=cond, y=rating, fill=cond)) + 
  geom_boxplot(outlier.size = 0) + 
  stat_summary(fun.y="mean", geom="point", shape=23, size=4, fill="white") +
  guides(fill=FALSE) + 
  coord_flip()

6
这并未提及置信区间。 - Adam_G

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接