options(digits = 3) # Количество значащих цифр при выводе
library(tidyverse) # визуализация и трансформация данных
library(forecast) # анализ временных рядов и прогнозирование
library(fpp) # Примеры временных рядов
library(sophisthse) # Загрузка временных рядов из базы Sophist
Методы экспоненциального сглаживания начиная с середины XX века широко применяются для анализа временных рядов и прогнозирования в технике и управлении. Применение методов экспоненциального сглаживания для прогнозирования включает два этапа: сначала на основе имеющихся данных получают оценки для закономерных компонентов ряда - уровня, тренда (скорости роста) и сезонных коэффициентов. Затем, комбинируя наиболее свежие оценки закономерных компонентов ряда, строится прогноз на будущее.
Оценки закономерных компонентов при получении новых данных корректируются с использованием ошибки прогноза на текущем шаге и константы сглаживания, которая задает долю от величины ошибки, которая будет использоваться для корректировки прогноза. На рисунке показана схема работы метода простого экспоненциального сглаживания.
Схема метода простого экспоненциального сглаживания
Сглаженное значение на шаге \(t\) определяется по формуле:
\[ L_t = L_{t-1} + \alpha (y_t - L_{t-1}) = L_{t-1} + \alpha e_t \]
Своим названием методы обязаны тому, что при развертывании рекуррентной формулы, приведенной выше, прошлые наблюдения получают экспоненциально затухающие веса:
\[ L_t = L_{t-1} + \alpha (y_t - L_{t-1}) = \alpha y_t + L_{t-1} (1 - \alpha) = \\ \alpha y_t + \alpha (1 - \alpha) y_{t-1} + (1 - \alpha)^2 L_{t-2} = \\ \alpha y_t + \alpha (1 - \alpha) y_{t-1} + \alpha (1 - \alpha)^2 y_{t-2} + (1 - \alpha)^3 L_{t-3} \]
Поскольку \(\alpha < 1\), наиболее свежие наблюдения получают большие веса, чем более давние наблюдения.
# Значение константы сглаживания
a <- 0.5
# Коэффициенты
i <- 0:9
coefs <- a * (1 - a)^i
# Визуализация
ggplot(tibble(x = factor(i), y = coefs)) +
geom_bar(aes(x, y), stat = 'identity', fill = 'lightskyblue', width = 0.25) +
labs(title = paste('Веса прошлых наблюдений при alpha = ', a),
x = 'Лаг', y = 'Вес наблюдения')
Методы экспоненциального сглаживания позволяют быстро получать прогнозы для широкого спектра временных рядов и способны адаптироваться к изменению закономерных компонентов ряда. Это сделало их одним из наиболее популярных и успешных подходов при разработке инструментов автоматизированного прогнозирования.
В этом блокноте будут рассмотрены классические методы экспоненциального сглаживания - простое экспоненциальное сглаживание, метод Хольта и метод Винтерса.
Материал составлен на основе 7 главы книги: Hyndman R, Athanasopoulos G. Forecasting Principles and Practice, 2nd Edition.
Метод простого экспоненциального сглаживания (simple exponential smoothing, SES) позволяет выделить лишь среднее значение временного ряда - уровень (Level). Для получения этого компонента используется формула:
\[ L_t = y_t \cdot \alpha + L_{t-1} \cdot (1 - \alpha), \]
где \(\alpha \in [0, 1]\) - константа сглаживания, которая определяет скорость реакции уровня ряда \(L\) на изменения в наблюдаемых значениях \(y\). Чем больше \(\alpha\), тем быстрее уровень реагирует на изменения и тем меньше сглаживание.
При \(\alpha = 0\) обновление уровня не происходит при изменении \(y\), сохраняется начальное значение уровня - \(L_1\).
Первоначальное значение уровня - \(L_1\) необходимо задать (инициализировать).
При прогнозировании в методе простого экспоненциального сглаживания применяется наивный подход, предполагающий, что все последующие наблюдения будут такими же, как и последнее значение уровня:
\[ \hat{y}_{T+h} = L_{T} =const \]
По этой причине простое экспоненциальное сглаживание может применяться для прогнозирования только временных рядов, в которых нет выраженного тренда или сезонности, либо рядов, из которых эти компоненты были удалены.
Рассмотрим работу метода на примере ежемесячных продаж новых частных домов в США (см.?hsales). Метод реализован функцией forecast::ses() (см. ?ses)
hs90 <- window(hsales, start = 1990)
hs90_label <- 'Ежемесячные продажи новых частных домов в США'
# Прогноз на 24 месяца
hs90_fit <- ses(hs90, h = 24)
# Константа сглаживания и начальное значение уровня подбираются автоматически по критерию минимизации суммы квадратов ошибок прогноза на 1 шаг
# Сводка по модели
summary(hs90_fit)
##
## Forecast method: Simple exponential smoothing
##
## Model Information:
## Simple exponential smoothing
##
## Call:
## ses(y = hs90, h = 24)
##
## Smoothing parameters:
## alpha = 0.9999
##
## Initial states:
## l = 45.0025
##
## sigma: 5.9
##
## AIC AICc BIC
## 559 559 565
##
## Error measures:
## ME RMSE MAE MPE MAPE MASE ACF1
## Training set -0.0141 5.82 4.38 -0.708 8.79 0.673 0.0393
##
## Forecasts:
## Point Forecast Lo 80 Hi 80 Lo 95 Hi 95
## Dec 1995 44 36.44 51.6 32.439 55.6
## Jan 1996 44 33.31 54.7 27.651 60.4
## Feb 1996 44 30.91 57.1 23.977 64.0
## Mar 1996 44 28.88 59.1 20.879 67.1
## Apr 1996 44 27.10 60.9 18.150 69.9
## May 1996 44 25.48 62.5 15.683 72.3
## Jun 1996 44 24.00 64.0 13.414 74.6
## Jul 1996 44 22.62 65.4 11.302 76.7
## Aug 1996 44 21.32 66.7 9.319 78.7
## Sep 1996 44 20.10 67.9 7.443 80.6
## Oct 1996 44 18.93 69.1 5.659 82.3
## Nov 1996 44 17.82 70.2 3.954 84.0
## Dec 1996 44 16.75 71.3 2.319 85.7
## Jan 1997 44 15.72 72.3 0.745 87.3
## Feb 1997 44 14.72 73.3 -0.773 88.8
## Mar 1997 44 13.76 74.2 -2.241 90.2
## Apr 1997 44 12.83 75.2 -3.665 91.7
## May 1997 44 11.93 76.1 -5.046 93.0
## Jun 1997 44 11.05 77.0 -6.390 94.4
## Jul 1997 44 10.20 77.8 -7.700 95.7
## Aug 1997 44 9.36 78.6 -8.976 97.0
## Sep 1997 44 8.55 79.5 -10.223 98.2
## Oct 1997 44 7.75 80.3 -11.442 99.4
## Nov 1997 44 6.97 81.0 -12.634 100.6
# График прогноза
autoplot(hs90_fit) +
labs(title = hs90_label,
fill = 'Доверительный\nинтервал',
x = NULL, y = NULL)
# Структура объекта, возвращаемого функцией ses():
names(hs90_fit)
## [1] "model" "mean" "level" "x" "upper"
## [6] "lower" "fitted" "method" "series" "residuals"
Полезные имена компонентов:
- fitted - прогноз на 1 шаг в историческом периоде (можно извлечь функцией fitted());
- mean - прогноз на будущее (ожидаемое значение);
- lower/upper - границы доверительного интервала;
- model$states - компоненты ряда в историческом периоде (в методе простого экспоненциального сглаживания - только уровень);
- model$par - параметры модели.
Для аннотирования графиков полезно выделить значения параметров модели:
# Как добраться до параметров
hs90_fit$model$par
## alpha l
## 1 45
Выделим автоматически подобранное значение константы сглаживания \(\alpha\) :
hs90_alpha <- hs90_fit$model$par['alpha']
hs90_alpha
## alpha
## 1
Полученное значение константы сглаживания близко к 1, следовательно сглаживания исходных данных при оценке уровня ряда практически не происходит. На графике уровень ряда, оцененный по модели экспоненциального сглаживания совпадает с историческими значениями.
autoplot(hs90, series = 'Факт') +
autolayer(hs90_fit$model$states, series = 'Уровень') +
autolayer(hs90_fit, PI = FALSE, series = 'Прогноз') +
annotate(geom = 'text', x = 1997, y = 30,
label = paste('alpha =', round(hs90_alpha, 4))) +
labs(title = hs90_label,
color = NULL,
x = NULL, y = NULL)
Рассмотрим, как влияет константа сглаживания на результат.
fit1 <- ses(hs90, alpha = 0.1, h = 24)
fit2 <- ses(hs90, alpha = 0.4, h = 24)
autoplot(hs90, series = 'Факт') +
autolayer(fit1$model$states, series = 'Уровень, a = 0.2') +
autolayer(fit2$model$states, series = 'Уровень, a = 0.4') +
autolayer(fit1, PI = FALSE, series = 'Прогноз, a = 0.2') +
autolayer(fit2, PI = FALSE, series = 'Прогноз, a = 0.4') +
labs(title = hs90_label,
color = NULL,
x = NULL, y = NULL) +
scale_color_manual(values = c('dodgerblue', 'darkgreen',
'lightskyblue', 'green', 'darkgray'))
В методе Хольта с помощью экспоненциального сглаживания выделяются два закономерных компонента ряда - уровень (Level) и скорость роста (Trend):
\[ L_t = y_t \cdot \alpha + (L_{t-1} + b_{t-1})\cdot (1-\alpha) \]
\[ b_t = (L_t - L_{t-1}) \cdot \beta + b_{t-1} \cdot (1-\beta) \]
Для прогнозирования используются последние значения уровня и тренда, т.е. скорости роста ряда:
\[ \hat{y}_{T+h} = L_{T} + h \cdot b_T \]
В R метод Хольта реализован функцией forecast::holt().
# Прогноз на 24 месяца
hs90_holt <- holt(hs90, h = 24)
# Константы сглаживания и начальное значение уровня и тренда подбираются автоматически
# Сводка по модели
summary(hs90_holt)
##
## Forecast method: Holt's method
##
## Model Information:
## Holt's method
##
## Call:
## holt(y = hs90, h = 24)
##
## Smoothing parameters:
## alpha = 0.9999
## beta = 1e-04
##
## Initial states:
## l = 53.3587
## b = 0.2442
##
## sigma: 6.08
##
## AIC AICc BIC
## 565 566 576
##
## Error measures:
## ME RMSE MAE MPE MAPE MASE ACF1
## Training set -0.375 5.91 4.56 -1.47 9.19 0.7 0.0217
##
## Forecasts:
## Point Forecast Lo 80 Hi 80 Lo 95 Hi 95
## Dec 1995 44.2 36.4 52.0 32.318 56.2
## Jan 1996 44.5 33.5 55.5 27.621 61.3
## Feb 1996 44.7 31.2 58.2 24.072 65.4
## Mar 1996 45.0 29.4 60.6 21.117 68.8
## Apr 1996 45.2 27.8 62.6 18.542 71.9
## May 1996 45.5 26.3 64.6 16.237 74.7
## Jun 1996 45.7 25.1 66.3 14.137 77.2
## Jul 1996 45.9 23.9 68.0 12.198 79.7
## Aug 1996 46.2 22.8 69.6 10.391 82.0
## Sep 1996 46.4 21.8 71.1 8.696 84.1
## Oct 1996 46.7 20.8 72.5 7.094 86.2
## Nov 1996 46.9 19.9 73.9 5.574 88.2
## Dec 1996 47.1 19.0 75.3 4.126 90.2
## Jan 1997 47.4 18.2 76.6 2.742 92.0
## Feb 1997 47.6 17.4 77.8 1.414 93.8
## Mar 1997 47.9 16.7 79.1 0.138 95.6
## Apr 1997 48.1 15.9 80.3 -1.092 97.3
## May 1997 48.3 15.2 81.5 -2.279 99.0
## Jun 1997 48.6 14.6 82.6 -3.428 100.6
## Jul 1997 48.8 13.9 83.7 -4.540 102.2
## Aug 1997 49.1 13.3 84.8 -5.619 103.8
## Sep 1997 49.3 12.7 85.9 -6.668 105.3
## Oct 1997 49.6 12.1 87.0 -7.687 106.8
## Nov 1997 49.8 11.6 88.0 -8.680 108.3
# График прогноза
autoplot(hs90_holt) +
labs(title = hs90_label,
fill = 'Доверительный\nинтервал',
x = NULL, y = NULL)
Из сводки по модели видно, что константы сглаживания для тренда и имеют близкие к предельным значения (1 и 0 соответственно). Такая модель практически не сглаживает случайные колебания ряда, и не обновляет тренд при поступлении новых данных.
При необходимости, параметры можно извлечь из модели в виде вектора:
hs90_holt$model$par %>%
round(5)
## alpha beta l b
## 0.9999 0.0001 53.3586 0.2442
autoplot(hs90, series = 'Факт') +
autolayer(hs90_holt$model$states[,'l'], series = 'Уровень') +
autolayer(hs90_holt, PI = FALSE, series = 'Прогноз') +
labs(title = hs90_label,
color = NULL,
x = NULL, y = NULL)
cbind('Ряд' = hs90,
'Уровень' = hs90_holt$model$states[, 'l'],
'Тренд' = hs90_holt$model$states[, 'b']) %>%
autoplot(facets = T) +
labs(title = hs90_label, y = NULL, x = NULL, color = 'Обозначения')
Вспомним, что автоматический подбор параметр основан на сравнении прогноза в историческом периоде и факта и минимизации ошибки подгонки модели. Но модель, которая хорошо объясняет прошлое - не обязательно хорошо предсказывает будущее.
В данном случае очевидно, что компоненты модели плохо адаптируются к данным из-за неудачно подобранных констант. Зададим константы вручную.
# Прогноз на 24 месяца
hs90_holt_man <- holt(hs90, alpha = 0.2, beta = 0.05, h = 24)
# Начальное значение уровня и тренда подбираются автоматически, константы заданы вручную
# Компоненты ряда
autoplot(cbind('Ряд' = hs90,
'Уровень' = hs90_holt_man$model$states[, 'l'],
'Тренд' = hs90_holt_man$model$states[, 'b']),
facets = T) +
labs(title = hs90_label, y = NULL, x = NULL, color = 'Обозначения')
# Прогноз
autoplot(hs90, series = 'Факт') +
autolayer(hs90_holt_man$model$states[,'l'], series = 'Уровень') +
autolayer(hs90_holt_man, PI = FALSE, series = 'Прогноз') +
labs(title = hs90_label,
color = NULL, x = NULL, y = NULL)
Метод Винтерса позволяет учитывать как скорость изменения ряда, так и сезонность. Существует две модификации метода Винтерса, которые отличаются подходом к учету сезонности: мультипликативная и аддитивная модели.
В мультипликативной модели Винтерса компоненты выделяются по формулам:
\[ L_t = \left( \frac{y_t}{S_{t-m}} \right) \cdot \alpha + (L_{t-1} + b_{t-1})\cdot (1-\alpha) \]
\[ b_t = (L_t - L_{t-1}) \cdot \beta + b_{t-1} \cdot (1-\beta) \]
\[ S_t = \frac{y_t} {L_t} \cdot \gamma + S_{t-m} \cdot (1-\gamma) \] Здесь \(m\) - длина сезонного цикла.
Для прогнозирования используется уравнение:
\[ \hat{y}_{T+h} = (L_{T} + h \cdot b_T) \cdot S_{T-m+h} \]
В R мультипликативная модель Винтерса реализуется функцией forecast::hw() с параметром seasonal = 'multiplicative').
# Прогноз на 24 месяца
hs90_winters_m <- hw(hs90, h = 24, seasonal = 'multiplicative')
# Константы сглаживания и начальное значение уровня и тренда подбираются автоматически
# Сводка по модели
summary(hs90_winters_m)
##
## Forecast method: Holt-Winters' multiplicative method
##
## Model Information:
## Holt-Winters' multiplicative method
##
## Call:
## hw(y = hs90, h = 24, seasonal = "multiplicative")
##
## Smoothing parameters:
## alpha = 0.4136
## beta = 1e-04
## gamma = 1e-04
##
## Initial states:
## l = 46.1231
## b = 0.029
## s = 0.802 0.834 0.946 0.938 1.07 1.02
## 1.07 1.11 1.12 1.2 1.01 0.88
##
## sigma: 0.0879
##
## AIC AICc BIC
## 528 539 566
##
## Error measures:
## ME RMSE MAE MPE MAPE MASE ACF1
## Training set 0.297 3.8 2.99 0.043 6.06 0.459 0.274
##
## Forecasts:
## Point Forecast Lo 80 Hi 80 Lo 95 Hi 95
## Dec 1995 44.9 39.8 50.0 37.2 52.6
## Jan 1996 49.3 43.3 55.3 40.1 58.4
## Feb 1996 56.4 49.1 63.8 45.2 67.7
## Mar 1996 67.2 57.9 76.6 53.0 81.5
## Apr 1996 63.0 53.8 72.3 48.9 77.2
## May 1996 62.3 52.7 71.9 47.7 76.9
## Jun 1996 60.0 50.3 69.6 45.2 74.7
## Jul 1996 57.4 47.8 67.0 42.7 72.1
## Aug 1996 59.9 49.5 70.3 44.0 75.9
## Sep 1996 52.8 43.3 62.3 38.2 67.3
## Oct 1996 53.2 43.3 63.1 38.1 68.4
## Nov 1996 47.0 37.9 56.0 33.2 60.7
## Dec 1996 45.2 36.3 54.1 31.5 58.9
## Jan 1997 49.6 39.5 59.7 34.2 65.0
## Feb 1997 56.8 45.0 68.7 38.7 74.9
## Mar 1997 67.7 53.2 82.2 45.6 89.8
## Apr 1997 63.5 49.6 77.4 42.2 84.7
## May 1997 62.7 48.7 76.8 41.2 84.2
## Jun 1997 60.4 46.6 74.2 39.2 81.5
## Jul 1997 57.8 44.3 71.3 37.2 78.4
## Aug 1997 60.3 46.0 74.7 38.3 82.3
## Sep 1997 53.1 40.2 66.0 33.4 72.8
## Oct 1997 53.6 40.3 66.8 33.3 73.9
## Nov 1997 47.3 35.4 59.2 29.1 65.5
# График прогноза
autoplot(hs90_winters_m) +
labs(title = hs90_label,
fill = 'Доверительный\nинтервал',
x = NULL, y = NULL)
Коэффициенты модели:
hs90_winters_m$model$par %>% round(3)
## alpha beta gamma l b s0 s1 s2 s3 s4
## 0.414 0.000 0.000 46.123 0.029 0.803 0.834 0.946 0.938 1.066
## s5 s6 s7 s8 s9 s10
## 1.022 1.068 1.110 1.124 1.200 1.008
Компоненты ряда:
autoplot(cbind('Ряд' = hs90,
'Уровень' = hs90_winters_m$model$states[, 'l'],
'Тренд' = hs90_winters_m$model$states[, 'b'],
'Сезонность' = hs90_winters_m$model$states[, 's1']),
facets = T) +
labs(title = hs90_label, y = NULL, x = NULL, color = 'Обозначения')
В аддитивной модели Винтерса компоненты выделяются по формулам:
\[ L_t = ( y_t - S_{t-m} ) \cdot \alpha + (L_{t-1} + b_{t-1})\cdot (1-\alpha) \]
\[ b_t = (L_t - L_{t-1}) \cdot \beta + b_{t-1} \cdot (1-\beta) \]
\[ S_t = (y_t - L_t) \cdot \gamma + S_{t-m} \cdot (1-\gamma) \]
Для прогнозирования используется уравнение:
\[ \hat{y}_{T+h} = (L_{T} + h \cdot b_T) + S_{T-m+h} \]
В R аддитивная модель Винтерса реализуется функцией forecast::hw() с параметром seasonal = 'additive').
# Прогноз на 24 месяца
hs90_winters_a <- hw(hs90, h = 24, seasonal = 'additive')
# Константы сглаживания и начальное значение уровня и тренда подбираются автоматически
# Сводка по модели
summary(hs90_winters_a)
##
## Forecast method: Holt-Winters' additive method
##
## Model Information:
## Holt-Winters' additive method
##
## Call:
## hw(y = hs90, h = 24, seasonal = "additive")
##
## Smoothing parameters:
## alpha = 0.6811
## beta = 1e-04
## gamma = 1e-04
##
## Initial states:
## l = 46.9118
## b = 0.0845
## s = -9.83 -6.94 -1.13 -1.76 3.73 0.268
## 2.54 5.03 6.05 8.89 0.0506 -6.9
##
## sigma: 4.24
##
## AIC AICc BIC
## 524 535 562
##
## Error measures:
## ME RMSE MAE MPE MAPE MASE ACF1
## Training set -0.00667 3.73 3.06 -0.365 6.13 0.471 0.0753
##
## Forecasts:
## Point Forecast Lo 80 Hi 80 Lo 95 Hi 95
## Dec 1995 42.8 37.4 48.3 34.5 51.2
## Jan 1996 45.9 39.3 52.4 35.8 55.9
## Feb 1996 52.9 45.4 60.4 41.4 64.4
## Mar 1996 61.8 53.4 70.2 49.0 74.7
## Apr 1996 59.1 49.9 68.3 45.0 73.1
## May 1996 58.1 48.2 68.0 43.0 73.3
## Jun 1996 55.7 45.1 66.3 39.5 71.9
## Jul 1996 53.5 42.3 64.7 36.4 70.7
## Aug 1996 57.1 45.3 68.9 39.0 75.1
## Sep 1996 51.7 39.3 64.0 32.8 70.6
## Oct 1996 52.4 39.5 65.3 32.6 72.2
## Nov 1996 46.7 33.2 60.1 26.1 67.2
## Dec 1996 43.9 29.9 57.8 22.5 65.2
## Jan 1997 46.9 32.4 61.3 24.8 68.9
## Feb 1997 53.9 39.0 68.8 31.1 76.7
## Mar 1997 62.8 47.5 78.2 39.4 86.3
## Apr 1997 60.1 44.3 75.9 35.9 84.2
## May 1997 59.1 42.9 75.4 34.3 84.0
## Jun 1997 56.7 40.1 73.4 31.3 82.2
## Jul 1997 54.6 37.5 71.6 28.5 80.6
## Aug 1997 58.1 40.6 75.5 31.4 84.8
## Sep 1997 52.7 34.8 70.5 25.4 80.0
## Oct 1997 53.4 35.2 71.6 25.5 81.3
## Nov 1997 47.7 29.1 66.3 19.2 76.1
# График прогноза
autoplot(hs90_winters_a) +
labs(title = hs90_label,
fill = 'Доверительный\nинтервал',
x = NULL, y = NULL)
Коэффициенты модели:
hs90_winters_a$model$par %>% round(3)
## alpha beta gamma l b s0 s1 s2 s3 s4
## 0.681 0.000 0.000 46.912 0.084 -9.829 -6.938 -1.125 -1.764 3.730
## s5 s6 s7 s8 s9 s10
## 0.268 2.539 5.029 6.051 8.891 0.051
Компоненты ряда:
autoplot(cbind('Ряд' = hs90,
'Уровень' = hs90_winters_a$model$states[, 'l'],
'Тренд' = hs90_winters_a$model$states[, 'b'],
'Сезонность' = hs90_winters_a$model$states[, 's1']),
facets = T) +
labs(title = hs90_label, y = NULL, x = NULL, color = 'Обозначения')
autoplot(hs90, series = 'Факт') +
autolayer(fitted(hs90_winters_m), series = 'Подгонка, мульт.') +
autolayer(fitted(hs90_winters_a), series = 'Подгонка, адд.') +
autolayer(hs90_winters_m$mean, series = 'Прогноз, мульт.') +
autolayer(hs90_winters_a$mean, series = 'Прогноз, адд.') +
labs(title = hs90_label, color = NULL,
x = NULL, y = NULL) +
scale_color_manual(values = c('dodgerblue', 'darkgreen',
'lightskyblue', 'green', 'darkgray'))
# Мультипликативная модель
hs90_winters_m$model$par[1:3] %>% round(4)
## alpha beta gamma
## 0.4136 0.0001 0.0001
# Аддитивная модель
hs90_winters_a$model$par[1:3] %>% round(4)
## alpha beta gamma
## 0.6811 0.0001 0.0001
acc <- rbind(accuracy(hs90_winters_m),
accuracy(hs90_winters_a))
rownames(acc) <- c('Мульт. модель', 'Адд.модель')
acc
## ME RMSE MAE MPE MAPE MASE ACF1
## Мульт. модель 0.29693 3.80 2.99 0.043 6.06 0.459 0.2737
## Адд.модель -0.00667 3.73 3.06 -0.365 6.13 0.471 0.0753
rbind(accuracy(hs90_winters_m),
accuracy(hs90_winters_a)) %>%
as_tibble() %>%
round(4) %>%
mutate(`Метод` = c('Мультипликативная модель',
'Аддитивная модель')) %>%
select(`Метод`, MASE, MAPE, MPE) %>%
arrange(MASE)
## # A tibble: 2 x 4
## Метод MASE MAPE MPE
## <chr> <dbl> <dbl> <dbl>
## 1 Мультипликативная модель 0.459 6.06 0.043
## 2 Аддитивная модель 0.471 6.13 -0.365
На обучающем периоде методы демонстрируют одинаковую точность.
Попробуем сравнить их на тестовом периоде:
# Подготовка данных обучающего периода:
hs90_train <-
window(hs90, end = c(1994, 11))
# Построение моделей:
hs90_wa_expost <- hw(hs90_train, h = 12, seasonal = 'additive')
hs90_wm_expost <- hw(hs90_train, h = 12, seasonal = 'multiplicative')
# Визуализация прогнозов:
hs90 %>% window(start = 1993) %>%
autoplot(series = 'Факт') +
autolayer(hs90_wa_expost$mean, series = 'Адд. модель') +
autolayer(hs90_wm_expost$mean, series = 'Мульт. модель') +
labs(title = hs90_label,
color = NULL,
x = NULL, y = NULL)
# Сравнение ошибок в тестовом периоде:
rbind(
accuracy(hs90_wa_expost, hs90)['Test set',],
accuracy(hs90_wm_expost, hs90)['Test set',]) %>%
as_tibble() %>%
round(4) %>%
mutate(`Метод` = c('Аддитивная модель',
'Мультипликативная модель')) %>%
select(`Метод`, MASE, MAPE, MPE) %>%
arrange(MASE)
## # A tibble: 2 x 4
## Метод MASE MAPE MPE
## <chr> <dbl> <dbl> <dbl>
## 1 Аддитивная модель 0.692 8.29 -0.222
## 2 Мультипликативная модель 0.712 8.97 -6.13
На тестовом периоде мультипликативная модель демонстрирует лучшее согласие с данными, однако отличие в показателях ошибки незначительно.