Простий алгоритм виявлення загального часового ряду в Інтернеті


88

Я працюю з великою кількістю часових рядів. Ці часові ряди - це в основному мережеві вимірювання, що відбуваються кожні 10 хвилин, а деякі з них періодичні (тобто пропускна здатність), а інші - не (тобто кількість трафіку маршрутизації).

Мені хотілося б простого алгоритму для того, щоб зробити онлайн-виявлення «зовнішніх». В основному, я хочу зберігати в пам'яті (або на диску) всі історичні дані для кожного часового ряду, і я хочу виявити будь-яке зовнішнє середовище в прямому сценарії (кожного разу, коли буде зроблено новий зразок). Який найкращий спосіб досягти цих результатів?

Зараз я використовую ковзну середню для того, щоб усунути шум, але що далі? Прості речі, такі як стандартне відхилення, божевільний, ... проти всього набору даних не спрацьовують (я не можу припустити, що часові ряди є нерухомими), і мені хотілося б чогось "точнішого", в ідеалі - чорного поля типу:

подвійне outlier_detection (подвійне * вектор, подвійне значення);

де вектор - це масив подвійних, що містить історичні дані, а повернене значення - оцінка аномалії для нового зразка "значення".


1
Тільки для наочності, ось початкове запитання щодо SO: stackoverflow.com/questions/3390458/…
Метт Паркер

1
Я думаю, що ми повинні заохочувати постери розміщувати посилання як частину питання, якщо вони розмістили те саме питання на іншому веб-сайті SE

так, ви абсолютно праві. Наступного разу зазначу, що повідомлення перекреслено.
gianluca

Я також пропоную вам ознайомитись з іншими пов'язаними посиланнями в правій частині сторінки. Це популярне питання, і воно раніше виникало в різних питаннях. Якщо вони не задовільні, найкраще оновити запитання про специфіку вашої ситуації.
Енді Ш

Гарний улов, @Andy! Давайте з’єднаємо це питання з іншим.
whuber

Відповіді:


75

Ось проста функція R, яка знайде вичерпання часових рядів (і необов'язково відобразить їх у графіку). Він буде обробляти сезонні та несезонні часові ряди. Основна ідея - знайти надійні оцінки тенденції та сезонних компонентів та відняти їх. Потім знайдіть залишків у залишках. Тест на залишкові залишки такий самий, як і для стандартного боксплотта - точки, що перевищують 1,5IQR вище або нижче верхніх і нижніх квартілів, вважаються вибухами. Кількість IQR вище / нижче цих порогових значень повертається як зовнішня «оцінка». Таким чином, оцінка може бути будь-яким позитивним числом, і для нульових осіб буде нульовим.

Я розумію, що ви не реалізуєте це в R, але я часто знаходжу функцію R гарним місцем для початку. Тоді завдання полягає в тому, щоб перекласти це будь-якою мовою.

tsoutliers <- function(x,plot=FALSE)
{
    x <- as.ts(x)
    if(frequency(x)>1)
        resid <- stl(x,s.window="periodic",robust=TRUE)$time.series[,3]
    else
    {
        tt <- 1:length(x)
        resid <- residuals(loess(x ~ tt))
    }
    resid.q <- quantile(resid,prob=c(0.25,0.75))
    iqr <- diff(resid.q)
    limits <- resid.q + 1.5*iqr*c(-1,1)
    score <- abs(pmin((resid-limits[1])/iqr,0) + pmax((resid - limits[2])/iqr,0))
    if(plot)
    {
        plot(x)
        x2 <- ts(rep(NA,length(x)))
        x2[score>0] <- x[score>0]
        tsp(x2) <- tsp(x)
        points(x2,pch=19,col="red")
        return(invisible(score))
    }
    else
        return(score)
}

+1 від мене, чудово. Отже> 1,5 X міжквартильний діапазон - це консенсусне визначення вибійного типу для залежних від часу рядів? Було б добре мати незалежну від масштабу посилання.
дог

Більш тест є на залишки, тому сподіваємось, що залежність від часу невелика. Я не знаю про консенсус, але боксплоти часто використовуються для виявлення сторонніх і, здається, працюють досить добре. Є кращі методи, якби хтось хотів зробити функцію трохи вигадливішою.
Роб Хайндман

Дуже дякую за допомогу, я дуже вдячний. Зараз я досить зайнятий на роботі, але я збираюся якомога швидше перевірити такий підхід, як ваш, і я повернусь із своїми остаточними міркуваннями щодо цього питання. Одна думка: у вашій функції, з того, що я бачу, я повинен вручну вказати частоту часового ряду (при його конструюванні), а компонент сезонності вважається лише тоді, коли частота перевищує 1. Чи є надійний спосіб вирішувати це автоматично?
gianluca

1
Так, я припустив, що частота відома і вказана. Існують методи автоматичної оцінки частоти, але це значно ускладнить функцію. Якщо вам потрібно оцінити частоту, спробуйте задати окреме питання про це - і я, мабуть, надам відповідь! Але для цього потрібно більше місця, ніж я маю в коментарі.
Роб Хайндман

2
@Marcin, я рекомендую самостійно занести удар. Можливо, вставте своє рішення на gist.github.com і опублікуйте питання ТАК, коли ви закінчите, щоб інші перевірили вашу роботу?
Кен Вільямс

27

Хорошим рішенням буде кілька інгредієнтів, серед яких:

  • Використовуйте стійке рухоме вікно, щоб зняти нестаціонарність.

  • Повторно висловіть вихідні дані так, щоб залишки щодо гладкої були приблизно симетрично розподілені. Зважаючи на характер ваших даних, цілком ймовірно, що їх квадратні корені або логарифми дадуть симетричні залишки.

  • Застосувати методи контрольної діаграми або принаймні мислення контрольної діаграми до залишків.

Що стосується останнього, мислення на контрольній діаграмі показує, що "звичайні" пороги, такі як 2 SD або в 1,5 рази більше IQR за межі квартілів, погано працюють, оскільки вони викликають занадто багато помилкових сигналів поза контролем. Зазвичай люди використовують 3 SD в роботі контрольної діаграми, звідки в 2,5 (або навіть 3 рази) показник IQ за межі квартілів буде гарною відправною точкою.

Я більш-менш окреслив природу рішення Роб Хандман, додавши до нього два основні моменти: потенційна потреба в повторному вираженні даних та розумність бути більш консервативним у передачі сигналу стороннім людям. Я не впевнений, що Лосс хороший для онлайн-детектора, оскільки він не працює добре в кінцевих точках. Натомість ви можете використовувати щось таке просте, як рухомий медіанний фільтр (як у стійкому згладжуванні Тукі). Якщо випускники не входять у пакет, ви можете скористатись вузьким вікном (можливо, 5 точок даних, які розбиватимуться лише з набором у 3 групи та більше, ніж у групі 5).

Після того, як ви провели аналіз, щоб визначити хорошу репресію даних, навряд чи вам знадобиться змінити повторний вираз. Тому вашому інтернет-детектору дійсно потрібно лише посилатися на останні значення (останнє вікно), оскільки він взагалі не використовуватиме більш ранні дані. Якщо у вас дійсно тривалий час, ви можете продовжити аналіз автокореляції та сезонності (наприклад, що виникають щоденні або щотижневі коливання), щоб покращити процедуру.


3
Це надзвичайна відповідь для практичного аналізу. Ніколи б не подумав, що потрібно спробувати 3 IQR поза квартілями.
Джон Робертсон

3
@John, 1.5 IQR - це оригінальна рекомендація Тукі для найдовших вусів на коробці, а 3 IQR - його рекомендація щодо позначення очок як "далеких людей" (риф за популярною фразою 60-х). Це вбудовано в багато алгоритмів Boxplot. Рекомендація проаналізована теоретично в Hoaglin, Mosteller, & Tukey, Розуміння надійного та дослідницького аналізу даних.
whuber

Це підтверджує дані часових рядів, які я намагався проаналізувати. Середнє значення вікон, а також стандартні відхилення вікна. ((x - avg) / sd)> 3, здається, є пунктами, які я хочу позначити як екслієри. Ну принаймні попереджаю, як люди, що переживають, я позначаю все, що перевищує 10 сд, як екстремальні помилки. Проблема, з якою я стикаюся, полягає в тому, яка ідеальна довжина вікна? Я граю з чим-небудь між 4-8 точками даних.
Джош Пік

1
@Neo Вашою найкращою ставкою може бути експеримент із підмножиною даних і підтвердження висновків тестами на залишок. Ви також можете провести більш формальну перехресну валідацію (але потрібна особлива обережність з даними часових рядів через взаємозалежність усіх значень).
whuber

17

(Ця відповідь відповіла на повторне (зараз закрите) запитання під час виявлення визначних подій , яке представило деякі дані у графічній формі.)


Виявлення зовні залежить від характеру даних та від того, що ви готові припустити про них. Методи загального призначення спираються на надійну статистику. Суть цього підходу полягає в тому, щоб охарактеризувати основну частину даних таким чином, на який не впливають жодні люди, що переживають, а потім вказати на будь-які індивідуальні значення, які не входять до цієї характеристики.

Оскільки це часовий ряд, він додає ускладнень необхідності (повторного) виявлення людей, що перебувають у віці, на постійній основі. Якщо це робити, коли серія розгортається, тоді нам дозволяється використовувати лише старіші дані для виявлення, а не майбутні дані! Більше того, як захист від багатьох повторних тестів, ми хотіли б використовувати метод, що має дуже низький показник хибнопозитивних результатів.

Ці міркування пропонують провести простий, надійний тест рухомого вікна над даними . Існує багато можливостей, але одна проста, легко зрозуміла і легко реалізована заснована на запущеному MAD: абсолютне відхилення медіани від медіани. Це сильно надійний показник коливання в даних, подібний до стандартного відхилення. Вищий пік був би на кілька ПДВ або більше, ніж середній.

Rx=(1,2,,n)n=1150y

# Parameters to tune to the circumstances:
window <- 30
threshold <- 5

# An upper threshold ("ut") calculation based on the MAD:
library(zoo) # rollapply()
ut <- function(x) {m = median(x); median(x) + threshold * median(abs(x - m))}
z <- rollapply(zoo(y), window, ut, align="right")
z <- c(rep(z[1], window-1), z) # Use z[1] throughout the initial period
outliers <- y > z

# Graph the data, show the ut() cutoffs, and mark the outliers:
plot(x, y, type="l", lwd=2, col="#E00000", ylim=c(0, 20000))
lines(x, z, col="Gray")
points(x[outliers], y[outliers], pch=19)

Застосовується до набору даних, як червона крива, проілюстрована у запитанні, вона дає такий результат:

Сюжет

Дані відображаються червоним кольором, 30-денне вікно медіани + 5 * пороги MAD сірим кольором, а залишків - які є просто тими значеннями даних над сірою кривою - чорним кольором.

(Поріг можна обчислити лише починаючи з кінця початкового вікна. Для всіх даних у цьому початковому вікні використовується перший поріг: тому сіра крива плоска між x = 0 та x = 30.)

Ефекти зміни параметрів : (а) збільшення значення windowволі буде згладжувати сіру криву і (б) збільшення thresholdзбільшуватиме сіру криву. Знаючи це, можна взяти початковий сегмент даних і швидко визначити значення параметрів, які найкраще відокремлюють віддалені піки від решти даних. Застосуйте ці значення параметрів для перевірки решти даних. Якщо на графіку показано, що метод з часом погіршується, це означає, що характер даних змінюється і параметри можуть потребувати повторної настройки.

Зауважте, як мало цей метод передбачає дані: їх не потрібно нормально поширювати; їм не потрібно проявляти будь-яку періодичність; вони навіть не повинні бути негативними. Все, що передбачає, полягає в тому, що дані поводяться з часом досить подібними способами і що пікові відстані помітно вище, ніж решта даних.


Якщо хтось хотів би поекспериментувати (або порівняти якесь інше рішення з запропонованим тут), ось код, який я використав для отримання даних, таких як наведені у запитанні.

n.length <- 1150
cycle.a <- 11
cycle.b <- 365/12
amp.a <- 800
amp.b <- 8000

set.seed(17)
x <- 1:n.length
baseline <- (1/2) * amp.a * (1 + sin(x * 2*pi / cycle.a)) * rgamma(n.length, 40, scale=1/40)
peaks <- rbinom(n.length, 1,  exp(2*(-1 + sin(((1 + x/2)^(1/5) / (1 + n.length/2)^(1/5))*x * 2*pi / cycle.b))*cycle.b))
y <- peaks * rgamma(n.length, 20, scale=amp.b/20) + baseline

Це дійсно цікаве рішення, і я ціную, що я можу реалізувати його без використання R (просто використовуючи звичайний JavaScript у веб-додатку). Дякую!
hgoebl

15

Якщо ви турбуєтесь щодо припущень щодо будь-якого конкретного підходу, один із підходів - це навчити декілька учнів на різних сигналах, тоді використовуйте ансамблеві методи та об'єднуючись над «голосами» ваших учнів, щоб скласти класифікацію поза.

До речі, це, можливо, варто прочитати чи продемонструвати, оскільки воно посилається на кілька підходів до проблеми.


5

Я здогадуюсь, що вдосконалена модель часового ряду не буде працювати для вас через час, який потрібен для виявлення людей, що втратили життя, використовуючи цю методологію. Тому ось вирішення:

  1. Спочатку встановіть базовий "звичайний" режим руху за рік на основі ручного аналізу історичних даних, який враховує час доби, тиждень проти вихідних, місяць року тощо.

  2. Використовуйте цю базову лінію разом з деяким простим механізмом (наприклад, ковзною середньою, запропонованою Карлосом), щоб виявити людей, що втратили життя.

Ви також можете переглянути літературу з контролю статистичних процесів, щоб отримати деякі ідеї.


1
Так, це саме те, що я роблю: до цих пір я вручну розділяв сигнал на періоди, так що для кожного з них я можу визначити інтервал довіри, в межах якого сигнал повинен бути нерухомим, і тому я можу використовувати стандартні методи, такі як стандартне відхилення, ... Справжня проблема полягає в тому, що я не можу визначити очікувану схему для всіх сигналів, які я маю аналізувати, і саме тому я шукаю щось більш розумне.
gianluca

Ось одна ідея: Крок 1: Впроваджуйте та оцінюйте загальну модель часових рядів на основі історичних даних. Це можна зробити в автономному режимі. Крок 2: Використовуйте отриману модель для виявлення людей, що вижили. Крок 3: На деякій частоті (можливо, щомісяця?) Повторно відкалібруйте модель часового ряду (це можна зробити в автономному режимі), щоб виявлення ваших кроків 2 не виходило занадто сильно з поточними схемами руху. Це буде працювати для вашого контексту?

Так, це може спрацювати. Я замислювався над подібним підходом (перераховуючи базовий рівень щотижня, який може бути інтенсивним процесором, якщо вам доведеться проаналізувати сотні універсальних часових рядів). BTW справжнє складне питання - "який найкращий алгоритм стилю blackbox для моделювання повністю загального сигналу, враховуючи шум, оцінку тенденцій та сезонність?". AFAIK, кожен підхід в літературі вимагає дійсно жорсткої фази «настройки параметрів», і єдиний знайдений нами автоматичний метод - модель ARIMA від Hyndman ( robjhyndman.com/software/forecast ). Я щось пропускаю?
gianluca

Будь ласка, майте на увазі, що я не лінуюся досліджувати ці параметри, справа в тому, що ці значення потрібно встановлювати відповідно до очікуваної схеми сигналу, і в моєму сценарії я не можу робити жодного припущення.
gianluca

Моделі ARIMA - це класичні моделі часових рядів, які можна використовувати для підключення даних часових рядів. Я б закликав вас вивчити застосування моделей ARIMA. Ви можете зачекати, коли Роб перебуває в Інтернеті, і, можливо, він заграє якимись ідеями.

5

Сезонно коригуйте дані таким чином, щоб звичайний день виглядав ближче до рівного. Ви можете взяти вибірку сьогодні о 17:00 та відняти або розділити середнє значення за попередні 30 днів о 17:00. Потім огляньте минулі стандартні відхилення N (виміряні за допомогою попередньо відрегульованих даних) для залишків. Це можна зробити окремо для тижневих та щоденних "сезонів".


Знову ж таки, це працює досить добре, якщо сигнал повинен мати подібну сезонність, але якщо я використовую зовсім інший часовий ряд (наприклад, середній час турингу в TCP протягом часу), цей метод не буде працювати (оскільки було б краще для обробки цього простого глобального середнього та стандартного відхилення за допомогою розсувного вікна, що містить історичні дані).
gianluca

1
Якщо ви не готові впровадити загальну модель часових рядів (яка приносить свої мінуси щодо затримки тощо), я песимістичний, що ви знайдете загальну реалізацію, яка в той же час є достатньо простою для роботи у будь-яких часових рядах.

Ще один коментар: я знаю, що гарною відповіддю може бути "щоб ви могли оцінити періодичність сигналу і вирішити алгоритм використовувати відповідно до нього", але я не знайшов справжнього хорошого рішення цієї іншої проблеми (я грав у біт при спектральному аналізі з використанням DFT та аналізу часу за допомогою функції автокореляції, але мій часовий ряд містить багато шуму, і такі методи дають певні результати більшу частину часу)
gianluca

Коментар до вашого останнього коментаря: саме тому я шукаю більш загальний підхід, але мені потрібна якась «чорна скринька», тому що я не можу робити жодних припущень щодо аналізованого сигналу, і тому я не можу створити "кращий параметр для алгоритму навчання".
gianluca

@gianluca Як ви задумалися, основна структура ARIMA може замаскувати аномалію. Можливі неправильні рецептури можуть спричинити змінні, такі як година дня, день тижня, наслідки свят тощо, також можуть замаскувати аномалію. Відповідь досить зрозуміла, що вам потрібно мати хорошу обережність, щоб ефективно виявити аномалії. Цитую Бекона: «Бо хто знає шляхи Природи, легше помітить її відхилення, а з іншого боку, хто знає її відхилення, більш точно опише її шляхи».
IrishStat

3

Альтернативою підходу, описаному Роб Хайндманом, було б використання прогнозування Холта-Вінтера . Діапазони довіри, отримані від Holt-Winters, можуть бути використані для виявлення людей, що втратили вірогідність. Ось стаття, в якій описано, як використовувати Холт-Вінтерс для "Аберрантного виявлення поведінки у часових рядах для моніторингу мережі". Реалізацію для RRDTool можна знайти тут .


2

Спектральний аналіз виявляє періодичність у стаціонарних часових рядах. Підхід до частотної області, заснований на оцінці спектральної щільності, є підходом, який я рекомендував би як ваш перший крок.

Якщо для певних періодів неправильність означає значно більший пік, ніж типовий для цього періоду, то ряд з такими нерівностями не був би нерухомим, а спектральний аналіз не був би доцільним. Але якщо припустити, що ви визначили період, який має нерівності, ви повинні бути в змозі визначити, якою була б нормальна висота піку, а потім можете встановити поріг на деякому рівні вище середнього, щоб позначити нерегулярні випадки.


2
Чи можете ви пояснити, як це рішення виявить «місцеві порушення»? Представлення відпрацьованого прикладу було б надзвичайно корисним. (Якщо чесно, я пропоную вам зробити це, тому що, виконуючи таку вправу, я вважаю, ви виявите, що ваша пропозиція не є ефективною для виявлення
сторонніх людей

1
@whuber Спектральний аналіз виявить лише те, де всі вершини. Наступним кроком буде встановлення моделі серії yime з використанням синусоїдальних і косинусних термінів із частотами, визначеними спектральним аналізом, та амплітудами, оціненими з даних. Якщо нерівності означають піки з дуже високою амплітудою, то я думаю, що поріг по амплітуді був би відповідним. Якщо локальні нерівності означають, що за певний період амплітуда іноді значно більша за інші, то ряд не є стаціонарним і спектральний аналіз не був би доцільним.
Майкл Черник

1
Я не дотримуюся висновку про відсутність стаціонарності. Наприклад, сума правильної синусоїдальної форми хвилі та позначеного процесу точки Пуассона була б нерухомою, але вона не проявляла б жодної періодичності, яку ви шукаєте. Тим не менш, ти знайдеш кілька сильних піків у періодограмі, але вони не скажуть тобі нічого, що стосується нерегулярних піків даних, введених компонентом процесу Пуассона.
whuber

1
Стаціонарний часовий ряд має постійне середнє значення. Якщо пік періодичної складової може змінюватися з часом, це може призвести до того, щоб середнє значення змінювалося з часом, а значить, сейри будуть нестаціонарними.
Майкл Черник

2

Оскільки це дані часових рядів, простий експонентний фільтр http://en.wikipedia.org/wiki/Exponential_smoothing згладить дані. Це дуже хороший фільтр, оскільки вам не потрібно накопичувати старі точки даних. Порівняйте кожне нещодавно згладжене значення даних з його негладким значенням. Після того, як відхилення перевищить певний заздалегідь визначений поріг (залежно від того, що ви вважаєте, що у ваших даних є перехитник), то ваш аутлер можна легко виявити.

У CI зробимо наступне для 16-бітового зразка в реальному часі (я вважаю, що це знаходиться десь тут <Пояснення - https://dsp.stackexchange.com/questions/378/what-is-the-best-first-order -iir-наближення-до-переміщення середнього фільтра >)

#define BITS2 2     //< This is roughly = log2( 1 / alpha ), depending on how smooth you want your data to be

short Simple_Exp_Filter(int new_sample) 
{static int filtered_sample = 0;
long local_sample = sample << 16; /*We assume it is a 16 bit sample */
filtered_sample += (local_sample - filtered_sample) >> BITS2;   
return (short) ((filtered_sample+0x8000) >> 16); //< Round by adding .5 and truncating.   
}


int main()
{
newly_arrived = function_receive_new_sample();
filtered_sample = Simple_Exp_Filter(newly_arrived);
if (abs(newly_arrived - filtered_sample)/newly_arrived > THRESHOLD)
    {
    //AN OUTLIER HAS BEEN FOUND
    }
 return 0;   
}

1

Ви можете використовувати стандартне відхилення останніх N вимірювань (виберіть відповідний N). Хорошим показником аномалії було б скільки стандартних відхилень вимірювання від ковзної середньої.


Дякую за вашу відповідь, але що робити, якщо сигнал демонструє високу сезонність (тобто багато мережевих вимірювань характеризуються одночасно денною та тижневою схемою, наприклад, ніч проти дня або вихідні проти робочих днів)? Підхід, заснований на стандартному відхиленні, не спрацює в такому випадку.
gianluca

Наприклад, якщо я отримую новий зразок кожні 10 хвилин, і я виконую зовнішнє виявлення використання пропускної здатності мережі в компанії, в основному о 18:00 ця міра знизиться (це очікувана нормальна модель), і стандартне відхилення, обчислене над розсувним вікном, не вдасться (оскільки воно обов'язково призведе до попередження). У той же час, якщо міра падає о 16:00 (відхиляється від звичайної базової лінії), це справжній перелом.
gianluca

1

Що я роблю - це групувати вимірювання за годиною та днем ​​тижня та порівнювати стандартні відхилення. Досі не виправляєш такі речі, як свята та літньо-зимова сезонність, але це правильне більшість часу.

Мінус у тому, що вам дійсно потрібно зібрати рік або близько того даних, щоб їх було достатньо, щоб stddev почав мати сенс.


Дякую, саме цього я намагався уникати (маючи багато зразків як базовий рівень), тому що я хотів би реально реагувати підхід (наприклад, виявлення в Інтернеті, можливо, "брудне", через 1-2 тижні базового рівня)
gianluca

0

Я пропоную схему нижче, яка повинна бути реалізована через день або близько того:

Навчання

  • Зберіть стільки зразків, скільки можна зберегти в пам'яті
  • Видаліть очевидні залишки, використовуючи стандартне відхилення для кожного атрибута
  • Обчисліть і зберігайте кореляційну матрицю, а також середнє значення кожного атрибута
  • Обчисліть і зберігайте відстані махаланобіса всіх ваших зразків

Обчислення "чужості":

Для єдиного зразка, який ви хочете дізнатися про його "чужість":

  • Отримайте засоби, матрицю коваріації та відстань махаланобіса від тренувань
  • Обчисліть відстань "d" махаланобіса для вашої вибірки
  • Поверніть відсоток, в якому падає "d" (використовуючи відстані махаланобіса від тренувань)

Це буде ваш зовнішній бал: 100% - це надзвичайно.


PS. При обчисленні відстані махаланобіса використовуйте кореляційну матрицю, а не матрицю коваріації. Це більш надійно, якщо вимірювання вибірки різняться в одиниці та кількості.


0

У випадку, коли вам доведеться швидко обчислити людей, які використовуються, можна використати ідею Роб Хандмана та Махіто Сугіяма ( https://github.com/BorgwardtLab/sampling-outlier-detection , library (spoutlier), функція qsp) для обчислення. Витрати наступним чином:

library(spoutlier)
rapidtsoutliers <- function(x,plot=FALSE,seed=123)
{
    set.seed(seed)
    x <- as.numeric(x)
    tt <- 1:length(x)
    qspscore <- qsp(x)
    limit <- quantile(qspscore,prob=c(0.95))
    score <- pmax((qspscore - limit),0)
    if(plot)
    {
        plot(x,type="l")
        x2 <- ts(rep(NA,length(x)))
        x2[score>0] <- x[score>0]
        tsp(x2) <- tsp(x)
        points(x2,pch=19,col="red")
        return(invisible(score))
    }
    else
        return(score)
}

0

Виявлення аномалії вимагає побудови рівняння, яке описує очікування. Виявлення втручання доступне як у безпричинному, так і в причинному зв'язку. Якщо у вас є цілий ряд прогнозів, як ціна, то все може ускладнитися. Інші відповіді тут, схоже, не враховують причину, яка може бути пов’язана з визначеними користувачем серіями прогнозів, як-от ціна, і, таким чином, можуть бути помилковими. Кількість проданої може цілком залежати від ціни, можливо, попередніх цін і, можливо, кількості, проданої в минулому. Підстава для виявлення аномалії (імпульси, сезонні імпульси, зрушення рівня та місцеві тенденції часу) знаходиться у https://pdfs.semanticscholar.org/09c4/ba8dd3cc88289caf18d71e8985bdd11ad21c.pdf


Посилання не працює, ви можете виправити його. Спасибі
Панкай Джоші

зроблено ..................
IrishStat
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.