Прогнозируемые значения VAR - Python - Statsmodels
Я использую учебник по векторным авторегрессиям на сайте statsmodels.org. В руководстве не рассматривается, как преобразовать обратно спрогнозированные значенияnp.log(mdata).diff()
. Вопрос в том, как преобразовать обратно прогнозируемые значения, а не исходные значения на тестовом наборе. Я думаю, что иногда об этом плохо сообщают...
Преобразование исходных значений: если я прогнозирую по набору тестов, я могу последовательно добавлять различия к базовому числу. Простой способ сделать это - сначала определить совокупную сумму по индексу, а затем добавить ее к базовому числу:
inverted(ts) = differenced(ts) + observation(ts-1)
reverted(ts) = pred_df.cumsum() + X_test
Итак, перейдем к корню проблемы, преобразовав прогнозные значения np.log(mdata).diff()
, а не значения тестового набора.
import numpy as np
import pandas
import statsmodels.api as sm
from statsmodels.tsa.api import VAR
mdata = sm.datasets.macrodata.load_pandas().data
mdata = mdata[['realgdp','realcons','realinv']]
mdata.tail(2)
realgdp realcons realinv
201 12901.504 9189.0 1456.678
202 12990.341 9256.0 1486.398
Нам нужно нормализовать и вычесть тренд, вычитая предыдущее значение из каждого значения в серии, что является разностью первого порядка. Чтобы не усложнять задачу, мы сделаем дифференцирование первого порядка.
mdata = np.log(mdata).diff().dropna()
# Create VAR model
model = VAR(mdata)
model_results = model.fit(2)
Возврат значений прогноза.
print(model_results.forecast(model_results.y, 5))
[[ 0.00502587 0.0053712 0.0051154 ]
[ 0.00593683 0.00784779 -0.00302473]
[ 0.00662889 0.00764349 0.00393308]
[ 0.00731516 0.00797044 0.00657495]
[ 0.00732726 0.00808811 0.00649793]]
Эти значения необходимо преобразовать с помощью np.exp
.
print(np.exp(model_results.forecast(model_results.y, 5)))
[[1.00503852 1.00538565 1.0051285 ]
[1.00595449 1.00787867 0.99697984]
[1.00665091 1.00767278 1.00394083]
[1.00734198 1.00800229 1.00659661]
[1.00735417 1.00812091 1.00651908]]
Они не близки к исходным значениям (которые находятся в диапазоне 10000 с), поэтому мне нужно отменить diff()
в np.log(mdata).diff()
в прогнозных значениях с использованием cumsum()
print(np.exp(model_results.forecast(model_results.y, 5)).cumsum())
[ 1.00503852 2.01042417 3.01555267 4.02150716 5.02938582 6.02636567
7.03301658 8.04068935 9.04463018 10.05197216 11.05997445 12.06657106
13.07392524 14.08204615 15.08856523]
Почему прогнозируемые значения неправильно масштабируются?