Модуль прогнозирования служит для экстраполяции значений по строкам рабочей области.
Краткое описание
Для прогнозирования необходимо, чтобы слева и сверху были вынесены размерности. У верхней размерности должно быть не менее 5 элементов (10 для полной функциональности). В случае если слева или сверху вынесено больше одной размерности, расчет будет производиться только по крайним из них.
В вычислениях участвуют выделенные факты. Если ни один из фактов не выделен, то данные будут рассчитываться для всех видимых фактов, кроме вычислимых.
Реализовано 6 алгоритмов экстраполяции: линейная регрессия, фильтр Калмана, экспоненциальное сглаживание, MA, AR, ARIMA.
Порядок работы прогнозирования
- Вначале производится тестирование алгоритмов на имеющихся данных, генерируются последние n элементов строки каждым из алгоритмов, и считается ошибка между полученным результатом и реальными данными. n = min( 10, size / 10 ).
- Данные тестов усредняются и для каждого из фактов выбирается алгоритм, показавший наименьшую ошибку.
- Берется уже полная строка данных. В ней ищется наличие сезонной составляющей. Если она была найдена, то она удаляется и сохраняется отдельно.
- Данные, очищенные от сезонной компоненты сглаживаются и результат отдается одному из алгоритмов, выбранному на шаге 2.
- Алгоритм экстраполирует данные на K шагов (задается пользователем) и возвращает полученный результат.
- К полученным данным добавляется сезонная составляющая, сохраненная на шаге 3.
- После того как шаги 3-6 будут применены ко всем строкам из рабочей области, итоговый результат записывается в куб в виде новых элементов верхней размерности.
- Имена новых элементов задаются по следующему принципу: для даты, времени и числовых типов берется разница между последним и предпоследним элементом и добавляется к имени последнего элемента; для строковых размерностей имена новых элементов выглядят как "Прогноз #K", K = 1, 2, 3, ...
Точка входа - ForecastModule::get_forecast_internal
Описание методов
Линейная регрессия
Фильтр Калмана
Экспоненциальное сглаживание
Модель скользящего среднего
Авторегрессионная модель
ARIMA
ForecastModel
Класс ForecastModel отвечает за разложение ряда на компоненты и постобработку данных.
Описание построено на примере работы с рядом следующего вида:
Существует 2 типа моделей данных:
- мультипликативная,
F = T*S*E;
- аддитивная,
F = T + S + E
Здесь
F - исходный ряд,
T - тренд,
S - сезонная компонента,
E - случайная ошибка. Если исходный ряд стационарный, то используется аддитивная модель, в противном случае - мультипликативная.
В первую очередь пытаемся найти и выделить сезонную компоненту ( std::pair<index_type, bool> ForecastModel::find_season_period() ). Для этого находим поэлементную разницу между членами ряда ( void ForecastModel::series_diff( const real_vector &data, real_vector &diff_data, index_type diff ) const ) и строим автокорреляционную функцию (АКФ) по ним.
Исходя из АКФ находим, что есть периодическая компонента с периодом 12. Модель явно мультипликативная ( ForecastModel::ModelType ForecastModel::choose_model( const real_vector &data, const index_type season_period ) ), поэтому сглаживаем исходный ряд скользящей средней с шагом, равным периоду, и поэлементно делим его на сглаженный ряд, чтобы выделить сезонную компоненту ( void vector_ratio( const real_vector &a, const real_vector &b, real_vector &res, index_type a_from, index_type b_from ) ). После этого усредняем сезонную составляющую по ее периоду ( void ForecastModel::calculate_season_component( const real_vector &vec, const index_type season_period ) ).
Поделив исходный ряд на усредненную сезонную составляющую, получим данные без учета сезонности, т.е.
T*E ( void ForecastModel::remove_season_component() ).
Еще раз применив скользящую среднюю к
T*E получим тренд. Поделив его на данные без сезонности - получим вектор ошибок ( virtual void ForecastAlgorithm::preprocess( const real_vector &, const MovingAverage & ) = 0 ).
Далее к полученному тренду применяется один из методов экстраполяции ( void ForecastModel::get_forecast( real_vector &forecast, index_type duration ) ). На результат экстраполяции накладывается сезонная компонента ( void ForecastModel::add_season_values( real_vector &data_without_season ) ) - это и является конечным результатом работы.
MovingAverageModel (расчет коэффициентов)
Расчет коэффициентов для модели скользящего среднего описан в этой статье (раздел 2.3 Vocariance recursion method):
Реализовано в функции MovingAverageModel::estimate_coefficients.
AutoregressiveModel (расчет коэффициентов)
Для расчета коэффицентов авторегрессионной модели реализовано 2 алгоритма: Юла-Валкера и Барга. Описаны в следующих статьях:
Реализовано в функции AutoregressiveModel::estimate_yule_walker.