如何在R箱图中删除异常值以及如何删除相同的异常值以进行进一步计算(例如平均值)?

时间:2014-11-20 09:36:18

标签: r mean outliers

boxplot我设置选项outline=FALSE以删除异常值。
现在,我希望在框图中包含显示平均值points。显然,使用mean计算的均值包括异常值。

如何从数据框中删除相同的异常值,以使计算出的平均值对应于箱线图中显示的数据?

我知道如何移除异常值,但内部outline的{​​{1}}选项使用了哪些设置?不幸的是,手册没有给出任何澄清。

3 个答案:

答案 0 :(得分:5)

要回答问题的第二部分,关于如何选择离群值,最好提醒一下如何构造箱图:

  • boxplot的“body”对应于数据的第二个+第三个四分位数(=四分位数范围,IQR)
  • 每个晶须极限通常按1.5 * IQR计算,超过该体的末端。

如果您假设您的数据具有正态分布,则每个晶须外都有这么多数据:

1-pnorm(qnorm(0.75)+1.5*2*qnorm(0.75))

为0.0035。因此,正常变量具有0.7%的“箱线图异常值”。

但这不是一种非常“可靠”的方法来检测异常值,packages专为此设计。

答案 1 :(得分:4)

如果查看?boxplot部分,您会发现:

“列出以下组件:” [...]

out超出胡须极端的任何数据点的值。“

因此,您可以确定对boxplot调用对象的结果,提取异常值,并将其从原始值中删除:

x <- c(-10, 1:5, 50)
x
# [1] -10   1   2   3   4   5  50

bx <- boxplot(x)
str(bx)
# List of 6
# $ stats: num [1:5, 1] 1 1.5 3 4.5 5
# $ n    : num 7
# $ conf : num [1:2, 1] 1.21 4.79
# $ out  : num [1:2] -10 50
# $ group: num [1:2] 1 1
# $ names: chr "1"

x2 <- x[!(x %in% bx$out)]
x2
# [1] 1 2 3 4 5

答案 2 :(得分:4)

要删除异常值,您必须将outline选项设置为FALSE

我们假设您的数据如下:

data <- data.frame(a = c(seq(0,1,0.1),3))

然后,您使用boxplot函数:

res <- boxplot(data, outline=FALSE)

res对象中,您有几条有关数据的信息。其中,res$out为您提供了所有异常值。这里只有值3。

因此,要计算没有异常值的均值,您可以简单地执行:

mean(data$a[!data$a %in% res$out])