与ggplot2不同数量的离群值

时间:2018-12-15 16:10:12

标签: r ggplot2 data-visualization boxplot

有人可以向我解释为什么我用普通的命令和outliers得到了不同数量的geom_boxplot吗? 这里有一个例子:

x <- c(280.9, 135.9, 321.4, 333.7, 0.2, 71.3, 33.0, 102.6, 126.8, 194.8, 35.5, 
       107.3, 45.1, 107.2, 55.2, 28.1, 36.9, 24.3, 68.7, 163.5, 0.8, 31.8, 121.4, 
       84.7, 34.3, 25.2, 101.4, 203.2, 194.1, 27.9, 42.5, 47.0, 85.1, 90.4, 103.8, 
       45.1, 94.0, 36.0, 60.9, 97.1, 42.5, 96.4, 58.4, 174.0, 173.2, 164.1, 92.1, 
       41.9, 130.2, 94.7, 121.5, 261.4, 46.7, 16.3, 50.7, 112.9, 112.2, 242.5, 140.6, 
       112.6, 31.2, 36.7, 97.4, 140.5, 123.5, 42.9, 59.4, 94.5, 37.4, 232.2, 114.6, 
       60.7, 27.8, 115.5, 111.9, 60.1)
data <- data.frame(x)
boxplot(data$x)
ggplot(data, aes(y=x)) + geom_boxplot()

使用boxplot命令,用4 outliers得到下面的图。 enter image description here

然后用ggplot25 outliers得到下面的图。 enter image description here

1 个答案:

答案 0 :(得分:12)

ggplot和boxplot使用略有不同的方法来计算统计信息。从?geom_boxplot我们可以看到

  

上下铰链分别对应第一和第三四分位数   (第25和第75个百分位)。这与方法略有不同   由boxplot()函数使用,在较小的情况下可能很明显   样品。有关如何铰链的更多信息,请参见boxplot.stats()。   计算boxplot()的位置。

如果您想要相同的结果,则可以让ggplot使用boxplot.stats

# Function to use boxplot.stats to set the box-and-whisker locations  
f.bxp = function(x) {
  bxp = boxplot.stats(x)[["stats"]]
  names(bxp) = c("ymin","lower", "middle","upper","ymax")
  bxp
}  

# Function to use boxplot.stats for the outliers
f.out = function(x) {
  data.frame(y=boxplot.stats(x)[["out"]])
}

要在ggplot中使用这些功能:

ggplot(data, aes(0, y=x)) + 
  stat_summary(fun.data=f.bxp, geom="boxplot") + 
  stat_summary(fun.data=f.out, geom="point")

enter image description here

如果您想复制ggplot本机使用的统计信息,这些内容将在?geom_boxplot中进行如下解释:

  

ymin =下晶须=大于或等于的最小观察值   下铰链-1.5 * IQR

     

下部 =下部铰链,25%的分位数

     

下限 =缺口的下边缘=中位数-1.58 * IQR / sqrt(n)

     

中间 =中位数,分位数50%

     

缺口 =缺口的上边缘=中位数+ 1.58 * IQR / sqrt(n)

     

上部 =上铰链,75%的分位数

     

ymax =晶须上限=小于或等于上限的最大观测值   铰链+ 1.5 * IQR

我们可以据此进行计算:

y = sort(x)
iqr = quantile(y,0.75) - quantile(y,0.25)
ymin = y[which(y >= quantile(y,0.25) - 1.5*iqr)][1]
ymax = tail(y[which(y <= quantile(y,0.75) + 1.5*iqr)],1)
lower = quantile(y,0.25)
upper = quantile(y,0.75)
middle = quantile(y,0.5)

ggplot(data, aes(y=x)) + 
  geom_boxplot() +
  geom_hline(aes(yintercept=c(ymin)), color='red', linetype='dashed') +
  geom_hline(aes(yintercept=c(ymax)), color='red', linetype='dashed') +
  geom_hline(aes(yintercept=c(lower)), color='red', linetype='dashed') +
  geom_hline(aes(yintercept=c(upper)), color='red', linetype='dashed') +
  geom_hline(aes(yintercept=c(middle)), color='red', linetype='dashed') 

enter image description here

我们还可以使用ggplot_build

直接从ggplot对象中提取这些统计信息
p <- ggplot(data, aes(y=x)) + geom_boxplot() 
ggplot_build(p)$data[1:5]

#   ymin lower middle upper  ymax 
# 1  0.2  42.5  93.05   122 232.2