【问题标题】:How exactly are outliers removed in R boxplot and how can the same outliers be removed for further calculation (e.g. mean)?R boxplot 中的异常值究竟是如何删除的,如何删除相同的异常值以进行进一步计算(例如均值)?
【发布时间】:2015-01-18 02:38:11
【问题描述】:

boxplot 中,我设置了选项 outline=FALSE 以删除异常值。
现在我想包含points,它在箱线图中显示 mean。显然,使用mean 计算的均值包含异常值。

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

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

【问题讨论】:

    标签: r mean outliers


    【解决方案1】:

    要回答您问题的第二部分,关于如何选择异常值,最好提醒一下箱线图是如何构建的:

    • 箱线图的“主体”对应于数据的第二个和第三个四分位数(= 四分位间距,IQR)
    • 每个晶须限制通常是在超出主体末端 1.5*IQR 的情况下计算得出的。

    如果您假设您的数据具有正态分布,那么在每个须线之外都有这样的数据量:

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

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

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

    【讨论】:

    • 非常感谢您详细说明去除异常值的过程。这确实解决了问题。
    【解决方案2】:

    要删除异常值,您必须将选项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])
    

    【讨论】:

      【解决方案3】:

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

      “包含以下组件的列表:” [...]

      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
      
      猜你喜欢
      • 2012-10-02
      • 2019-04-11
      • 1970-01-01
      • 1970-01-01
      • 2022-01-08
      • 2012-08-11
      • 2023-02-05
      • 2018-05-09
      • 1970-01-01
      相关资源
      最近更新 更多