当前位置: 首页 > article >正文

关于自回归模型的一份介绍

SARIMAX(Seasonal AutoRegressive Integrated Moving Average with eXogenous regressors)模型是一种在时间序列预测中经常使用的模型,而自回归模型(AR)则是其基础,所以这篇文章将介绍AR有关的内容,以为之后SARIMAX模型的介绍做准备,关于这篇文章将介绍三两部分内容,分别是AR的概念、AR在具体实例中的运用过程。

一、AR概念

自回归模型(AutoRegressive Model, AR)是一种用于时间序列分析的统计模型,它基于这样的假设:当前预测值等于当前预测值的过去值(即滞后值)间的线性组合以及加上一个随机误差项。如果用等式来表示就是:

y_t=C+\phi _1y_{t-1}+\epsilon _t

其中 \phi_1 表示过去值对于当前值的影响程度,\epsilon _t 表示误差项(即白噪声),这是式子准确来说表示一阶自回归过程,如果我们要表示 p 阶的则是:

y_t=C+\phi _1y_{t-1} +\phi _2y_{t-2}+ ...+\phi _py_{t-p}+\epsilon _t

接着,我们对于一阶自回归过程的等式做出这样的变化:即让 \phi _1 为1,那么原式将变形为:

y_t=C+y_{t-1}+\epsilon _t

这个式子与之前提及的随机游走的式子一样,因此,我们说随机游走模型是自回归模型的一种特殊情况。而且如果 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

 此上


http://www.kler.cn/a/463201.html

相关文章:

  • 个人交友系统|Java|SSM|JSP|
  • 基于51单片机和16X16LED点阵屏(74HC138和74HC595驱动)的小游戏《贪吃蛇》
  • 【HAProxy】如何在Ubuntu下配置HAProxy服务器
  • 【面试】后端开发面试中常见数据结构及应用场景、原理总结
  • 使用java语言,自定义redistemplate
  • Ansys Discovery 中的网格划分方法:探索模式
  • 概率论期末考题类型
  • vue3+TS+vite中Echarts的安装与使用
  • Python视频解码库DeFFcode使用指南
  • 数势科技:解锁数据分析 Agent 的智能密码(14/30)
  • hadoop-common的下载位置分享
  • 【2024年-12月-11日-开源社区openEuler实践记录】深度探秘 libkperf:解锁系统性能剖析的开源宝藏
  • PyTorch快速入门教程【小土堆】之非线性激活
  • LoxodonFramework实现Lua侧绑定UI元素的原理
  • BOSS直聘招聘数据分析的第一步:用Python进行深度清洗
  • 中科汉玉-舆情感知,品牌声誉管理,政企舆情大数据服务平台
  • Django Settings 优化与常用配置指南
  • 安卓入门一 Java基础
  • 7.傅里叶级数练习题
  • ARM公司
  • 二叉树的实现
  • Redis 5设计与源码分析读书笔记
  • 刷机TP TP-Link-WDR5660【持续更新】
  • 常用的公共 NTP(网络时间协议)服务器
  • Java 开发中的指定外部 Jar 路径详解
  • ajax是什么?作用是什么?交互流程有哪些阶段?