(Ця відповідь відповіла на повторне (зараз закрите) запитання під час виявлення визначних подій , яке представило деякі дані у графічній формі.)
Виявлення зовні залежить від характеру даних та від того, що ви готові припустити про них. Методи загального призначення спираються на надійну статистику. Суть цього підходу полягає в тому, щоб охарактеризувати основну частину даних таким чином, на який не впливають жодні люди, що переживають, а потім вказати на будь-які індивідуальні значення, які не входять до цієї характеристики.
Оскільки це часовий ряд, він додає ускладнень необхідності (повторного) виявлення людей, що перебувають у віці, на постійній основі. Якщо це робити, коли серія розгортається, тоді нам дозволяється використовувати лише старіші дані для виявлення, а не майбутні дані! Більше того, як захист від багатьох повторних тестів, ми хотіли б використовувати метод, що має дуже низький показник хибнопозитивних результатів.
Ці міркування пропонують провести простий, надійний тест рухомого вікна над даними . Існує багато можливостей, але одна проста, легко зрозуміла і легко реалізована заснована на запущеному MAD: абсолютне відхилення медіани від медіани. Це сильно надійний показник коливання в даних, подібний до стандартного відхилення. Вищий пік був би на кілька ПДВ або більше, ніж середній.
R
x=(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