我有一个数据集,其中由于输入错误而存在一些异常值。
我编写了一个函数来从我的数据框(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
}
删除这些异常值后,会修改数据集。再次检查时,在某些情况下会显示新的异常值集。
是否有任何一个阶段的方法可以删除所有可能的异常值?
答案 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测试代码。