ggplot的boxplot将范围外的任何点[Q1 - 1.5 * IQR,Q3 + 1.5 * IQR]渲染为异常值。正如R blog中所讨论的那样,这并不总是一个好主意 由于不对称分布,可能会报告错误的异常值。在这种情况下,通常建议使用robustbase R软件包中的adjbox。但是,质量 情节不如ggplot2好。
我的问题是:有人知道如何结合使用的指数模型 在检测异常值时ggplot使用的adjbox?
答案 0 :(得分: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建议在response中针对类似问题“不加思索”。