Я использую учебник для Vector AutoRegressions на statsmodels.org. В руководстве не рассматривается, как преобразовать обратно прогнозируемые значения np.log(mdata).diff()
. Вопрос в том, как преобразовать обратно прогнозируемые значения, , а не исходные значения в тестовом наборе . Я думаю, что иногда это плохо передается.
Преобразование исходных значений: если я прогнозирую набор тестов, я могу последовательно добавить различия к базовому числу. Самый простой способ сделать это - сначала определить совокупную сумму по индексу, а затем добавить ее к базовому числу:
inverted(ts) = differenced(ts) + observation(ts-1)
reverted(ts) = pred_df.cumsum() + X_test
Итак, позволяет go до root задачи, преобразуя прогнозные значения 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]
Почему прогнозные значения не масштабируются должным образом?