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

На тестовом периоде мультипликативная модель демонстрирует лучшее согласие с данными, однако отличие в показателях ошибки незначительно.