Итак, свершилось! Пакет, над которым я работал последние года полтора, наконец выложен в CRAN. Как это водится, вся документация в пакете — на английском языке: и винеты, и даже написанный мною собственноручно огроменный документ с подробным описанием того, что там творится внутри. Поэтому, чтобы донести смысл пакета до рускоязычной аудитории, я попытаюсь в серии постов рассказать о том, что за функции находятся в пакете, зачем они нужны, как работают и что дают.
Начнём мы с Экспоненциального сглаживания.
Что такое es(), и зачем она нужна?
Вообще «ES» это сокращение от Exponential Smoothing (Экспоненциальное сглаживание). В R для этого уже существует функция под названием ets(), она входит в пакет «forecast» Роба Хайндамана. В связи с этим может возникнуть вопрос: «Зачем нам ещё одна функция экспоненциального сглаживания?». На него у меня есть несколько ответов:
- Функция ets() не позволяет строить некоторые смешанные модели экспонениального сглаживания. Например, ETS(A,A,M), которая лежит в основе классического метода Хольта-Уинтерса, не доступна. Из исследовательского интереса, в попытке восстановить справедливость, я реализовал все 30 моделей экспоненциального сглаживания. Ни в чём себе не отказывайте!
- ets() не позволяет включать в модель экзогенные переменные. То есть, если вы считаете, что на объём продаж мороженого может влиять температура, но вы хотите использовать ещё и модель экспоненциального сглаживания, то вам можно только посочувствовать. Или можно было до появления пакета «smooth». Функция es() позволяет включать либо вектор с экзогенной переменной, либо матрицу с экзогенными переменными. Прогнозируйте мороженое правильно!
- В области прогнозирования есть общее представление о том, что комбинирование прогнозов разных моделей позволяет увеличивать их точность. Так Стефан Коласса применил идею с комбинированием на основе инфорационных критериев к моделям экспоненциального сглаживания и показал, что точность прогнозов от этого увеличивается. В функции es() этот механизм комбинирования реализован. Даёшь комбинацию!
- Число сезонных коэффициентов в функции ets() ограничено 24. Причиной этого является сложность оптимизации моделей, в которых число коэффициентов оказывается большим. В функции es() такого ограничения нет. Я считаю, что пользователь должен сам нести ответственность за свои действия, ограничивать его как маленького ребёнка не стоит. Однако, если у вас высокочастотные данные и большое количество параметров, возможно стоит попробовать другие методы инициализации экспоненциального сглаживания. Будьте бдительны!
- Собственно говоря, методы инициализации вектора состояний — это ещё один элемент, выгодно отличающий мою функцию от функции Роба. В случае с es() пользователь может либо оптимизировать стартовое значение, либо рассчитать его с помощью процедуры «backcasting», либо задать вручную. Выбор за вами!
- Помимо стандартных методов оценки параметров модели, в es() вы можете ещё встретить методы, основанные на минимуме MAE, траекторных функций и HAM. Зачем? А затем, что они позволяют получать более робастные модели, что может быть необходимо, например, в случаях с высокочастотными данными. Ну, и ещё просто потому, что так интересней жить!
- В литературе по прогнозированию существует тьма тьмущая методов построения прогнозных интервалов. В функции es() есть выбор из трёх: параметрические, полупараметрические и непараметрические. В каких-то случаях, например, непараметрические интервалы могут оказаться значительно более полезными, нежели параметрические. В конце концов, не сошёлся же клином мир на нормальном распределении!
- Статистическая модель в основе es() несколько отличается от модели в основе ets(). В частности, в случае с мультипликативными ошибками es() использует допущение о лог-нормальном законе распределения ошибок (а не нормальном, как в случае с классической ETS). Это оказывается особенно важно, когда уровень прогнозируемой величины близок к нулю. Вы не поверите, на какие чудеса способна лог-нормальная модель!
- es() позволяет работать с целочисленными данными и ситуациями с нулевыми значениями (то что в заморской литературе называется «intermittent demand»). Пока что в функции реализованы модель Кростона, TSB и модель с фиксированной вероятностью. Всё это основано на текущем исследовании с Джоном Бойланом и ещё будет дорабатываться. Следите за обновлениями!
- Ну, и последнее, это замечательный параметр holdout, который позволяет делить выборку на две части на лету и оценивать точность прогнозов по тестовой выборке. Где ещё вы найдёте такую прелесть?!
Замечу, что при этом функция es() не обязательно гарантирует вам более точные прогнозы, чем ets(). Мною замечено, что на разных данных она ведёт себя по-разному: где-то лучше ets(), где-то хуже. Главное преимущество функции заключается в её гибкости. Если вам эта гибкость ненужна, а нужно просто, чтобы работало, то рекомендую обратиться к ets().