2014-05-16 36 views
0

ggplot的boxplot渲染范围[Q1 - 1.5 * IQR,Q3 + 1.5 * IQR]之外的任何点作为异常值。正如在R blog中所讨论的那样,这并不总是一个好主意,因为 错误异常值可能由于不对称分布而被报告。在这种情况下,通常会建议来自robustbase R包的adjbox。但是,该图的质量 不如ggplot2。在ggplot的boxplot中结合medcouple

我的问题是:是否有人知道如何在检测异常值时使用ggplot在adjbox中使用指数模型 ?

回答

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) 
} 

这将产生以下箱线图:

enter image description here

然后你就可以得到所使用的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版本上述地块:

enter image description here

还要注意的是哈德利韦翰建议对这种“无花了很多心思”在response到类似的问题。