Разбиение сигнала на три истории
Временной ряд редко представляет собой один чистый процесс — обычно это медленно движущаяся тенденция, повторяющийся сезонный паттерн, связанный с календарем или часами, и все, что остается после удаления обоих, остаток (или случайный компонент). Классическое разложение предполагает, что наблюдаемая серия Y состоит из этих трех частей одним из двух простых способов:
additive: Y(t) = Trend(t) + Seasonal(t) + Residual(t)
use when the seasonal swing stays roughly constant in absolute size
multiplicative: Y(t) = Trend(t) × Seasonal(t) × Residual(t)
use when the seasonal swing grows/shrinks proportionally to
the trend level (common in sales, traffic, anything that
compounds) — equivalent to an additive model on log(Y)
Вилучення тренду: ковзний середній показник
Найбільш надійна спосіб витягти тренд без припущення про його функціональну форму — це центрований ковзний середній показник, вікно якого точно відповідає періоду сезонності — усереднення протягом повного циклу скасовує сезонну складову (воно сумується приблизно до нуля за один період, за конструкцією) і згладжує шум, залишаючи повільно змінюваний тренд:
для періоду p (наприклад, p = 12 для щомісячних даних із річною сезонністю): Тренд(t) = (1/p) · Σ_{i=−p/2}^{p/2} Y(t+i) (центрований; невелике коригування обробляє парне p, усереднюючи два перекриваються вікна, щоб кожна точка отримала упереджений ваг) Це саме пояснює, наскільки важливий вік вікна: занадто короткий і сезонні хвилі просочуються в те, що ви називаєте «трендом»; занадто довгий і ви розмиваєте справжні повороти в основному тренді. Неуникна вартість центрованого вікна полягає в тому, що його не можна обчислити для перших та останніх p/2 точок серії — ковзний середній показник тренду завжди пропущено кінець, який STL (нижче) виправляє більш ретельною екстраполяцією.
for period p (e.g. p = 12 for monthly data with yearly seasonality):
Trend(t) = (1/p) · Σ_{i=−p/2}^{p/2} Y(t+i) (centred; a small tweak
handles even p by
averaging two overlapping
windows so each point
gets an unbiased weight)
Вилучення сезонності: середнє значення за фазою
Після видалення тренду (віднімається для додаваного, поділяється для множника), що залишається - це сезонність плюс шум. Щоб ізолювати сезонний компонент, групуйте кожне спостереження за його положенням у циклі — кожен січень разом, кожен лютий разом і так далі для місячних даних, та обчислюйте середнє значення по всіх циклах, присутніх у серії:
видалений тренд(t) = Y(t) − Тренд(t) сезонний індекс[m] = середнє значення видаленого тренду(t) для всіх t з фазою(t) = m Сезонний(t) = сезонний індекс[фаза(t)] (нормалізовано до суми/середнього значення 0) Усереднення по циклам робить цей метод стійким до шуму в будь-якому циклі: одне незвично холодне січневе спостереження мало впливає на оцінену січневу сезонну індексу, коли його усереднено з кількома іншими січнями. Це також означає, що класичний метод потребує щонайменше двох, а краще багатьох, повних циклів даних перед тим, як його сезонна оцінка стане надійною — з одним циклом спостереження сезонність і залишки нерозрізнені.
detrended(t) = Y(t) − Trend(t) (additive case) seasonal_index[m] = mean of detrended(t) over all t with phase(t) = m Seasonal(t) = seasonal_index[phase(t)] (normalised to sum/average to 0)
Залишок: що це таке та що він означає
Залишковий(t) = Y(t) − Тренд(t) − Сезонний(t) – це все, що модель не могла пояснити – справжній шум, але також реальний сигнал, який занадто проста тренд/сезонна модель не може захопити: одноразові події, структурні зміни, свята, які змінюються протягом року (які не можуть бути представлені фіксованим місячним сезонним індексом), або сезонний патерн, що повільно змінюється з плином років. Залишок – це місце, де здійснюється виявлення аномалій: після видалення тренду та сезонності точка, яка все ще на значну кількість стандартних відхилень від нуля, є справді незвичною, таким чином, як би ви не розглядали початковий ряд (велике число в грудні може бути повністю нормальним сезонним поводженням; однаковий стрибок у залишку після розкладання не є).
STL: більш точний і надійний розклад
STL (Сезонно-трендова декомпозиція за допомогою Loess, Cleveland et al. 1990) вдосконалює класичну рецептуру трьома способами. Він замінює фікване вікно ковзного середнього на Loess — локальне зважене поліноміальне регресування — для гладкого тренду та сезонного компонента, що дозволяє без проблем вирішувати проблему відсутніх кінцевих точок і дозволяє сезонному шаблону повільно змінюватися з часом замість того, щоб бути зафіксованим у одному фіксному вигляді. Він ітерується: оцінює тренд, потім сезонний компонент на основі детрендованої серії, а потім тренд з десезонного компонента, збігаючись протягом кількох проходів замість того, щоб виконувати кожен крок один раз. І він підтримує надійне зважування, зменшуючи вагу відхилених спостережень у процесі ітерації, щоб не дозволити кільком аномальним точкам затягнути весь тренд або сезонний оцінку в бік, що є великою перевагою над класичним методом, який просто використовує середнє значення кожного спостереження як рівноцінне.
Пошук періоду самій: періограма
Все вищезазначене припускає, що ви вже знаєте сезонний період p. Коли цього немає — або ви хочете перевірити наявність періодичності, яку не очікували — дискретна швидкість Фур'є відповідає на це безпосередньо, перераховуючи серію як суму синусів і косинусів на дискретній множині частот та повідомляючи про те, скільки потужності (квадратична амплітуда) знаходиться в кожній з них:
X(f) = Σ_t Y(t) · exp(−2πi f t) дискретна швидкість Фур'є Power(f) = |X(f)|² періограма period = 1 / f при частоті, де Power(f) досягає піку Жива періограма візуально очевидним чином показує сезонність у порівнянні з серією часових рядів, яку часто не видно: справжній періодичний компонент відображається як різкий, високий пік на своїй частоті (та часто меншими піками на своїх гармоніях, якщо форма сезону не є чистою синусоїдою), тоді як чистий шум розподіляє свою потужність приблизно рівномірно по всіх частотах. Єдиний жорсткий ліміт — це частота Найквіста: вибірка з однією точкою на одиницю часу, DFT може розрізняти лише періодичності до двох зразків на цикл — будь-яка справжня періодичність швидше за це згортається та маскує як нижчу, оманливу частоту (змішування), тому швидкість віднімання має бути обрана з урахуванням найшвидшого циклу, який ви насправді хочете врахувати.
X(f) = Σ_t Y(t) · exp(−2πi f t) discrete Fourier transform Power(f) = |X(f)|² the periodogram period = 1 / f at the frequency where Power(f) peaks
Часті запитання
Як я можу дізнатися, чи використовувати додавальний чи множчийчний розклад?
Подивіться, чи залишається розмір сезонних коливань приблизно постійним з часом або зростає разом із рівнем тренду. Якщо серія зі зростаючим трендом також показує сезонні піки, які стають пропорційно більшими, коли тренд зростає, використовуйте множчийчний модель (або, еквівалентно, візьміть логарифм цієї серії та розкладіть її додавально). Якщо сезонний зсув залишається приблизно фіксованим розміром незалежно від рівня тренду, то додавальний є правильним вибором.
Чому вилучення тренду за допомогою ковзного середнього завжди обрізає деякі дані на початку та в кінці?
Центроване ковзне середнє з довжиною вікна p потребує p/2 точок з кожного боку точки, що оцінюється, тому воно просто не має дійсного вікна для перших і останніх p/2 пунктів серії. STL покращує це шляхом використання локальної регресії (Loess), яка може більш плавно екстраполювати поблизу країв, але навіть оцінка тренду STL зазвичай менш впевнена безпосередньо на межах даних.
Що мені говорить пік у спектrogramі?
Це повідомляє вам, що значна частина загальної дисперсії серії зосереджена при цій конкретній частоті — сильний доказ наявності справжнього періодичного компонента з періодом 1/f, а не випадкового шуму, який би рівномірно розподілив свою потужність по всіх частотах замість того, щоб зосереджувати її тут.
Спробуйте наживо
Усе, що вище, працює прямо у вашому браузері — відкрийте Time Series Decomposition і змінюйте параметри під час роботи. Нічого не встановлюється, нічого не завантажується на сервер, уся модель живе в одній вкладці.
▶ Відкрити симуляцію Time Series Decomposition