【问题标题】:Removing outliers in R去除 R 中的异常值
【发布时间】:2012-05-21 01:18:10
【问题描述】:

我查看了一组数据并决定删除异常值会很好,异常值的定义是与平均值相差 2SD。

如果我有一组数据,比如 500 行具有 15 个不同的属性,我如何删除所有具有 1 个或多个属性且与平均值相差 2 个标准差的行?

有没有一种简单的方法可以使用 R 来做到这一点? 谢谢,

【问题讨论】:

标签: r statistics standard-deviation


【解决方案1】:

可能有很多方法,并且可能添加包来处理这个问题。我建议你先试试这个:

library(sos); findFn("outlier")

这是一种使用可以标准化向量的scale 函数来满足您的要求的方法。

#create a data set with outliers
set.seed(10)
dat <- data.frame(sapply(seq_len(5), function(i) 
    sample(c(1:50, 100:101), 200, replace=TRUE)))

#standardize each column (we use it in the outdet function)
scale(dat)

#create function that looks for values > +/- 2 sd from mean
outdet <- function(x) abs(scale(x)) >= 2
#index with the function to remove those values
dat[!apply(sapply(dat, outdet), 1, any), ]

因此,在回答您的问题时,是的,有一种简单的方法可以将执行此操作的代码归结为 1 行代码:

dat[!apply(sapply(dat, function(x) abs(scale(x)) >= 2), 1, any), ]

我猜有一个包可以做到这一点,甚至更多。 sos 包非常棒(恕我直言),可以找到功能来做你想做的事。

【讨论】:

    【解决方案2】:
    na.rm = TRUE, ...) {
    qnt <- quantile(x, probs=c(.25, .75), na.rm = na.rm, ...)
    H <- 1.5 * IQR(x, na.rm = na.rm)
    y <- x
    y[x < (qnt[1] - H)] <- NA
    y[x > (qnt[2] + H)] <- NA
    y
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-07-01
      • 2015-07-13
      • 2015-03-11
      • 2018-11-19
      • 1970-01-01
      • 2015-07-09
      • 2022-06-23
      • 2015-07-29
      相关资源
      最近更新 更多