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

Gna*_*ark 4 r mean outliers

在A中,boxplot我设置了outline=FALSE删除异常值的选项。
现在,我想在方框图中包括points显示均值的位置。显然,使用计算得出的均值mean包括离群值。

如何从数据框中删除完全相同的离群值,以使计算出的均值对应于箱图中所示的数据?

我知道如何删除异常值,但是该outline选项从boxplot内部使用了哪些设置?不幸的是,该手册未作任何说明。

Hen*_*rik 5

如果您查看 的部分?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
Run Code Online (Sandbox Code Playgroud)


Pop*_*Pop 5

要删除异常值,您必须将该选项设置outlineFALSE

假设您的数据如下:

data <- data.frame(a = c(seq(0,1,0.1),3))
Run Code Online (Sandbox Code Playgroud)

然后,您使用该boxplot函数:

res <- boxplot(data, outline=FALSE)
Run Code Online (Sandbox Code Playgroud)

res对象中,您有几条关于您的数据的信息。其中,res$out给你所有的异常值。这里只有值 3。

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

mean(data$a[!data$a %in% res$out])
Run Code Online (Sandbox Code Playgroud)


age*_*nis 5

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

  • 箱形图的“主体”对应于数据的第二个+第三个四分位数(=四分位间距,IQR)
  • 通常,每条晶须极限的计算值应超出该主体末端1.5 * IQR。

如果您假设您的数据具有正态分布,则每个晶须之外都有以下数据量:

1-pnorm(qnorm(0.75)+1.5*2*qnorm(0.75))
Run Code Online (Sandbox Code Playgroud)

是0.0035。因此,普通变量的“箱形图异常值”为0.7%。

但是,这不是检测异常值的“非常可靠”的方法,有专门为此设计的软件包