08 - ARIMA

Прогнозування часових рядів

Ігор Мірошниченко

КНЕУ::ІІТЕ

11/23/22

Загальна інформація

ARIMA моделі

  • AR: авторегресія (лагові значення як вхідні дані)

  • I: інтегрування (диференціювання для стаціонарності)

  • MA: ковазна середня (лагові помилки як вхідні дані)

Модель ARIMA рідко можна інтерпретувати з точки зору структур даних, таких як тренд і сезонність. Але вони можуть охопити величезне різноманіття шаблонів часових рядів.

Стаціонарність і диференціація

Стаціонарність

Визначення

Якщо \(\{y_t\}\) — стаціонарний часовий ряд, то для всіх \(s\) розподіл \((y_t,\dots,y_{t+s})\) не залежить від \(t\)

Стаціонарний ряд це:

  • приблизно горизонтальний ряд
  • постійна дисперсія
  • відсутність передбачуваних патернів у довгостроковій перспективі

Стаціонарність?

gafa_stock %>%
  filter(Symbol == "GOOG", year(Date) == 2018) %>%
  autoplot(Close) +
  labs(y = "Google closing stock price", x = "Day")

Стаціонарність?

gafa_stock %>%
  filter(Symbol == "GOOG", year(Date) == 2018) %>%
  autoplot(difference(Close)) +
  labs(y = "Google closing stock price", x = "Day")

Стаціонарність?

global_economy %>%
  filter(Country == "Algeria") %>%
  autoplot(Exports) +
  labs(y = "% of GDP", title = "Algerian Exports")

Стаціонарність?

aus_production %>%
  autoplot(Bricks) +
  labs(title = "Clay brick production in Australia")

Стаціонарність?

prices %>%
  filter(year >= 1900) %>%
  autoplot(eggs) +
  labs(y="$US (1993)", title="Price of a dozen eggs")

Стаціонарність?

aus_livestock %>%
  filter(Animal == "Pigs", State == "Victoria") %>%
  autoplot(Count/1e3) +
  labs(y = "thousands", title = "Total pigs slaughtered in Victoria")

Стаціонарність?

aus_livestock %>%
  filter(Animal == "Pigs", State == "Victoria", year(Month) >= 2010) %>%
  autoplot(Count/1e3) +
  labs(y = "thousands", title = "Total pigs slaughtered in Victoria")

Стаціонарність?

aus_livestock %>%
  filter(Animal == "Pigs", State == "Victoria", year(Month) >= 2015) %>%
  autoplot(Count/1e3) +
  labs(y = "thousands", title = "Total pigs slaughtered in Victoria")

Стаціонарність?

pelt %>%
  autoplot(Lynx) +
  labs(y = "Number trapped", title = "Annual Canadian Lynx Trappings")

Стаціонарність

Визначення

Якщо \(\{y_t\}\) — стаціонарний часовий ряд, то для всіх \(s\) розподіл \((y_t,\dots,y_{t+s})\) не залежить від \(t\)

Трансформації допомагають стабілізувати дисперсію.

Для моделювання ARIMA нам також потрібно стабілізувати середнє.

Нестаціонарність у середньому

Ідентифікація нестаціонарних рядів

  • графік часу.
  • ACF стаціонарних даних відносно швидко падає до нуля
  • ACF нестаціонарних даних зменшується повільно.
  • Для нестаціонарних даних значення \(r_1\) часто є великим і позитивним.

Приклад: Google stock price

google_2018 <- gafa_stock %>%
  filter(Symbol == "GOOG", year(Date) == 2018)

Приклад: Google stock price

google_2018 %>%
  autoplot(Close) +
  labs(y = "Closing stock price ($USD)")

Приклад: Google stock price

google_2018 %>% ACF(Close) %>% autoplot()

Приклад: Google stock price

google_2018 %>%
  autoplot(difference(Close)) +
  labs(y = "Change in Google closing stock price ($USD)")

Приклад: Google stock price

google_2018 %>% ACF(difference(Close)) %>% autoplot()

Диференціювання

  • Розрізнення допомагає стабілізувати середнє.
  • Ряд різниць — це зміна між кожним спостереженням у вхідному ряді: \(y'_t = y_t - y_{t-1}\).
  • Ряд різниць матиме лише значення \(T-1\), оскільки неможливо обчислити різницю \(y_1'\) для першого спостереження.

Модель випадкового блукання

Якщо ряд різниць є білим шумом із нульовим середнім:

\[y_t-y_{t-1}=\varepsilon_t\] \[y_t=y_{t-1}+\varepsilon_t\]

де \(\varepsilon_t \sim NID(0,\sigma^2)\).

  • Дуже широко використовується для нестаціонарних даних.
  • Це модель наївного методу.
  • Випадкові блукання зазвичай мають:
    • тривалі періоди тенденцій до зростання або зниження
    • Раптові/непередбачувані зміни напрямку
  • Прогноз дорівнює останньому спостереженню
    • майбутні рухи вгору або вниз однаково ймовірні.

Випадкове блукання з дріфтовою моделлю

Якщо різницевий ряд є білим шумом із ненульовим середнім:

\[y_t-y_{t-1}=c+\varepsilon_t\] або \[y_t=c+y_{t-1}+\varepsilon_t\]

де \(\varepsilon_t \sim NID(0,\sigma^2)\).

  • \(c\) — це середня зміна між послідовними спостереженнями.
  • Якщо \(c>0\), \(y_t\) буде тяжіти до підвищення і навпаки.
  • Це модель метод дрейфу.

Різниця другого порядку

Іноді перших різниць недостатньо для досягнення стаціонарності, в таких випадках може знадобитися різниця другого порядку (різниця різниць): \[y''_{t} = y'_{t} - y'_{t - 1} \\ = (y_t - y_{t-1}) - (y_{t-1}-y_{t-2})\\ = y_t - 2y_{t-1} +y_{t-2}.\]

  • \(y_t''\) матиме значення \(T-2\).
  • На практиці майже ніколи не потрібно виходити за межі різниць другого порядку.

Різниця другого порядку

Сезонна різниця – це різниця між спостереженням і відповідним спостереженням за попередній рік. \[ y'_t = y_t - y_{t-m} \] де \(m=\) кількість сезонів.

  • Для місячних даних \(m=12\).
  • Для квартальних даних \(m=4\).

Продаж антидіабетичних препаратів

a10 <- PBS %>%
  filter(ATC2 == "A10") %>%
  summarise(Cost = sum(Cost)/1e6)

Продаж антидіабетичних препаратів

a10 %>% autoplot(
  Cost
)

Продаж антидіабетичних препаратів

a10 %>% autoplot(
  log(Cost)
)

Продаж антидіабетичних препаратів

a10 %>% autoplot(
  log(Cost) %>% difference(12)
)

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

h02 <- PBS %>%
  filter(ATC2 == "H02") %>%
  summarise(Cost = sum(Cost)/1e6)

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

h02 %>% autoplot(
  Cost
)

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

h02 %>% autoplot(
  log(Cost)
)

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

h02 %>% autoplot(
  log(Cost) %>% difference(12)
)

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

h02 %>% autoplot(
  log(Cost) %>% difference(12) %>% difference(1)
)

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

  • Ряд із сезонними різницями ближче до стаціонарного.
  • Решту нестаціонарності можна усунути подальшою першою різницею.

Якщо \(y'_t = y_t - y_{t-12}\) позначає ряд із сезонною різницею, тоді ряд з подвійною різницею є

\[y^*_t = y'_t - y'_{t-1} \\ = (y_t - y_{t-12}) - (y_{t-1} - y_{t-13}) \\ = y_t - y_{t-1} - y_{t-12} + y_{t-13}\]

Сезонна різниця

Коли застосовуються сезонні і перші різниці?

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

Важливо, що ряд різниць можна інтерпретувати.

Інтерпретація різниць

  • перші різниці – це зміна між одним спостереженням і наступним;
  • сезонні різниці – це зміна одного року до наступного.

Але, наприклад, різниці із затримкою 3 для річних даних призводить до моделі, яку неможливо розумно інтерпретувати.

Перевірка одиничного кореня

Статистичні тести для визначення необхідного порядку різниці.

  1. Розширений тест Дікі Фуллера: нульова гіпотеза полягає в тому, що дані є нестаціонарними та несезонними.
  2. Тест Квятковського-Філліпса-Шмідта-Шина (KPSS): нульова гіпотеза полягає в тому, що дані стаціонарні та несезонні.
  3. Інші тести, доступні для сезонних даних.

KPSS тест

google_2018 %>%
  features(Close, unitroot_kpss)
# A tibble: 1 × 3
  Symbol kpss_stat kpss_pvalue
  <chr>      <dbl>       <dbl>
1 GOOG       0.573      0.0252
google_2018 %>%
  features(Close, unitroot_ndiffs)
# A tibble: 1 × 2
  Symbol ndiffs
  <chr>   <int>
1 GOOG        1

Автоматичний вибір порядку різниць

STL декомпозиція : \(y_t = T_t+S_t+R_t\)

Сила сезонності \(F_s = \max\big(0, 1-\frac{\text{Var}(R_t)}{\text{Var}(S_t+R_t)}\big)\)

Якщо \(F_s > 0,64\), виконайте одну сезонну різницю.

h02 %>% mutate(log_sales = log(Cost)) %>%
   features(log_sales, list(unitroot_nsdiffs, feat_stl))
# A tibble: 1 × 10
  nsdiffs trend_stren…¹ seaso…² seaso…³ seaso…⁴ spikin…⁵ linea…⁶ curva…⁷ stl_e…⁸
    <int>         <dbl>   <dbl>   <dbl>   <dbl>    <dbl>   <dbl>   <dbl>   <dbl>
1       1         0.957   0.955       6       8 3.78e-10    2.92  -0.831  -0.237
# … with 1 more variable: stl_e_acf10 <dbl>, and abbreviated variable names
#   ¹​trend_strength, ²​seasonal_strength_year, ³​seasonal_peak_year,
#   ⁴​seasonal_trough_year, ⁵​spikiness, ⁶​linearity, ⁷​curvature, ⁸​stl_e_acf1

Автоматичний вибір порядку різниць

h02 %>% mutate(log_sales = log(Cost)) %>%
  features(log_sales, unitroot_nsdiffs)
# A tibble: 1 × 1
  nsdiffs
    <int>
1       1
h02 %>% mutate(d_log_sales = difference(log(Cost), 12)) %>%
  features(d_log_sales, unitroot_ndiffs)
# A tibble: 1 × 1
  ndiffs
   <int>
1      1

Несезонні ARIMA моделі

Авторегресійні моделі

Авторегресійні (AR) моделі:

\[ y_{t} = c + \phi_{1}y_{t - 1} + \phi_{2}y_{t - 2} + \cdots + \phi_{p}y_{t - p} + \varepsilon_{t}, \] де \(\varepsilon_t\) — білий шум. Це множинна регресія з лаговими значеннями \(y_t\) в якості предикторів.

AR(1) модель

\[y_{t} = 18 -0.8 y_{t - 1} + \varepsilon_{t}\] \(\varepsilon_t\sim N(0,1)\), \(T=100\).

AR(1) модель

\[y_{t} = c + \phi_1 y_{t - 1} + \varepsilon_{t}\] * Коли \(\phi_1=0\), \(y_t\) еквівалентно WN

  • Якщо \(\phi_1=1\) і \(c=0\), \(y_t\) еквівалентно RW

  • Коли \(\phi_1=1\) і \(c\ne0\), \(y_t\) еквівалентно RW із дріфтом

  • Коли \(\phi_1<0\), \(y_t\) має тенденцію коливатися між позитивними та негативними значеннями.

AR(2) модель

\[y_t = 8 + 1.3y_{t-1} - 0.7 y_{t-2} + \varepsilon_t\] \(\varepsilon_t\sim N(0,1)\), \(T=100\).

Умови стаціонарності

Зазвичай ми обмежуємо авторегресійні моделі стаціонарними даними, і тоді потрібні деякі обмеження на значення параметрів.

Загальна умова стаціонарності

Комплексні корені \(1-\phi_1 z - \phi_2 z^2 - \dots - \phi_pz^p\) лежать поза одиничним колом на комплексній площині.

  • Для \(p=1\): \(-1<\phi_1<1\).
  • Для \(p=2\): \(-1<\phi_2<1\qquad \phi_2+\phi_1 < 1 \qquad \phi_2 -\phi_1 < 1\).
  • Для \(p\ge3\) виконуються більш складні умови.
  • Про це подбає програмне забезпечення для оцінки.

Модель ковзного середнього (MA)

Модель ковзного середнього (MA)

\[ y_{t} = c + \varepsilon_t + \theta_{1}\varepsilon_{t - 1} + \theta_{2}\varepsilon_{t - 2} + \cdots + \theta_{q}\varepsilon_{t - q}, \] де \(\varepsilon_t\) — білий шум. Це множинна регресія з минулими помилками як предикторами.

Не плутайте зі згладжуванням ковзного середнього!

MA(1) модель

\[y_t = 20 + \varepsilon_t + 0.8 \varepsilon_{t-1}\] \(\varepsilon_t\sim N(0,1)\), \(T=100\).

MA(2) модель

\[y_t = \varepsilon_t -\varepsilon_{t-1} + 0.8 \varepsilon_{t-2}\] \(\varepsilon_t\sim N(0,1)\), \(T=100\).

MA(\(\infty\)) моделі

Будь-який стаціонарний процес AR(\(p\)) можна записати як процес MA(\(\infty\)).

Приклад: AR(1) \[y_t = \phi_1y_{t-1} + \varepsilon_t\\ = \phi_1(\phi_1y_{t-2} + \varepsilon_{t-1}) + \varepsilon_t\\ = \phi_1^2y_{t-2} + \phi_1 \varepsilon_{t-1} + \varepsilon_t\\ = \phi_1^3y_{t-3} + \phi_1^2\varepsilon_{t-2} + \phi_1 \varepsilon_{t-1} + \varepsilon_t\\\]

При \(-1<\phi_1<1\): \[y_t = \varepsilon_t + \phi_1\varepsilon_{t-1}+ \phi_1^2\varepsilon_{t-2}+ \phi_1^3\varepsilon_{t-3} + \cdots\]

Оберненість

  • Будь-який процес MA(\(q\)) можна записати як процес AR(\(\infty\)), якщо ми накладемо деякі обмеження на параметри MA.
  • Тоді модель МА називається «оберненою».
  • Обернені моделі мають деякі математичні властивості, які полегшують їх використання на практиці.
  • Оберненість моделі ARIMA еквівалентна прогнозованості моделі ETS.

Оберненість

Загальна умова оборотності

Комплексні корені \(1+\theta_1 z + \theta_2 z^2 + \dots + \theta_qz^q\) лежать поза одиничним колом на комплексній площині.

  • Для \(q=1\): \(-1<\theta_1<1\).
  • Для \(q=2\): \(-1<\theta_2<1\qquad \theta_2+\theta_1 >-1 \qquad \theta_1 -\theta_2 < 1\).
  • Для \(q\ge3\) виконуються більш складні умови.
  • Про це подбає програмне забезпечення для оцінки.

ARIMA models

Авторегресійні Моделі Ковзного Середнього

\[y_{t} = c + \phi_{1}y_{t - 1} + \cdots + \phi_{p}y_{t - p} \\ \text{} + \theta_{1}\varepsilon_{t - 1} + \cdots + \theta_{q}\varepsilon_{t - q} + \varepsilon_{t}\]

  • Прогнози включають як лагові значення \(y_t\), так і лагові помилки.
  • Умови на коефіцієнти AR забезпечують стаціонарність.
  • Умови на коефіцієнти MA забезпечують оборотність.

Авторегресійні Моделі Інтегрованого Ковзного Середнього

  • Поєднайте модель ARMA з інтегруванням.

ARIMA моделі

ARIMA моделі

ARIMA(\(p, d, q\)) моделі

  • AR: \(p =\) порядок авторегресійної частини
  • I: \(d =\) порядок різниці
  • MA: \(q =\) порядок ковзної середньої.
  • Модель білого шуму: ARIMA(0,0,0)
  • Випадкове блукання: ARIMA(0,1,0) без константи
  • Випадкове блукання з дріфтом: ARIMA(0,1,0)
  • AR(\(p\)): ARIMA(\(p\),0,0)
  • MA(\(q\)): ARIMA(0,0,\(q\))

Експорт Єгипету

global_economy %>%
  filter(Code == "EGY") %>%
  autoplot(Exports) +
  labs(y = "% of GDP", title = "Egyptian Exports")

Експорт Єгипету

fit <- global_economy %>% filter(Code == "EGY") %>%
  model(ARIMA(Exports))
report(fit)
Series: Exports 
Model: ARIMA(2,0,1) w/ mean 

Coefficients:
         ar1      ar2      ma1  constant
      1.6764  -0.8034  -0.6896    2.5623
s.e.  0.1111   0.0928   0.1492    0.1161

sigma^2 estimated as 8.046:  log likelihood=-141.57
AIC=293.13   AICc=294.29   BIC=303.43

ARIMA(2,0,1) model:

\[ y_t = 2.56 + 1.68 y_{t-1} -0.80 y_{t-2} -0.69 \varepsilon_{t-1} + \varepsilon_{t}, \] де \(\varepsilon_t\) це білий шум зі стандартним відхиленням \(2.837 = \sqrt{8.046}\).

Експорт Єгипету

gg_tsresiduals(fit)

Експорт Єгипету

augment(fit) %>%
  features(.innov, ljung_box, lag = 10, dof = 4)
# A tibble: 1 × 4
  Country          .model         lb_stat lb_pvalue
  <fct>            <chr>            <dbl>     <dbl>
1 Egypt, Arab Rep. ARIMA(Exports)    5.78     0.448

Експорт Єгипету

fit %>% forecast(h=10) %>%
  autoplot(global_economy) +
  labs(y = "% of GDP", title = "Egyptian Exports")

Розуміння моделей ARIMA

  • Якщо \(c=0\) і \(d=0\), довгострокові прогнози будуть нульовими.

  • Якщо \(c=0\) і \(d=1\), довгострокові прогнози переходитимуть до ненульової константи.

  • Якщо \(c=0\) і \(d=2\), довгострокові прогнози будуть прямувати.

  • Якщо \(c\ne0\) і \(d=0\), довгострокові прогнози стосуватимуться середнього значення даних.

  • Якщо \(c\ne0\) і \(d=1\), довгострокові прогнози будуть прямувати.

  • Якщо \(c\ne0\) і \(d=2\), довгострокові прогнози будуть слідувати квадратичному тренду.

Оцінка та вибір порядку

Оцінка максимальної правдоподібності (MLE)

Визначивши порядок моделі, потрібно оцінити параметри \(c\), \(\phi_1,\dots,\phi_p\), \(\theta_1,\dots,\theta_q\).

  • MLE дуже схожий на оцінку найменших квадратів, отриману шляхом мінімізації \[ \sum_{t-1}^T e_t^2 \]
  • Функція ARIMA() дозволяє оцінювати CLS або MLE.
  • Нелінійна оптимізація повинна використовуватися в обох випадках.
  • Різне програмне забезпечення дає різні оцінки.

Часткові автокореляції

Часткові автокореляції вимірюють співвідношення між \(y_{t}\) і \(y_{t - k}\), коли вплив інших часових лагів — \(1, 2, 3, \dots, k - 1\) — видаляються.

\(\alpha_k\) - це \(k\)-ий частковий коефіцієнт автокореляції, який дорівнює оцінці \(\phi_k\) у регресії:

\[y_t = c + \phi_1 y_{t-1} + \phi_2 y_{t-2} + \dots + \phi_k y_{t-k} +\varepsilon_t\]

  • Різна кількість членів на RHS дає \(\alpha_k\) для різних значень \(k\).
  • \(\alpha_1=\rho_1\)
  • ті самі критичні значення \(\pm 1,96/\sqrt{T}\), що й для ACF.
  • Останній значущий \(\alpha_k\) вказує на порядок моделі AR.

Експорт Єгипету

egypt <- global_economy %>% filter(Code == "EGY")
egypt %>% ACF(Exports) %>% autoplot()
egypt %>% PACF(Exports) %>% autoplot()

Експорт Єгипету

global_economy %>% filter(Code == "EGY") %>%
  gg_tsdisplay(Exports, plot_type='partial')

Інтерпретація ACF і PACF

AR(1) \(\rho_k = \phi_1^k\) для \(k=1,2,\dots\)

\(\alpha_1 = \phi_1\) \(\alpha_k = 0\) для \(k=2,3,\dots\)

Отже, ми маємо модель AR(1), коли

  • автокореляції експоненціально спадають
  • є одна значуща часткова автокореляція.

Інтерпретація ACF і PACF

AR(\(p\))

  • ACF згасає експоненціально або згасає синусоїдально
  • PACF має всі нульові значення після \(p\)-го лагу

Отже, у нас є модель AR(\(p\)).

  • ACF є експоненціально спадаючою або синусоїдальною
  • існує значний сплеск на відставанні \(p\) в PACF, але не перевищує \(p\)

Інтерпретація ACF і PACF

MA(1)

\(\rho_1 = \theta_1/(1 + \theta_1^2)\) \(\rho_k = 0\) для \(k=2,3,\dots\)

\(\alpha_k = -(-\theta_1)^k/(1 + \theta_1^2 + \dots + \theta_1^{2k})\)

Отже, ми маємо модель MA(1), коли

  • PACF експоненціально спадає і
  • є один значний сплеск ACF

Інтерпретація ACF і PACF

MA(\(q\))

  • PACF згасає за експоненціальною чи затухаючою синусоїдальною формою
  • ACF має всі нульові сплески після \(q\)-го сплеску

Отже, ми маємо модель MA(\(q\)), коли

  • PACF є експоненціально спадаючим або синусоїдальним
  • існує значний сплеск на лаги \(q\) у ACF, але не перевищує \(q\)

Інформаційні критерії

Akaike’s Information Criterion (AIC):

\[\text{AIC} = -2 \log(L) + 2(p+q+k+1),\] де \(L\) — це ймовірність даних, \(k=1\), якщо \(c\ne0\), і \(k=0\), якщо \(c=0\).

Corrected AIC: \[\text{AICc} = \text{AIC} + \displaystyle\frac{2(p+q+k+1)(p+q+k+2)}{T-p-q-k-2}.\]

Bayesian Information Criterion: \[\text{BIC} = \text{AIC} + [\log(T)-2](p+q+k+1).\] Кращі моделі обирається шляхом мінімізації AIC, AICc або BIC.

Побудова ARIMA в R

Як працює ARIMA()?

Несезонний процес ARIMA

Необхідно вибрати відповідні замовлення: \(p, q, d\)

Алгоритм Хайндмана та Хандакара (JSS, 2008):

  • Виберіть \(d=0\) і\(D\) через тест KPSS і вимірювання сезонної сили.
  • Виберіть \(p,q\), мінімізувавши AICc.
  • Використовуйте покроковий пошук для проходження простору моделі.

Як працює ARIMA()?

Крок 1: Виберіть поточну модель (з найменшим AICc) із: ARIMA\((2,d,2)\), ARIMA\((0,d,0)\), ARIMA\((1,d,0)\), ARIMA\((0,d,1)\)

Крок 2: Розгляньте варіанти поточної моделі:

  • змінити один із \(p,q,\) від поточної моделі на \(\pm1\);
  • \(p,q\) обидва відрізняються від поточної моделі на \(\pm1\);
  • Включити/виключити \(c\) з поточної моделі.

Модель з найнижчим AICc стає поточною моделлю.

Повторюйте крок 2, доки не буде знайдено нижчий AICc.

Як працює ARIMA()?

Як працює ARIMA()?

Як працює ARIMA()?

Як працює ARIMA()?

Експорт Египту

global_economy %>% filter(Code == "EGY") %>%
  gg_tsdisplay(Exports, plot_type='partial')

Експорт Египту

fit1 <- global_economy %>%
  filter(Code == "EGY") %>%
  model(ARIMA(Exports ~ pdq(4,0,0)))
report(fit1)
Series: Exports 
Model: ARIMA(4,0,0) w/ mean 

Coefficients:
         ar1      ar2     ar3      ar4  constant
      0.9861  -0.1715  0.1807  -0.3283    6.6922
s.e.  0.1247   0.1865  0.1865   0.1273    0.3562

sigma^2 estimated as 7.885:  log likelihood=-140.53
AIC=293.05   AICc=294.7   BIC=305.41

Експорт Египту

fit2 <- global_economy %>%
  filter(Code == "EGY") %>%
  model(ARIMA(Exports))
report(fit2)
Series: Exports 
Model: ARIMA(2,0,1) w/ mean 

Coefficients:
         ar1      ar2      ma1  constant
      1.6764  -0.8034  -0.6896    2.5623
s.e.  0.1111   0.0928   0.1492    0.1161

sigma^2 estimated as 8.046:  log likelihood=-141.57
AIC=293.13   AICc=294.29   BIC=303.43

Експорт ЦАР

global_economy %>%
  filter(Code == "CAF") %>%
  autoplot(Exports) +
  labs(title="Central African Republic exports", y="% of GDP")

Експорт ЦАР

global_economy %>%
  filter(Code == "CAF") %>%
  gg_tsdisplay(difference(Exports), plot_type='partial')

Експорт ЦАР

caf_fit <- global_economy %>%
  filter(Code == "CAF") %>%
  model(arima210 = ARIMA(Exports ~ pdq(2,1,0)),
        arima013 = ARIMA(Exports ~ pdq(0,1,3)),
        stepwise = ARIMA(Exports),
        search = ARIMA(Exports, stepwise=FALSE))

Експорт ЦАР

caf_fit %>% pivot_longer(!Country, names_to = "Model name",
                         values_to = "Orders")
# A mable: 4 x 3
# Key:     Country, Model name [4]
  Country                  `Model name`         Orders
  <fct>                    <chr>               <model>
1 Central African Republic arima210     <ARIMA(2,1,0)>
2 Central African Republic arima013     <ARIMA(0,1,3)>
3 Central African Republic stepwise     <ARIMA(2,1,2)>
4 Central African Republic search       <ARIMA(3,1,0)>

Експорт ЦАР

glance(caf_fit) %>% arrange(AICc) %>% select(.model:BIC)
# A tibble: 4 × 6
  .model   sigma2 log_lik   AIC  AICc   BIC
  <chr>     <dbl>   <dbl> <dbl> <dbl> <dbl>
1 search     6.52   -133.  274.  275.  282.
2 arima210   6.71   -134.  275.  275.  281.
3 arima013   6.54   -133.  274.  275.  282.
4 stepwise   6.42   -132.  274.  275.  284.

Експорт ЦАР

caf_fit %>% select(search) %>% gg_tsresiduals()

Експорт ЦАР

augment(caf_fit) %>%
  filter(.model=='search') %>%
  features(.innov, ljung_box, lag = 10, dof = 3)
# A tibble: 1 × 4
  Country                  .model lb_stat lb_pvalue
  <fct>                    <chr>    <dbl>     <dbl>
1 Central African Republic search    5.75     0.569

Експорт ЦАР

caf_fit %>%
  forecast(h=5) %>%
  filter(.model=='search') %>%
  autoplot(global_economy)

Процедура моделювання за допомогою ARIMA()

  1. Побудуйте графік даних. Визначте будь-які незвичайні спостереження.
  2. Якщо необхідно, трансформуйте дані (використовуючи перетворення Бокса-Кокса), щоб стабілізувати дисперсію.
  3. Якщо дані нестаціонарні: візьміть перші різниці даних, поки дані не буде досягнуто стаціонарності.
  4. Вивчіть ACF/PACF: чи підходить модель AR(\(p\)) чи MA(\(q\))?
  5. Спробуйте обрану модель і використовуйте AICc, щоб знайти кращу модель.
  6. Перевірте залишки з вибраної вами моделі, побудувавши графік ACF залишків і виконавши тест на портманто для залишків. Якщо вони не схожі на білий шум, спробуйте модифіковану модель.
  7. Коли залишки виглядають як білий шум, розрахуйте прогнози.

Процедура автоматичного моделювання за допомогою ARIMA()

  1. Побудуйте графік даних. Визначте будь-які незвичайні спостереження.
  2. Якщо необхідно, трансформуйте дані (використовуючи перетворення Бокса-Кокса), щоб стабілізувати дисперсію.
  3. Використовуйте ARIMA для автоматичного вибору моделі.
  4. Перевірте залишки з вибраної вами моделі, побудувавши графік АКФ залишків і виконавши тест на портманто для залишків. Якщо вони не схожі на білий шум, спробуйте модифіковану модель.
  5. Коли залишки виглядають як білий шум, розрахуйте прогнози.

Процедура моделювання

Сезонні моделі ARIMA

Сезонні моделі ARIMA

ARIMA \(~\underbrace{(p, d, q)}\) \(\underbrace{(P, D, Q)_{m}}\)
\({\uparrow}\) \({\uparrow}\)
Несазонна частина Сезонна частина
моделі моделі

де \(m =\) кількість спостережень на рік.

Сезонні моделі ARIMA

Наприклад, модель ARIMA\((1, 1, 1)(1, 1, 1)_{4}\) (без константи)

\[y_{t} = (1 + \phi_{1})y_{t - 1} - \phi_1y_{t-2} + (1 + \Phi_{1})y_{t - 4}\\ \text{} - (1 + \phi_{1} + \Phi_{1} + \phi_{1}\Phi_{1})y_{t - 5} + (\phi_{1} + \phi_{1} \Phi_{1}) y_{t - 6} \\ \text{} - \Phi_{1} y_{t - 8} + (\Phi_{1} + \phi_{1} \Phi_{1}) y_{t - 9} - \phi_{1} \Phi_{1} y_{t - 10}\\ \text{} + \varepsilon_{t} + \theta_{1}\varepsilon_{t - 1} + \Theta_{1}\varepsilon_{t - 4} + \theta_{1}\Theta_{1}\varepsilon_{t - 5}.\]

Поширені моделі ARIMA

Бюро перепису населення США найчастіше використовує такі моделі:

  • ARIMA(0,1,1)(0,1,1)\(_m\) з перетворенням логарифму
  • ARIMA(0,1,2)(0,1,1)\(_m\) з перетворенням логарифму
  • ARIMA(2,1,0)(0,1,1)\(_m\) з перетворенням логарифму
  • ARIMA(0,2,2)(0,1,1)\(_m\) з перетворенням логарифму
  • ARIMA(2,1,2)(0,1,1)\(_m\) без перетворення

Сезонні моделі ARIMA

Сезонну частину моделі AR або MA можна буде побачити в сезонних лагах PACF і ACF.

ARIMA(0,0,0)(0,0,1)\(_{12}\) покаже:

  • стрибок на відставанні 12 у ACF, але жодних інших значних стрибків.

  • PACF демонструватиме експоненціальне загасання сезонних лагів; тобто на лагах 12, 24, 36…

ARIMA(0,0,0)(1,0,0)\(_{12}\) покаже:

  • експоненціальне спадання сезонних лагів АКФ

  • один значний сплеск на відставанні 12 у PACF.

Зайнятість у сфері дозвілля в США

leisure <- us_employment %>%
  filter(Title == "Leisure and Hospitality", year(Month) > 2000) %>%
  mutate(Employed = Employed/1000) %>%
  select(Month, Employed)
autoplot(leisure, Employed) +
  labs(title = "US employment: leisure & hospitality", y="People (millions)")

Зайнятість у сфері дозвілля в США

leisure %>%
  gg_tsdisplay(difference(Employed, 12), plot_type='partial', lag=36) +
  labs(title="Seasonally differenced", y="")

Зайнятість у сфері дозвілля в США

leisure %>%
  gg_tsdisplay(difference(Employed, 12) %>% difference(),
    plot_type='partial', lag=36) +
  labs(title = "Double differenced", y="")

Зайнятість у сфері дозвілля в США

fit <- leisure %>%
  model(
    arima012011 = ARIMA(Employed ~ pdq(0,1,2) + PDQ(0,1,1)),
    arima210011 = ARIMA(Employed ~ pdq(2,1,0) + PDQ(0,1,1)),
    auto = ARIMA(Employed, stepwise = FALSE, approx = FALSE)
  )
fit %>% pivot_longer(everything(), names_to = "Model name",
                     values_to = "Orders")
# A mable: 3 x 2
# Key:     Model name [3]
  `Model name`                    Orders
  <chr>                          <model>
1 arima012011  <ARIMA(0,1,2)(0,1,1)[12]>
2 arima210011  <ARIMA(2,1,0)(0,1,1)[12]>
3 auto         <ARIMA(2,1,0)(1,1,1)[12]>

Зайнятість у сфері дозвілля в США

glance(fit) %>% arrange(AICc) %>% select(.model:BIC)
# A tibble: 3 × 6
  .model       sigma2 log_lik   AIC  AICc   BIC
  <chr>         <dbl>   <dbl> <dbl> <dbl> <dbl>
1 auto        0.00142    395. -780. -780. -763.
2 arima210011 0.00145    392. -776. -776. -763.
3 arima012011 0.00146    391. -775. -775. -761.

Зайнятість у сфері дозвілля в США

fit %>% select(auto) %>% gg_tsresiduals(lag=36)

Зайнятість у сфері дозвілля в США

augment(fit) %>% features(.innov, ljung_box, lag=24, dof=4)
# A tibble: 3 × 3
  .model      lb_stat lb_pvalue
  <chr>         <dbl>     <dbl>
1 arima012011    22.4     0.320
2 arima210011    18.9     0.527
3 auto           16.6     0.680

Зайнятість у сфері дозвілля в США

forecast(fit, h=36) %>%
  filter(.model=='auto') %>%
  autoplot(leisure) +
  labs(title = "US employment: leisure and hospitality", y="Number of people (millions)")

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

h02 <- PBS %>%
  filter(ATC2 == "H02") %>%
  summarise(Cost = sum(Cost)/1e6)

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

h02 %>% autoplot(
  Cost
)

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

h02 %>% autoplot(
  log(Cost)
)

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

h02 %>% autoplot(
  log(Cost) %>% difference(12)
)

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

h02 %>% gg_tsdisplay(difference(log(Cost),12),
                 lag_max = 36, plot_type = 'partial')

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

  • Виберіть \(D=1\) і \(d=0\).
  • Підйоми PACF на лагах 12 і 24 вказують на сезонний термін AR(2).
  • Підйоми PACF вказують на можливу несезонну AR(3).
  • Початкова модель кандидата: ARIMA(3,0,0)(2,1,0)\(_{12}\).

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

.model AICc
ARIMA(3,0,1)(0,1,2)[12] -485.48
ARIMA(3,0,1)(1,1,1)[12] -484.25
ARIMA(3,0,1)(0,1,1)[12] -483.67
ARIMA(3,0,1)(2,1,0)[12] -476.31
ARIMA(3,0,0)(2,1,0)[12] -475.12
ARIMA(3,0,2)(2,1,0)[12] -474.88
ARIMA(3,0,1)(1,1,0)[12] -463.40

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

fit <- h02 %>%
  model(best = ARIMA(log(Cost) ~ 0 + pdq(3,0,1) + PDQ(0,1,2)))
report(fit)
Series: Cost 
Model: ARIMA(3,0,1)(0,1,2)[12] 
Transformation: log(Cost) 

Coefficients:
          ar1     ar2     ar3     ma1     sma1     sma2
      -0.1603  0.5481  0.5678  0.3827  -0.5222  -0.1768
s.e.   0.1636  0.0878  0.0942  0.1895   0.0861   0.0872

sigma^2 estimated as 0.004278:  log likelihood=250.04
AIC=-486.08   AICc=-485.48   BIC=-463.28

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

gg_tsresiduals(fit)

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

augment(fit) %>%
  features(.innov, ljung_box, lag = 36, dof = 6)
# A tibble: 1 × 3
  .model lb_stat lb_pvalue
  <chr>    <dbl>     <dbl>
1 best      50.7    0.0104

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

fit <- h02 %>% model(auto = ARIMA(log(Cost)))
report(fit)
Series: Cost 
Model: ARIMA(2,1,0)(0,1,1)[12] 
Transformation: log(Cost) 

Coefficients:
          ar1      ar2     sma1
      -0.8491  -0.4207  -0.6401
s.e.   0.0712   0.0714   0.0694

sigma^2 estimated as 0.004387:  log likelihood=245.39
AIC=-482.78   AICc=-482.56   BIC=-469.77

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

gg_tsresiduals(fit)

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

augment(fit) %>%
  features(.innov, ljung_box, lag = 36, dof = 3)
# A tibble: 1 × 3
  .model lb_stat lb_pvalue
  <chr>    <dbl>     <dbl>
1 auto      59.3   0.00332

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

fit <- h02 %>%
  model(best = ARIMA(log(Cost), stepwise = FALSE,
                 approximation = FALSE,
                 order_constraint = p + q + P + Q <= 9))
report(fit)
Series: Cost 
Model: ARIMA(4,1,1)(2,1,2)[12] 
Transformation: log(Cost) 

Coefficients:
          ar1     ar2     ar3      ar4      ma1    sar1     sar2     sma1
      -0.0425  0.2098  0.2017  -0.2273  -0.7424  0.6213  -0.3832  -1.2019
s.e.   0.2167  0.1813  0.1144   0.0810   0.2074  0.2421   0.1185   0.2491
        sma2
      0.4959
s.e.  0.2135

sigma^2 estimated as 0.004049:  log likelihood=254.31
AIC=-488.63   AICc=-487.4   BIC=-456.1

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

gg_tsresiduals(fit)

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

augment(fit) %>%
  features(.innov, ljung_box, lag = 36, dof = 9)
# A tibble: 1 × 3
  .model lb_stat lb_pvalue
  <chr>    <dbl>     <dbl>
1 best      36.5     0.106

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

Training data: July 1991 to June 2006

Test data: July 2006–June 2008

fit <- h02 %>%
  filter_index(~ "2006 Jun") %>%
  model(
    ARIMA(log(Cost) ~ 0 + pdq(3, 0, 0) + PDQ(2, 1, 0)),
    ARIMA(log(Cost) ~ 0 + pdq(3, 0, 1) + PDQ(2, 1, 0)),
    ARIMA(log(Cost) ~ 0 + pdq(3, 0, 2) + PDQ(2, 1, 0)),
    ARIMA(log(Cost) ~ 0 + pdq(3, 0, 1) + PDQ(1, 1, 0))
    # ... #
  )

fit %>%
  forecast(h = "2 years") %>%
  accuracy(h02)

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

.model RMSE
ARIMA(3,0,1)(1,1,1)[12] 0.0619
ARIMA(3,0,1)(0,1,2)[12] 0.0621
ARIMA(3,0,1)(0,1,1)[12] 0.0630
ARIMA(2,1,0)(0,1,1)[12] 0.0630
ARIMA(4,1,1)(2,1,2)[12] 0.0631
ARIMA(3,0,2)(2,1,0)[12] 0.0651
ARIMA(3,0,1)(2,1,0)[12] 0.0653
ARIMA(3,0,1)(1,1,0)[12] 0.0666
ARIMA(3,0,0)(2,1,0)[12] 0.0668

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

  • Моделі з найнижчими значеннями AICc зазвичай дають трохи кращі результати, ніж інші моделі.
  • Порівняння AICc повинні мати однаковий порядок відмінностей. Але порівняння набору тестів RMSE може включати будь-які моделі.
  • Використовуйте найкращу доступну модель, навіть якщо вона не пройшла всі тести.

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

fit <- h02 %>%
  model(ARIMA(Cost ~ 0 + pdq(3,0,1) + PDQ(0,1,2)))
fit %>% forecast %>% autoplot(h02) +
  labs(y = "H02 Expenditure ($AUD)")

ARIMA vs ETS

ARIMA vs ETS

  • Міф про те, що моделі ARIMA є більш загальними, ніж експоненціальне згладжування.
    • Моделі лінійного експоненціального згладжування, усі окремі випадки моделей ARIMA.
    • Моделі нелінійного експоненційного згладжування не мають аналогів ARIMA.
    • Багато моделей ARIMA не мають аналогів експоненціального згладжування.
    • Моделі ETS всі нестаціонарні. Моделі з сезонністю або незатухаючим трендом (або обома) мають два одиничних кореня; всі інші моделі мають одну одиницю корінь.

ARIMA vs ETS

Еквівалентності

ETS model ARIMA model Parameters
ETS(A,N,N) ARIMA(0,1,1) \(\theta_1 = \alpha-1\)
ETS(A,A,N) ARIMA(0,2,2) \(\theta_1 = \alpha+\beta-2\)
\(\theta_2 = 1-\alpha\)
ETS(A,A,N) ARIMA(1,1,2) \(\phi_1=\phi\)
\(\theta_1 = \alpha+\phi\beta-1-\phi\)
\(\theta_2 = (1-\alpha)\phi\)
ETS(A,N,A) ARIMA(0,0,\(m\))(0,1,0)\(_m\)
ETS(A,A,A) ARIMA(0,1,\(m+1\))(0,1,0)\(_m\)
ETS(A,A,A) ARIMA(1,0,\(m+1\))(0,1,0)\(_m\)

Приклад: населення Австралії

aus_economy <- global_economy %>% filter(Code == "AUS") %>%
  mutate(Population = Population/1e6)
aus_economy %>%
  slice(-n()) %>%
  stretch_tsibble(.init = 10) %>%
  model(ets = ETS(Population),
        arima = ARIMA(Population)
  ) %>%
  forecast(h = 1) %>%
  accuracy(aus_economy) %>%
  select(.model, ME:RMSSE)
# A tibble: 2 × 8
  .model     ME   RMSE    MAE   MPE  MAPE  MASE RMSSE
  <chr>   <dbl>  <dbl>  <dbl> <dbl> <dbl> <dbl> <dbl>
1 arima  0.0420 0.194  0.0789 0.277 0.509 0.317 0.746
2 ets    0.0202 0.0774 0.0543 0.112 0.327 0.218 0.298

Приклад: населення Австралії

aus_economy %>%
  model(ETS(Population)) %>%
  forecast(h = "5 years") %>%
  autoplot(aus_economy) +
  labs(title = "Australian population",  y = "People (millions)")

Приклад: виробництво цементу

cement <- aus_production %>%
  select(Cement) %>%
  filter_index("1988 Q1" ~ .)
train <- cement %>% filter_index(. ~ "2007 Q4")
fit <- train %>%
  model(
    arima = ARIMA(Cement),
    ets = ETS(Cement)
  )

Приклад: виробництво цементу

fit %>%
  select(arima) %>%
  report()
Series: Cement 
Model: ARIMA(1,0,1)(2,1,1)[4] w/ drift 

Coefficients:
         ar1      ma1   sar1     sar2     sma1  constant
      0.8886  -0.2366  0.081  -0.2345  -0.8979    5.3884
s.e.  0.0842   0.1334  0.157   0.1392   0.1780    1.4844

sigma^2 estimated as 11456:  log likelihood=-463.52
AIC=941.03   AICc=942.68   BIC=957.35

Приклад: виробництво цементу

fit %>% select(ets) %>% report()
Series: Cement 
Model: ETS(M,N,M) 
  Smoothing parameters:
    alpha = 0.7533714 
    gamma = 0.0001000093 

  Initial states:
     l[0]     s[0]    s[-1]    s[-2]     s[-3]
 1694.712 1.031179 1.045209 1.011424 0.9121874

  sigma^2:  0.0034

     AIC     AICc      BIC 
1104.095 1105.650 1120.769 

Приклад: виробництво цементу

gg_tsresiduals(fit %>% select(arima), lag_max = 16)

Приклад: виробництво цементу

gg_tsresiduals(fit %>% select(ets), lag_max = 16)

Приклад: виробництво цементу

fit %>%
  select(arima) %>%
  augment() %>%
  features(.innov, ljung_box, lag = 16, dof = 6)
# A tibble: 1 × 3
  .model lb_stat lb_pvalue
  <chr>    <dbl>     <dbl>
1 arima     6.37     0.783

Приклад: виробництво цементу

fit %>%
  select(ets) %>%
  augment() %>%
  features(.innov, ljung_box, lag = 16, dof = 6)
# A tibble: 1 × 3
  .model lb_stat lb_pvalue
  <chr>    <dbl>     <dbl>
1 ets       10.0     0.438

Приклад: виробництво цементу

fit %>%
  forecast(h = "2 years 6 months") %>%
  accuracy(cement) %>%
  select(-ME, -MPE, -ACF1)
# A tibble: 2 × 7
  .model .type  RMSE   MAE  MAPE  MASE RMSSE
  <chr>  <chr> <dbl> <dbl> <dbl> <dbl> <dbl>
1 arima  Test   216.  186.  8.68  1.27  1.26
2 ets    Test   222.  191.  8.85  1.30  1.29

Приклад: виробництво цементу

fit %>%
  select(arima) %>%
  forecast(h="3 years") %>%
  autoplot(cement) +
  labs(title = "Cement production in Australia", y="Tonnes ('000)")

Дякую за увагу!



ihor.miroshnychenko@kneu.ua

aranaur.rbind.io

@aranaur

@ihormiroshnychenko

Data Mirosh