模拟置信区间不等于conf_int结果

时间:2018-10-08 19:41:02

标签: python scipy statsmodels

给出此模拟数据:

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)

我们用前70个点构建一个UnobservedComponents模型,对后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%置信区间不应该相等吗?

0 个答案:

没有答案