Чому цей тенденційний часовий ряд стаціонарний?

Дослідження розширеного методу Дікі-Фуллера (ADF) перевірити на дивному прикладі

Фото Ян Хубер on Unsplash

Стаціонарність є однією з найбільш фундаментальних концепцій аналізу часових рядів. Як правило, стаціонарність забезпечить чудові властивості для моделювання часових рядів різними статистичними методами. Доповнений Dickey-Fuller (ADF) Тест є, ймовірно, найбільш широко використовуваним підходом для перевірки стаціонарності.

В Інтернеті є маса статей на цю тему. Я не буду витрачати ваш час на основні вступні моменти, такі як визначення стаціонарності, як проводити тести ADF тощо. У цій публікації я поділюся своєю подорожжю дослідження тесту ADF після того, як зіткнувся з дивним випадком у програмі.

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

Знову ж таки, я поділюся своїм кодом на GitHub; нарешті знайдіть посилання в довідковому розділі.

Початок несподіваної подорожі

Днями я працював з часом. На малюнку 1 показаний один із них. Подвійного немає існує тенденція до зростання, і дисперсія також змінюється з часом. Завдяки цій чіткій візуалізації мені не потрібно було перевіряти стаціонарність. З якоїсь причини, яку я не пам’ятаю, я все-таки спробував це з тестом ADF. Дивно, але p-значення майже дорівнює 0, що означає, що я повинен відхилити нульову гіпотезу та прийняти її стаціонарну.

Рисунок 1. Часовий ряд із трендом (зображення автора)

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

На малюнку 20,000 наведено 1 0.0005 спостережень, що означає, що тенденція зростає надзвичайно повільно. Я створюю часовий ряд із невеликим нахилом 0. Середнє значення часового ряду зростає приблизно від 0.5 до 1000 після XNUMX спостережень. Тоді давайте перевіримо це за допомогою функції adfuller(). statsmodels.tsa.stattools із параметрами за замовчуванням. Р-значення становить 0.01, і «проблема» повторюється знову. Рисунок 2 показує результат. Ви можете проігнорувати заголовок і зосередитися на висхідній тенденції. Пізніше я поясню, чому ми маємо p-значення з трьох різних тестів ADF.

Рисунок 2. Синтетичний часовий ряд із результатом тесту ADF (зображення автора)

Математика тесту DF

Ми повинні зануритися глибше, щоб побачити, що саме робить тест ADF. Виявляється, його математична підготовка не є складною. По-перше, тест ADF — це лише розширена версія Тест Дікі-Фуллера. Існує три основні версії тесту DF (з Вікіпедії):

Версія 1: Тест на одиничний корінь: ∆yᵢ = δyᵢ₋₁ + uᵢ

Версія 2: Тест на одиничний корінь із константою: ∆yᵢ = a₀ + δyᵢ₋₁ + uᵢ

Версія 3. Тест на одиничний корінь із постійним і детермінованим трендом: ∆yᵢ = a₀ + a₁*t + δyᵢ₋₁ + uᵢ

У кожній версії нульова гіпотеза полягає в тому, що існує одиничний корінь, δ=0.

Пакет Statsmodels підтримує всі три версії з параметром «регресія».

Для версії 1 регресією є «n» (без константи, без тенденції).

Для версії 2 регресією є «c» (тільки константа); це налаштування за умовчанням.

Для версії 3 регресією є «ct» (константа та тренд).

Я повторюю тест із трьома різними налаштуваннями, і нижче наведено нові результати.

Для версії 1 p-значення становить 0.09. Ми не повинні відкидати нульову гіпотезу.

Для версії 2 р-значення становить 0.01. Ми вже розглядали це як проблему, оскільки це налаштування за замовчуванням.

Для версії 3 p-значення становить 0.00. Це очікувано, тому що часові ряди дійсно є стаціонарний з детермінованим трендом.

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

Від тесту DF до лінійної регресії

Виходячи з наведеного вище визначення, тест DF є просто лінійною регресією. На малюнку 3 показано всі точки для лінійної регресії. Вісь Y – це ∆yᵢ, вісь X – yᵢ₋₁, а uᵢ – нев’язка. Версія 1 означає, що ми повинні підганяти лінію без перетину (без константи). Версія 2 означає, що ми повинні підганяти лінію з перехопленням (константа).

Рисунок 3. ∆yᵢ і yᵢ₋₁ (зображення автора)

Лінійна регресія Skitlearn добре підтримує ці два варіанти за допомогою параметра fit_intercept. Під малюнком 4 зображені дві підігнані лінії. Як бачите, лінія з перехопленням підходить краще, ніж лінія без перерізу. Оцінка R-квадрат також це чітко підтвердила. Також зауважте, що нахил помаранчевої лінії менший, ніж нахил синьої. Іншими словами, нахил помаранчевої лінії ближче до 0.

Рисунок 4. Результат лінійної регресії (зображення автора)

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

Ми побачили, чи відповідає лінійній регресії включення перехоплених впливів. Чому підгонка лінії впливає на результати тесту ADF і звідки береться значення p?

Від лінійної регресії до p-значення

Тепер стає дещо складніше. Остаточне p-значення тесту DF не залежить від p-значення коефіцієнтів лінійної регресії. По суті, статистика має певний розподіл, відомий як таблиця Дікі-Фуллера. Потім ми використовуємо приблизне p-значення Маккіннона для тестової статистики. Ви можете знайти подробиці в Вихідний код Statsmodels.

Оскільки нульова гіпотеза дорівнює δ=0, це означає, що перевірка нахилу підігнаної лінії дорівнює 0. Нам не потрібно вдаватися в деталі того, як отримати p-значення. Логічний ланцюжок зв’язку між p-значенням і нахилом (δ у лінійній регресії, а не нахилом тенденції) виглядає так:

Як правило, якщо нахил далекий від 0, p-значення має бути меншим, що, швидше за все, відхиляє нульову гіпотезу та передбачає відсутність одиничного кореня та стаціонарне. Якщо нахил дорівнює 0 або дуже близький до 0, p-значення має бути вищим, що, швидше за все, приймає нульову гіпотезу та передбачає одиничний корінь і нестаціонарність. Щодо другого сценарію у Вікіпедії сказано: «Тести мають низьку статистичну потужність, оскільки вони часто не можуть розрізнити справжні процеси з одиничним коренем (δ = 0) і процеси, близькі до одиничного кореня (δ близьке до 0)». Тому в першу чергу ми маємо проблему. Ми маємо справу з процесом, близьким до одиничного кореня. Версія 1 знаходить одиничний корінь, а версія 2 не може знайти одиничний корінь.

Чому версія 1 працює для наведеного вище прикладу?

Версія 1 працює для даних на малюнку 2, оскільки ми робимо нахил ближчим до 0, тому значення p вище.

Однак ми не можемо використовувати версію 1 як параметр за замовчуванням. Є два випадки для версії 1 (примушування рядка проходити через (0,0)):

Випадок 1: (0,0) ближче до всіх точок даних. Якщо лінія має проходити через (0,0), то лінія буде більш плоскою, а нахил наближається до 0. Рисунок 4 демонструє цей випадок. Будь ласка, зверніть увагу, що демонстрація на малюнку 4 відповідає лише одній змінній yᵢ₋₁, фактичний ADF відповідатиме іншим змінним затримки.

Випадок 2: (0,0) далеко від усіх точок даних. Якщо лінія повинна проходити через (0,0), ми можемо не підібратися; по суті, нахил дорівнює 0, тобто ми не можемо знайти лінійну залежність ∆yᵢ і yᵢ₋₁ так, щоб лінія проходила (0,0) і охоплювала більшість точок даних. Таким чином, результат тесту буде зміщений у бік кореневої одиниці.

На малюнку 5 нижче показано приклад тесту версії 1, який не зміг відхилити нульову гіпотезу (p-значення 0.6), а дані стаціонарні із середнім значенням 10. На малюнку 6 пояснюється причина. Як бачите, ми не можемо знайти лінію без перетину (R-квадрат дорівнює 0), тому нахил підігнаної лінії дорівнює 0 (∆yᵢ не залежить від yᵢ₋₁).

Рисунок 5. Версії 1 не вдалося розпізнати стаціонарний часовий ряд (зображення автора)
Малюнок 6. Лінійна регресія не може знайти пряму без перетину (проходить (0,0)) (Зображення автора)

Від тесту DF до тесту ADF

Тепер ми розуміємо, що тест DF — це лінійна регресія, і як отримати p-значення з лінійної регресії, давайте перейдемо до ADF. Формула ADF:

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

Пакет statsmodels дозволяє показати докладний підсумок тесту AFT. Рисунок 7 - це результат.

Рисунок 7. Тест ADF із детальним підсумком (зображення автора)

Ми бачимо «регресію OLS» (рішення за замовчуванням для лінійної регресії) і 17 коефіцієнтів. Я не вказав максимальну затримку, тому тест спробує отримати число на основі довжини часового ряду, тобто 17.

Const (перехоплення) також підходить. Значення дорівнює 0.0596.

Давайте спробуємо реалізувати тест ADF за допомогою лінійної регресії в Scikit-learn. Рисунок 8 - це код і вихід.

Малюнок 8. Тест ADF (лише частина лінійної регресії) за допомогою Scikit-learn (зображення автора)

Відрізок дорівнює 0.0596, а інші коефіцієнти такі самі, як на малюнку 7. Лінійна регресія в Scikit-learn — це звичайна OLS. Ми робимо те саме, тому не дивно, що результати ідентичні.

Кінець подорожі

Після того, як я з’ясував, як встановити параметр, я перевірив оригінальний часовий ряд на малюнку 1, використовуючи версію 1 (регресія =’n’) і отримав значення p 0.08, що свідчить про те, що воно не є стаціонарним. Будь ласка, зверніть увагу, що дані на малюнку 1 є нульовим середнім, тому ви можете уявити, що (0,0) ближче до точок даних (∆yᵢ, yᵢ₋₁). Використання тесту версії 1 допоможе нам.

Оскільки нахил тенденції на малюнку 1 є мінімальним, ми також можемо перевибірати часовий ряд із кроками, що збільшує нахил. Наприклад, якщо я перевірю його за допомогою чотирьох кроків ( value[::4]), він не пройде тест ADF із налаштуванням за замовчуванням (p-value 0.17 для regression=’c’).

Проблема вирішена.

Takeaways

Не довіряйте сліпо результатам ADF. Візуалізація - ваш друг.

Тест ADF — це проста лінійна регресія, а реалізація statsmodels використовує OLS для вирішення проблеми регресії. Потім він використовує таблицю Дікі–Фуллера, щоб отримати p-значення, яке підтверджує нульову гіпотезу про те, що коефіцієнт першої змінної лага з підігнаної регресії дорівнює 0.

Тест ADF має обмеження під час тестування процесів, близьких до одиничного кореня (δ близьке до 0).

Нам потрібно відповідно вибрати правильну версію ADF. Наприклад, якщо ви бачите постійний тренд і хочете перевірити «стаціонарний тренд», вам потрібно вибрати «ct» як параметр. Якщо ви збираєтеся вловити повільний тренд для сигналу, середнє значення якого має дорівнювати 0, як на рисунках 1 і 2, можливо, вам потрібно вибрати «n» як параметр, щоб уникнути впливу підгонки перехоплення. Statsmodels також підтримує кількісний тренд із параметром «ctt». Ця розширена опція може бути хорошим вибором у деяких випадках. Якщо ви хочете копати далі, зверніться до Робота з невизначеністю щодо включення термінів перехоплення та детермінованого часового тренду.

Сподіваюся, ви щось дізналися про тест ADF.

Розважайтесь із часовими рядами!

Зв'яжіться зі мною LinkedIn.

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

посилання

Файл блокнота на GitHub

Чому цей тенденційний часовий ряд стаціонарний? Перепубліковано з джерела https://towardsdatascience.com/why-is-this-trending-time-series-stationary-f3fb9447336f?source=rss—-7f60cf5620c9—4 через https://towardsdatascience.com/feed

<!–

->

Часова мітка:

Більше від Консультанти з блокчейнів