一步删除异常值

时间:2015-05-18 12:19:25

标签: r statistics dataset analytics outliers

我有一个数据集,其中由于输入错误而存在一些异常值。

我编写了一个函数来从我的数据框(source)中删除这些异常值:

remove_outliers <- function(x, 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
  }

删除这些异常值后,会修改数据集。再次检查时,在某些情况下会显示新的异常值集。

是否有任何一个阶段的方法可以删除所有可能的异常值?

2 个答案:

答案 0 :(得分:0)

我相信&#34;异常值&#34;是一个非常危险和误导性的术语。在许多情况下,它意味着一个数据点,出于特定原因应该从分析中排除。这样的原因可能是由于测量误差导致一个值超出物理边界,但不是那个&#34;它不适合它周围的其他点&#34;。

在此,您可以根据实际数据的分布指定统计标准。不要说我在这里找不到合适的方法(因为这些数据可能是针对给定汽车精确测量的),当您将@media (min-width: 480px) { /*css you want to apply only in desktop */ a:hover{...} } 应用于数据时,该函数将确定异常值限制并设置超出这些限制的数据点为min-device-width: 480px) { /*css you want to apply only in desktop */ a:hover{...} }

remove_outliers

这导致具有NA值的新数据集。将NA应用于已经缩减的数据集时,统计信息会有所不同,限制也会不同。因此,你会得到新的&#34;异常值(参见Roland的评论)。

## Using only column horsepower
dat <- read.csv("./cars.csv")

hp <- dat$Horsepower

## Calculates the boundaries like remove_outliers
calc.limits <- function(x, na.rm = TRUE) {
    qnt <- quantile(x, probs=c(.25, .75), na.rm = na.rm)
    H <- 1.5 * IQR(x, na.rm = na.rm)
    lwr <- qnt[1] - H
    upr <- qnt[2] + H
    c(lwr, upr)
}

> calc.limits(hp)
  25%   75% 
 -1.5 202.5 

你可以想象这个事实:

remove_outliers

实线表示原始数据的限制,虚线表示已经减少的数据。首先,丢失10个数据点,然后再丢失7个数据点。

hp2 <- remove_outliers(hp)

calc.limits(hp2)

> calc.limits(hp2)
25% 75% 
  9 185 

总之,如果您没有充分理由删除数据点,请不要这样做。

答案 1 :(得分:0)

我通常建议不要删除异常值。请考虑使用健壮的程序。它们会降低远离主要趋势的点,但不会将其从分析中删除。您还可以对数据进行可靠的转换,然后在分析中使用转换后的值。如果你仍想确定你的异常值,一个好的方法是 Median-MAD 。这样做效果更好,因为它使用中位数而不是均值,这使得它更加健壮。如果您有兴趣,我可以在这里发布我的Med-MAD测试代码。