Чтобы определить выбросы, вы можете сначала передать модель, которая определит, каковы «нормальные» значения с определенным процентом достоверности.Эта модель может быть скользящей средней, 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)
Это даст вам диаграмму, где определены выбросы, и показаны доверительные интервалы, Затем вы можете удалить выбросы следующим образом:
dat[out] <- NA #removing outliers
Обратите внимание, что количество найденных выбросов будет зависеть от выбранной вами модели.Например, с auto.arima
:
РЕДАКТИРОВАТЬ: это основано на посте Роба Хиндмана здесь