2014-05-16 31 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到類似的問題。