Time Series 简明教程
Time Series - Variations of ARIMA
在上一章中,我们已经看到了 ARIMA 模型如何工作,以及它不能处理季节性数据或多元时间序列的局限性,因此引入了新的模型来包含这些特征。
这里提供了这些新模型的概览 −
Vector Auto Regression Moving Average (VARMA)
它是 VAR 和 VMA 的组合以及多元固定时间序列 ARMA 模型的广义版本。它的特征是“p”和“q”参数。与 ARMA 一样,通过将“q”参数设置为 0 来充当 AR 模型并且通过将“p”参数设置为 0 来充当 MA 模型,VARMA 也能够通过将“q”参数设置为 0 来充当 VAR 模型并且通过将“p”参数设置为 0 来充当 VMA 模型。
[209] 中:
df_multi = df[['T', 'C6H6(GT)']]
split = len(df) - int(0.2*len(df))
train_multi, test_multi = df_multi[0:split], df_multi[split:]
[211] 中:
from statsmodels.tsa.statespace.varmax import VARMAX
model = VARMAX(train_multi, order = (2,1))
model_fit = model.fit()
c:\users\naveksha\appdata\local\programs\python\python37\lib\site-packages\statsmodels\tsa\statespace\varmax.py:152:
EstimationWarning: Estimation of VARMA(p,q) models is not generically robust,
due especially to identification issues.
EstimationWarning)
c:\users\naveksha\appdata\local\programs\python\python37\lib\site-packages\statsmodels\tsa\base\tsa_model.py:171:
ValueWarning: No frequency information was provided, so inferred frequency H will be used.
% freq, ValueWarning)
c:\users\naveksha\appdata\local\programs\python\python37\lib\site-packages\statsmodels\base\model.py:508:
ConvergenceWarning: Maximum Likelihood optimization failed to converge. Check mle_retvals
"Check mle_retvals", ConvergenceWarning)
[213] 中:
predictions_multi = model_fit.forecast( steps=len(test_multi))
c:\users\naveksha\appdata\local\programs\python\python37\lib\site-packages\statsmodels\tsa\base\tsa_model.py:320:
FutureWarning: Creating a DatetimeIndex by passing range endpoints is deprecated. Use `pandas.date_range` instead.
freq = base_index.freq)
c:\users\naveksha\appdata\local\programs\python\python37\lib\site-packages\statsmodels\tsa\statespace\varmax.py:152:
EstimationWarning: Estimation of VARMA(p,q) models is not generically robust, due especially to identification issues.
EstimationWarning)
[231] 中:
plt.plot(train_multi['T'])
plt.plot(test_multi['T'])
plt.plot(predictions_multi.iloc[:,0:1], '--')
plt.show()
plt.plot(train_multi['C6H6(GT)'])
plt.plot(test_multi['C6H6(GT)'])
plt.plot(predictions_multi.iloc[:,1:2], '--')
plt.show()
以上代码显示了如何使用 VARMA 模型对多元时间序列进行建模,虽然此模型可能不最适合我们的数据。
Seasonal Auto Regressive Integrated Moving Average (SARIMA)
这是 ARIMA 模型的扩展,用于处理季节性数据。它将数据划分为季节性和非季节性部分,并以类似的方式对它们进行建模。它的特征是 7 个参数,对于非季节部分(p、d、q)参数与 ARIMA 模型相同,对于季节部分(P、D、Q、m)参数,其中“m”是季节周期的数量,并且 P、D、Q 与 ARIMA 模型的参数类似。这些参数可以使用网格搜索或遗传算法进行校准。
SARIMA with Exogenous Variables (SARIMAX)
这是 SARIMA 模型的扩展,可用于包含外生变量,这有助于我们对我们感兴趣的变量进行建模。
在将变量作为外生变量使用之前,对变量进行相关分析可能很有用。
[251]:
from scipy.stats.stats import pearsonr
x = train_multi['T'].values
y = train_multi['C6H6(GT)'].values
corr , p = pearsonr(x,y)
print ('Corelation Coefficient =', corr,'\nP-Value =',p)
Corelation Coefficient = 0.9701173437269858
P-Value = 0.0
皮尔森相关性显示 2 个变量之间的线性关系,要解释结果,我们首先看 p 值,如果 p 值小于 0.05,则系数的值具有显着性,否则系数的值不具有显着性。对于有显着性的 p 值,相关系数的正值表示正相关,负值表示负相关。
因此,对于我们的数据,“温度”和“C6H6”似乎具有高度正相关性。因此,我们将
[297]:
from statsmodels.tsa.statespace.sarimax import SARIMAX
model = SARIMAX(x, exog = y, order = (2, 0, 2), seasonal_order = (2, 0, 1, 1), enforce_stationarity=False, enforce_invertibility = False)
model_fit = model.fit(disp = False)
c:\users\naveksha\appdata\local\programs\python\python37\lib\site-packages\statsmodels\base\model.py:508:
ConvergenceWarning: Maximum Likelihood optimization failed to converge. Check mle_retvals
"Check mle_retvals", ConvergenceWarning)
[298]:
y_ = test_multi['C6H6(GT)'].values
predicted = model_fit.predict(exog=y_)
test_multi_ = pandas.DataFrame(test)
test_multi_['predictions'] = predicted[0:1871]
[299]:
plt.plot(train_multi['T'])
plt.plot(test_multi_['T'])
plt.plot(test_multi_.predictions, '--')
Out[299]:
[<matplotlib.lines.Line2D at 0x1eab0191c18>]
与单变量 ARIMA 建模相比,这里的预测似乎变化更大。
不用说,SARIMAX 可通过仅将相应参数设置为非零值来用作 ARX、MAX、ARMAX 或 ARIMAX 模型。