将异常值规则从IQR更改为geom_boxplot中的标准偏差

时间:2018-01-19 19:43:48

标签: r ggplot2 boxplot outliers standard-deviation

我知道geom_boxplot()的默认设置是:

  • Q3 + 1.5 * IQR
  • Q1 - 1.5 * IQR

但我想从平均值做4个标准差:

  • MEAN + 4 * SD
  • 意思 - 4 * SD

这可以在ggplot2中做到吗?如果没有,有什么替代方案?

我看到一篇帖子询问有关更改为不同IQR的信息,但我特别感兴趣转换为标准偏差。

1 个答案:

答案 0 :(得分:1)

这可以使用stat = "identity"完成,如某些评论中所述,但诀窍是将异常值放入数据中。需要在列表列中提供异常值。这是你如何做到的。

首先,编制一些数据并绘制一个常规的箱形图:

set.seed(123)
d <- data.frame(y = c(rnorm(100), rnorm(100)+.5, rnorm(100)-1),
                x = rep(c("A", "B", "C"), each = 100))

ggplot(d, aes(x, y)) + geom_boxplot()

enter image description here

现在,手动计算统计数据并绘制具有替代异常值定义的boxplot。请注意,我使用平均值+/- 2 * SD,因此我得到了更多的异常值。显而易见的是如何将代码更改为+/- 4 * SD。

library(dplyr)

d %>% group_by(x) %>%
  summarize(middle = median(y),
            mean = mean(y),
            sd = sd(y),
            lower = quantile(y, probs = .25),
            upper = quantile(y, probs = .75),
            ymin = max(mean - 2*sd, min(y)),
            ymax = min(mean + 2*sd, max(y)),
            outliers = list(y[y<ymin | y > ymax])) %>%
  ggplot(aes(x, ymin = ymin, lower = lower,
             middle = middle, upper = upper, ymax = ymax,
             outliers = outliers)) + 
  geom_boxplot(stat = "identity")

enter image description here

免责声明:我仅使用当前开发版本的ggplot2对此进行了测试,不确定它是否适用于当前在CRAN上的版本。