С учетом этих смоделированных данных:
import numpy as np
from statsmodels.tsa.arima_process import ArmaProcess
from statsmodels.tsa.statespace.structural import UnobservedComponents
np.random.seed(12345)
ar = np.r_[1, 0.9]
ma = np.array([1])
arma_process = ArmaProcess(ar, ma)
X = 100 + arma_process.generate_sample(nsample=100)
y = 1.2 * X + np.random.normal(size=100)
Мы строим модель UnobservedComponents
с первыми 70 точками для выполнения выводов по последним 30 точкам, например:
model = UnobservedComponents(y[:70], level='llevel', exog=X[:70])
f_model = model.fit()
forecaster = f_model.get_forecast(
steps=30,
exog=X[70:].reshape(-1, 1)
)
conf_int = forecaster.conf_int()
Еслимы наблюдаем среднее значение для 95% доверительного интервала, получаем следующее:
conf_int.mean(axis=0)
array([118.19789195, 122.14101161])
Но при попытке получить те же значения с помощью моделирования, мы не совсем получаем те же результаты.Вот скрипт, который мы запускаем для смоделированных границ:
sim_model = UnobservedComponents(np.zeros(30), level='llevel', exog=X[70:])
res = []
predicted_state = f_model.predicted_state[..., -1]
predicted_state_cov = f_model.predicted_state_cov[..., -1]
for i in range(1000):
init_state = np.random.multivariate_normal(
predicted_state,
predicted_state_cov
)
sim = sim_model.simulate(
f_model.params,
30,
initial_state=init_state)
res.append(sim.mean())
Печатая нижний 2,5 и верхний 97,5 процентиль, мы получаем:
np.percentile(res, [2.5, 97.5])
array([119.06735028, 121.26810407])
Поскольку мы используем моделирование для различения сигнала от шума вПо данным, эта разница оказалась достаточно большой, чтобы привести к противоречивым выводам.Например, если мы сделаем:
y[70:] += 1
Затем, согласно первому методу, мы заключаем, что новый y
не несет сигнала, поскольку его среднее значение ниже, чем 122.14
.Но то же самое не верно, если мы используем второй метод: поскольку верхняя граница равна 121.2
, мы заключаем, что есть сигнал.
Теперь мы пытаемся понять, ожидается ли это.Разве нижний и верхний 95% доверительный интервал обоих методов не должны быть равны?