【问题标题】:Delete outliers删除异常值
【发布时间】:2019-01-13 02:03:43
【问题描述】:

我有一个包含 2000 多个观测值的大型数据集。数据涉及动物组织中的毒素浓度。我的响应变量是myRESULT,我对每个感兴趣的ANALYTE 有多个观察结果。我需要从每个ANALYTE 组中删除异常值,这些异常值由距平均值三个SD 以上的数字定义。

虽然我意识到我不应该正常地从数据集中删除异常值,但我仍然想知道如何在 R 中做到这一点。

这是我的数据的一小部分:

【问题讨论】:

标签: r outliers


【解决方案1】:

它是按组进行子集化,可以通过不同的方式完成。使用 dplyr,您可以使用group_by 设置分组,然后使用filter 设置行的子集,传递给它一个表达式,该表达式将计算返回TRUE 以保留行,FALSE 用于异常值。

例如,使用iris 和 2 个标准差(一切都在 3 以内):

library(dplyr)

iris_clean <- iris %>% 
    group_by(Species) %>% 
    filter(abs(Petal.Length - mean(Petal.Length)) < 2*sd(Petal.Length))

iris_clean %>% count()
#> # A tibble: 3 x 2
#> # Groups:   Species [3]
#>   Species        n
#>   <fct>      <int>
#> 1 setosa        46
#> 2 versicolor    47
#> 3 virginica     47

在基础 R 中使用拆分-应用-组合方法,

do.call(rbind, lapply(
    split(iris, iris$Species), 
    function(x) x[abs(x$Petal.Length - mean(x$Petal.Length)) < 2*sd(x$Petal.Length), ]
))

【讨论】:

  • 我删除了我的答案(与你的太相似),但如果你愿意,你可以合并scale(即filter(abs(scale(Petal.Length))&lt;2) 以保持紧凑性
  • 这很聪明!我已经停止使用scale,除非我已经在使用矩阵,但这里很简洁。
  • 我想我找到了问题所在。我有很多 sd 为 0 的分析物,有什么方法可以防止 R 将这些分析物排除在异常值之外?
  • 您可以在filter 中使用ifelsecase_when,例如filter(ifelse(sd(Petal.Length) == 0, TRUE, abs(Petal.Length - mean(Petal.Length)) &lt; 2*sd(Petal.Length)) 或者您可能只想为具有一定数量的观察值(n())或唯一值的组截断(n_distinct)。
猜你喜欢
  • 2021-11-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-25
  • 2012-08-11
  • 2018-10-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多