Модуль прогнозирования служит для экстраполяции значений по строкам рабочей области.
Краткое описание
Для прогнозирования необходимо, чтобы слева и сверху были вынесены размерности. У верхней размерности должно быть не менее 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.