найти выбросы и установить их NA - PullRequest
0 голосов
/ 24 октября 2018

У меня довольно большой вектор, около 4 миллионов строк.Проблема заключается в том, что внешний источник изменил данные датчика, которые вызвали много выбросов.Я обнаружил более 90% из них.Но теперь у меня остались последние 10% выбросов, которые я не могу найти достойным способом установить их в NA.Я не хочу их удалять, просто установите для них NA.

enter image description here

Этот график показывает 100000 значений.Это не выглядит так везде в TS.Иногда нет никаких выбросов, иногда это выглядит так.Это означает, что мне нужен подход, где я могу найти те выбросы, не устанавливая данные для NA, которые не являются выбросами.

Я пробовал разные пакеты (например, tsoutliers) без особого успеха.

Существует ли какой-либо пакет или метод, который может найти все или, по крайней мере, большинство выбросов, наблюдаемых на графике?

Ответы [ 2 ]

0 голосов
/ 24 октября 2018

Чтобы определить выбросы, вы можете сначала передать модель, которая определит, каковы «нормальные» значения с определенным процентом достоверности.Эта модель может быть скользящей средней, 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.arima: auto.arima

РЕДАКТИРОВАТЬ: это основано на посте Роба Хиндмана здесь

0 голосов
/ 24 октября 2018

Это зависит от того, как вы определяете выброс, как говорит Сотос.При условии, что вы считаете выбросы вне среднего значения данных + - N * standard_dev, тогда их легко идентифицировать численно

...