0

ggplot 的箱线图将 [Q1 - 1.5 * IQR, Q3 + 1.5 * IQR] 范围之外的任何点呈现为异常值。正如R 博客中所讨论的,这并不总是一个好主意,因为不对称分布可能会报告错误的异常值。在这种情况下,通常建议使用来自 robustbase R 包的 adjbox。不过剧情质量不如ggplot2。

我的问题是:有没有人知道如何将 adjbox 中使用的指数模型结合起来供 ggplot 在检测异常值时使用?

4

1 回答 1

2

您可能必须自己提供这些值。参考adjbox()帮助文件中使用的示例:

library(robustbase)
if(require("boot")) {
  ### Hubert and Vandervieren (2006), p. 10, Fig. 4.
  data(coal, package = "boot")
  coaldiff <- diff(coal$date)
  op <- par(mfrow = c(1,2))
  boxplot(coaldiff, main = "Original Boxplot")
  adjbox(coaldiff, main  = "Adjusted Boxplot")
  par(op)
}

这会产生以下箱线图:

在此处输入图像描述

然后你可以得到adjbox()函数使用的值:

coald <- data.frame(coaldiff = diff(coal$date))  #$
adjboxStats(coald$coaldiff)$stats
# [1] 0.0000000 0.1013005 0.3107461 0.7529090 3.7180014

这些是用于绘制调整后的箱线图的值。您可以使用提供此信息ggplot(),然后计算您自己的箱线图。可能有更好的方法可以做到这一点,但我想到的第一件事是制作一个新的数据集,包括调整后的箱线图值:

library(ggplot2)
library(plyr)
d <- ddply(coald, .(coaldiff), transform,
  ymin = adjboxStats(coald$coaldiff)$stats[1],
  ymax = adjboxStats(coald$coaldiff)$stats[5],
  middle = adjboxStats(coald$coaldiff)$stats[3],
  lower = adjboxStats(coald$coaldiff)$stats[2],
  upper = adjboxStats(coald$coaldiff)$stats[4])

# Boxplot with unadjusted values:
p <- ggplot(d, aes(factor(1), coaldiff)) 
p + geom_boxplot()

# Boxplot with adjusted values (note that you have to add the outliers back in):
p + geom_boxplot(aes(ymin=ymin, ymax=ymax, middle=middle, upper=upper, lower=lower),
  stat="identity") + 
  geom_point(data=subset(d, coaldiff < ymin | coaldiff > ymax))

这将为您ggplot2提供上述图的版本:

在此处输入图像描述

另请注意,Hadley Wickham 在回答类似问题时建议不要“不加思索” 。

于 2014-05-23T14:39:36.720 回答