时间序列 - ARIMA

我们已经知道,对于一个平稳的时间序列,时间"t"的变量是先前观察或残差的线性函数。 因此,我们是时候将两者结合起来,建立一个自回归移动平均 (ARMA) 模型了。

然而,有时时间序列不是静止的,即序列的统计特性,如均值、方差随时间变化。 到目前为止,我们研究的统计模型假设时间序列是平稳的,因此,我们可以包括一个预处理步骤,对时间序列进行差分以使其平稳。 现在,重要的是要找出我们正在处理的时间序列是否是平稳的。

找到时间序列平稳性的各种方法是在时间序列图中寻找季节性或趋势,检查不同时间段的均值和方差的差异,增强迪基-富勒 (ADF) 检验,KPSS 检验,赫斯特指数等 .

让我们看看我们的数据集的"temperature"温度变量是否是一个平稳的时间序列,或者不是使用 ADF 测试。

In [74]:

from statsmodels.tsa.stattools import adfuller

result = adfuller(train)
print('ADF Statistic: %f' % result[0])
print('p-value: %f' % result[1])
print('Critical Values:')
for key, value In result[4].items()
   print('\t%s: %.3f' % (key, value))

ADF Statistic: -10.406056

p-value: 0.000000

Critical Values:

1%: -3.431

5%: -2.862

10%: -2.567

现在我们已经运行了 ADF 测试,让我们解释一下结果。 首先,我们将 ADF 统计量与临界值进行比较,较低的临界值告诉我们该序列很可能是非平稳的。 接下来,我们看到 p 值。 p 值大于 0.05 也表明时间序列是非平稳的。

或者,p 值小于或等于 0.05,或 ADF 统计量小于临界值表明时间序列是平稳的。

因此,我们正在处理的时间序列已经是静止的。 在平稳时间序列的情况下,我们将"d"参数设置为 0。

我们还可以使用 Hurst 指数来确认时间序列的平稳性。

In [75]:

import hurst

H, c,data = hurst.compute_Hc(train)
print("H = {:.4f}, c = {:.4f}".format(H,c))

H = 0.1660, c = 5.0740

H<0.5 的值表示反持续行为,H>0.5 表示持续行为或趋势系列。 H=0.5 显示随机游走/布朗运动。 H<0.5, 的值确认我们的序列是平稳的。

对于非平稳时间序列,我们将"d"参数设置为 1。此外,自回归趋势参数"p"和移动平均趋势参数"q"的值是在平稳时间序列上计算的,即通过绘图 对时间序列进行差分后的 ACP 和 PACP。

以 3 个参数 (p,d,q) 为特征的 ARIMA 模型现在对我们来说已经很清楚了,所以让我们对时间序列进行建模并预测未来的温度值。

In [156]:

from statsmodels.tsa.arima_model import ARIMA

model = ARIMA(train.values, order=(5, 0, 2))
model_fit = model.fit(disp=False)

In [157]:

predictions = model_fit.predict(len(test))
test_ = pandas.DataFrame(test)
test_['predictions'] = predictions[0:1871]

In [158]:

plt.plot(df['T'])
plt.plot(test_.predictions)
plt.show()
代码片段 13

In [167]:

error = sqrt(metrics.mean_squared_error(test.values,predictions[0:1871]))
print ('Test RMSE for ARIMA: ', error)

测试 ARIMA 的 RMSE:43.21252940234892