查找异常值并将其设置为不适用

时间:2018-10-24 13:00:46

标签: r outliers

我有一个相当大的向量,大约有400万行。问题在于,外部源改变了传感器数据,从而产生了许多异常值。我检测到其中90%以上。但是,现在剩下的异常值的最后10%是我无法找到将它们设置为NA的合适方法。我不想删除它们,只需将它们设置为NA。

enter image description here

此图显示100000个值。在TS中到处看起来都不是这样。有时没有离群值,有时看起来像这样。这意味着我需要一种方法,可以找到那些离群值而不将数据设置为非离群值的NA。

我尝试了不同的程序包(例如,tsoutliers),但没有成功。

有没有可以找到图中所有或至少大部分异常值的软件包或方法?

2 个答案:

答案 0 :(得分:1)

这取决于您如何定义Sotos所说的离群值。假设您认为数据超出均值范围+-N * standard_dev,那么可以很容易地从数字上识别它们

答案 1 :(得分:1)

为了定义离群值,您可以首先传递一个模型,该模型将以一定的置信度定义什么是“正常”值。此模型可以是移动平均线,arima,(此处)ets或其他许多...

library(fpp2)
dat <- c(1:50,10,52:100)+rnorm(100, sd=5)
fit <- ets(dat) # working with any model example auto.arima(dat)
upper <- fitted(fit) + 1.96*sqrt(fit$sigma2) #1.96 for 95% confidence interval
lower <- fitted(fit) - 1.96*sqrt(fit$sigma2) #1.96 for 95% confidence interval
plot(dat, type="n", ylim=range(lower,upper))
polygon(c(time(dat),rev(time(dat))), c(upper,rev(lower)), 
        col=rgb(0,0,0.6,0.2), border=FALSE)
lines(dat)
lines(fitted(fit),col='red')
out <- (dat < lower | dat > upper)
points(time(dat)[out], dat[out], pch=19)

这将为您提供识别异常值的图表,并显示置信区间。 outlier identification with exponential model 然后,您可以像这样删除异常值:

dat[out] <- NA #removing outliers

请注意,找到的异常值取决于您选择的模型。例如,使用auto.arimaauto.arima

编辑:这是基于Rob Hyndman的帖子here