R 在ggplot2中,箱线图线的末端代表什么?

R 在ggplot2中,箱线图线的末端代表什么?,r,ggplot2,boxplot,R,Ggplot2,Boxplot,我找不到箱线图线条端点代表什么的描述 例如,以下是直线终点上方和下方的点值。 (我知道盒子的顶部和底部是第25个和第75个百分位,中心线是第50个)。我假设,由于线条上方和下方存在点,它们并不代表最大/最小值。箱线图末尾的“点”代表异常值。有许多不同的规则用于确定点是否为异常值,但R和ggplot使用的方法是“1.5规则”。如果数据点是: 小于Q1-1.5*IQR 大于Q3+1.5*IQR 然后该点被归类为“异常值”。胡须的定义如下: 上须=最小值(最大值(x),Q_3+1.5*IQR)

我找不到箱线图线条端点代表什么的描述

例如,以下是直线终点上方和下方的点值。

(我知道盒子的顶部和底部是第25个和第75个百分位,中心线是第50个)。我假设,由于线条上方和下方存在点,它们并不代表最大/最小值。

箱线图末尾的“点”代表异常值。有许多不同的规则用于确定点是否为异常值,但R和ggplot使用的方法是“1.5规则”。如果数据点是:

  • 小于Q1-1.5*IQR
  • 大于Q3+1.5*IQR
然后该点被归类为“异常值”。胡须的定义如下:

上须=最小值(最大值(x),Q_3+1.5*IQR)

下须=最大值(最小值(x),Q_1–1.5*IQR)

式中,IQR=Q_3–Q_1,盒子长度。因此,上部晶须位于最大x值和Q_3+1.5 IQR中的较小值处, 而较低的晶须位于最小x值和Q_1–1.5 IQR中的较大值

其他信息

  • 有关其他异常值规则,请参见页面
  • 实际上,计算分位数的方法有很多种。关于九种不同方法的描述,请看“分位数”
示例

考虑下面的例子

> set.seed(1)
> x = rlnorm(20, 1/2)#skewed data
> par(mfrow=c(1,3))
> boxplot(x, range=1.7, main="range=1.7")
> boxplot(x, range=1.5, main="range=1.5")#default
> boxplot(x, range=0, main="range=0")#The same as range="Very big number"
这给出了以下曲线图:


当我们将范围从1.7减小到1.5时,我们减小了晶须的长度。然而,
range=0
是一种特殊情况-它相当于“range=infinity”

我认为ggplot使用标准默认值,与boxplot相同:“胡须延伸到最极端的数据点,距离长方体的长度不超过[1.5]倍。”

请参阅:

视频提供了(Tukey)方框图和胡须图的直观逐步说明

在4m 23s,我解释了胡须末端的含义及其与1.5*IQR的关系


尽管视频中显示的图表是使用D3.js而不是R绘制的,但其解释与提到的箱线图的R实现一致。

正如@TemplateRex在评论中强调的那样,ggplot没有在上/下四分位加/减1.5倍IQR处绘制胡须。它实际上在最大值(x[xQ1+1.5*IQR])处绘制它们。例如,这里是一个使用geom_boxplot绘制的图,其中我在值Q1-1.5*IQR处添加了一条虚线:

Q1=52

Q3=65

Q1-1.5*IQR=52-13*1.5=32.5(虚线)

下须=min(x[x>Q1+1.5*IQR])=35(其中x是用于创建箱线图的数据,异常值为x=27)

MWE 请注意,这不是我用来生成上面图像的确切代码,但它解决了问题

library("mosaic") # For favstats()

df <-  c(54, 41, 55, 66, 71, 50, 65, 54, 72, 46, 36, 64, 49, 64, 73, 
         52, 53, 66, 49, 64, 44, 56, 49, 54, 61, 55, 52, 64, 60, 54, 59, 
         67, 58, 51, 63, 55, 67, 68, 54, 53, 58, 26, 53, 56, 61, 51, 51, 
         50, 51, 68, 60, 67, 66, 51, 60, 52, 79, 62, 55, 74, 62, 59, 35, 
         67, 58, 74, 48, 53, 40, 62, 67, 57, 68, 56, 75, 55, 41, 50, 73, 
         57, 62, 61, 48, 60, 64, 53, 53, 66, 58, 51, 68, 69, 69, 58, 54, 
         57, 65, 78, 70, 52, 59, 52, 65, 70, 53, 57, 72, 47, 50, 70, 41, 
         64, 59, 58, 65, 57, 60, 70, 46, 40, 76, 60, 64, 51, 38, 67, 57, 
         64, 51)
df <- as.data.frame(df)


Q1 <- favstats(df)$Q1
Q3 <- favstats(df)$Q3

IQR <- Q3 - Q1

lowerlim <- Q1 - 1.5*IQR
upperlim <- Q3 + 1.5* IQR

boxplot_Tukey_lower <- min(df[df > lowerlim])
boxplot_Tukey_upper <- max(df[df < upperlim])



ggplot(df, aes(x = "", y = df)) +
  stat_boxplot(geom ='errorbar', width = 0.5) +
  geom_boxplot() + 
  geom_hline(yintercept = lowerlim, linetype = "dashed") +
  geom_hline(yintercept = upperlim, linetype = "dashed")

用于favstats()的库(“马赛克”)
df有关
?boxplot
?boxplot.stats
的信息,请参见帮助页面。ggplot使用标准的R函数进行这些计算。在ggplot2中,上晶须的计算值为max(x[x类似。@TemplateRex是正确的。我添加了一个例子来说明胡须值与使用Q1-1.5*IQRI计算值不一致的地方,称之为Tukey箱线图,以避免与人们创建的无数其他类型(更糟糕)箱线图混淆。据我所知,
?boxplot.stats
,标准是
+/-1.58*IQR/sqrt(n)
而非
[1.5]倍于框的长度
。我有什么误解吗?@Henrik:你把胡子和刻痕搞混了。麦吉尔的论文可读性很强:与麦吉尔论文的链接不再有效。我找不到新的(免费)链接。该论文可以从下载,但费用为14美元(或者你需要有机构访问)。感谢你的贡献。通常,将准确的代码添加到绘图中会很有帮助。(不需要主题调用和实验室标题,只需使用ggplot()+geom_boxplot()。理想情况下,一个完全可复制的示例会很好,例如在内置数据集上。也许可以尝试“reprex”package.favstats来自何处?我想可能是mosaic软件包,所以我添加了调用,但当我尝试复制它时,它不起作用。它在mosaic中。不确定为什么它对您不起作用。在新的R会话中(使用reprex软件包):
fav_统计中的Q1警告(x,…,na.rm=na.rm):自动将data.frame转换为#>数值。#>fav_统计数据(x,…,na.rm=na.rm)中的错误:'list'对象无法强制键入'double'
,换句话说,您的代码不起作用;)