时间序列 - ARIMA
我们已经了解,对于平稳时间序列,时间“t”的变量是先前观测值或残差的线性函数。因此,现在是我们将两者结合起来并建立自回归移动平均(ARMA)模型的时候了。
然而,有时时间序列不是平稳的,即序列的统计特性(如均值、方差)随时间变化。到目前为止,我们研究的统计模型假设时间序列是平稳的,因此,我们可以包括一个对时间序列进行差分以使其平稳的预处理步骤。现在,对我们来说重要的是要弄清楚我们正在处理的时间序列是否平稳。
查找时间序列平稳性的各种方法包括寻找时间序列图中的季节性或趋势、检查不同时间段的均值和方差的差异、增强迪基富勒 (ADF) 检验、KPSS 检验、赫斯特指数等。
让我们使用 ADF 测试来看看数据集的“温度”变量是否是平稳时间序列。
在[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 统计数据:-10.406056
p 值:0.000000
关键值:
1%:-3.431
5%:-2.862
10%:-2.567
现在我们已经运行了 ADF 测试,让我们解释一下结果。首先,我们将 ADF 统计量与临界值进行比较,较低的临界值告诉我们该序列很可能是非平稳的。接下来,我们看到 p 值。p 值大于 0.05 也表明时间序列是非平稳的。
或者,p 值小于或等于 0.05,或 ADF 统计量小于临界值表明时间序列是平稳的。
因此,我们正在处理的时间序列已经是平稳的。对于平稳时间序列,我们将“d”参数设置为 0。
我们还可以使用 Hurst 指数来确认时间序列的平稳性。
在[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表示反持久性Behave,H>0.5表示持久性Behave或趋势序列。H=0.5 显示随机游走/布朗运动。H<0.5 的值,证实我们的序列是平稳的。
对于非平稳时间序列,我们将“d”参数设置为 1。此外,自回归趋势参数“p”和移动平均趋势参数“q”的值是在平稳时间序列上计算的,即通过绘制对时间序列进行差分后的 ACP 和 PACP。
ARIMA 模型的特征是 3 个参数 (p,d,q),现在我们已经清楚了,所以让我们对时间序列进行建模并预测温度的未来值。
在[156]中:
from statsmodels.tsa.arima_model import ARIMA model = ARIMA(train.values, order=(5, 0, 2)) model_fit = model.fit(disp=False)
在[157]中:
predictions = model_fit.predict(len(test)) test_ = pandas.DataFrame(test) test_['predictions'] = predictions[0:1871]
在[158]中:
plt.plot(df['T']) plt.plot(test_.predictions) plt.show()
在[167]中:
error = sqrt(metrics.mean_squared_error(test.values,predictions[0:1871])) print ('Test RMSE for ARIMA: ', error)
测试 ARIMA 的 RMSE:43.21252940234892