关于自回归模型的一份介绍
SARIMAX(Seasonal AutoRegressive Integrated Moving Average with eXogenous regressors)模型是一种在时间序列预测中经常使用的模型,而自回归模型(AR)则是其基础,所以这篇文章将介绍AR有关的内容,以为之后SARIMAX模型的介绍做准备,关于这篇文章将介绍三两部分内容,分别是AR的概念、AR在具体实例中的运用过程。
一、AR概念
自回归模型(AutoRegressive Model, AR)是一种用于时间序列分析的统计模型,它基于这样的假设:当前预测值等于当前预测值的过去值(即滞后值)间的线性组合以及加上一个随机误差项。如果用等式来表示就是:
其中 表示过去值对于当前值的影响程度, 表示误差项(即白噪声),这是式子准确来说表示一阶自回归过程,如果我们要表示 p 阶的则是:
接着,我们对于一阶自回归过程的等式做出这样的变化:即让 为1,那么原式将变形为:
这个式子与之前提及的随机游走的式子一样,因此,我们说随机游走模型是自回归模型的一种特殊情况。而且如果 C 在不等于0时,我们还将之称呼为带漂移的随机游走模型。
二、AR过程
接下来,我们来详细说明AR代码编写时的过程:
首先,我们有如下的一段我自己模拟的时间序列数据:
Timestep,data
2023-01-01,0.0
2023-01-02,4.930867849414407
2023-01-03,8.775451763640431
2023-01-04,11.904331162752316
2023-01-05,13.215955126564953
2023-01-06,14.134100110120878
2023-01-07,15.683476484838309
2023-01-08,16.36215090396327
2023-01-09,16.218768439806812
2023-01-10,16.624417929657753
2023-01-11,16.405383704354197
...
接着我们将之可视化,可得到如下图:
我们观察图像,发现曲线并无明显的变化趋势,然后检查数据的自相关性与平稳性,所以可以通过调用 statesmodels 函数库中的 plot_pacf 函数得到图像,具体代码与图像如下:
import numpy as np
import matplotlib.pyplot as plt
from statsmodels.tsa.stattools import pacf
from statsmodels.graphics.tsaplots import plot_pacf
# 使用 statsmodels 绘制PACF图
plot_pacf(y, lags=20) # 设置lags参数以指定要显示的最大滞后数
# 添加标题和标签
plt.title('Partial Autocorrelation Function (PACF)')
plt.xlabel('Lag')
plt.ylabel('PACF')
plt.show()
根据 PACF 图的特性,我们可以考虑使用 AR(1) 或 AR(2) 模型来拟合数据。这是因为 PACF 在滞后 1 和滞后 2 处有显著峰值,而在更高阶数上迅速衰减。所以接下来,我们进行 AR(2) 建模然后预测。
进行预测前,需要划分数据集,分为训练集和测试集,接着利用 AutoReg 函数进行预测的拟合与预测,最后将真实值与预测值同时画在一张图上即可,具体代码实现与所得图像如下:
import numpy as np
import matplotlib.pyplot as plt
from statsmodels.tsa.ar_model import AutoReg
import pandas as pd
# 数据集读取与划分
data = pd.read_csv('ar1_time_series_data.csv',index_col=0)
data.index = pd.to_datetime(data.index)
train_size = int(len(data)*0.8)
train_data = data.iloc[:train_size]
test_data = data.iloc[train_size:]
# 拟合模型
p = 2
model = AutoReg(train_data, lags=p)
model_fit = model.fit()
# 使用模型进行预测
predictions = model_fit.predict(start=len(train_data), end=len(train_data) + len(test_data)-1, dynamic=False)
# 可视化结果
plt.plot(data, label='Actual')
plt.plot(predictions, color='red', label='AR(2)')
test_start_proportion = train_size / len(data)
plt.axvspan(data.index[train_size], data.index[-1], color='lightgray', alpha=0.5, label='Test Data Interval')
plt.legend()
plt.show()
图中蓝线是真实值,红线是预测值,我们可以通过均方误差(MSE)来具体查看模型拟合情况,代码如下:
from sklearn.metrics import mean_squared_error
error = mean_squared_error(test_data, predictions)
print(f'Test MSE: {error}')
输出结果是:
Test MSE: 0.1834505338387538
我们结合MSE的值与图像展示情况可以知道,该模型拟合情况不错,可以接受。
此外,我们对于模型中残差等方面还可以进一步检验,比如通过绘制残差图和进行 Ljung-Box 测试。具体代码如下:
from statsmodels.stats.diagnostic import acorr_ljungbox
# 残差制图
residuals = pd.DataFrame(model_fit.resid)
fig, ax = plt.subplots(1,2)
residuals.plot(title="Residuals", ax=ax[0])
residuals.plot(kind='kde', title='Density', ax=ax[1])
plt.show()
# 通过ljungbox检测自相关性
lb_test = acorr_ljungbox(residuals, lags=[10], return_df=True)
print(lb_test)
然后,我们得到残差图像以及对应的检验统计量与 P 值等信息如下:
Test MSE: 0.1834505338387538
lb_stat lb_pvalue
10 4.942704 0.894972
此上