用Python实现时间序列模型实战——Day 6: ARIMA 模型的理论基础

news2024/9/20 14:25:23
一、学习内容
1. ARIMA 模型的定义与公式推导

ARIMA 模型

  • ARIMA 模型全称为自回归积分滑动平均模型 (AutoRegressive Integrated Moving Average),用于分析和预测单变量时间序列数据。ARIMA 模型结合了自回归 (AR) 模型、差分 (I) 和移动平均 (MA) 模型的特点,能够处理非平稳时间序列。

ARIMA 模型的公式

  • ARIMA 模型通常表示为 ARIMA(p, d, q),其中:

    • ppp 表示自回归 (AR) 项的阶数。
    • ddd 表示差分 (I) 的次数,用于将非平稳序列转换为平稳序列。
    • qqq 表示移动平均 (MA) 项的阶数。
  • ARIMA(p, d, q) 模型的数学表达式

    ∇dyt=μ+ϕ1∇dyt−1+⋯+ϕp∇dyt−p+ϵt+θ1ϵt−1+⋯+θqϵt−q\nabla^d y_t = \mu + \phi_1 \nabla^d y_{t-1} + \dots + \phi_p \nabla^d y_{t-p} + \epsilon_t + \theta_1 \epsilon_{t-1} + \dots + \theta_q \epsilon_{t-q}∇dyt​=μ+ϕ1​∇dyt−1​+⋯+ϕp​∇dyt−p​+ϵt​+θ1​ϵt−1​+⋯+θq​ϵt−q​

    其中:

    • yty_tyt​ 是时间 ttt 的原始序列值。
    • ∇dyt\nabla^d y_t∇dyt​ 表示经过 ddd 次差分后的平稳序列。
    • μ\muμ 是常数项。
    • ϕ1,…,ϕp\phi_1, \dots, \phi_pϕ1​,…,ϕp​ 是 AR 项的系数。
    • ϵt\epsilon_tϵt​ 是白噪声项。
    • θ1,…,θq\theta_1, \dots, \theta_qθ1​,…,θq​ 是 MA 项的系数。
2. ARIMA 模型的参数识别 (p, d, q)

差分次数 ddd

  • 差分次数 ddd 的选择基于序列的平稳性。通过进行差分,可以消除趋势和季节性,使时间序列变为平稳。一般通过观察时间序列图或进行平稳性检验(如 ADF 检验)来判断是否需要差分以及差分的次数。

自回归阶数 ppp移动平均阶数 qqq

  • 自回归阶数 ppp 和移动平均阶数 qqq 的选择基于自相关函数 (ACF) 和偏自相关函数 (PACF) 的图形分析。
    • ACF 图:用于识别 MA 项的阶数。MA 模型的 ACF 图在阶数 qqq 之后通常会出现截尾。
    • PACF 图:用于识别 AR 项的阶数。AR 模型的 PACF 图在阶数 ppp 之后通常会出现截尾。
3. 使用 ACF 和 PACF 选择 ARIMA 模型的参数
  • 通过绘制差分序列的 ACF 和 PACF 图,可以帮助我们确定 ARIMA 模型的参数 ppp 和 qqq。
  • ddd 的选择通常先通过差分序列的平稳性来确定,之后根据差分后的平稳序列来选择 ppp 和 qqq。
二、实战案例

我们将使用 statsmodels 库对某时间序列数据进行 ARIMA 模型的参数选择与拟合。

程序解释
1. 数据加载与原始数据可视化
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from statsmodels.tsa.arima.model import ARIMA
from statsmodels.graphics.tsaplots import plot_acf, plot_pacf
from statsmodels.tsa.stattools import adfuller

# 加载时间序列数据集
url = "https://raw.githubusercontent.com/jbrownlee/Datasets/master/airline-passengers.csv"
data = pd.read_csv(url, parse_dates=['Month'], index_col='Month')

# 绘制原始数据的时间序列图
plt.figure(figsize=(12, 6))
plt.plot(data['Passengers'], label='Original')
plt.title('Original Time Series')
plt.xlabel('Date')
plt.ylabel('Number of Passengers')
plt.legend()
plt.grid(True)
plt.show()

程序解释: 

  • 载入航空乘客数据集,并绘制原始时间序列图,以观察乘客数量的趋势和季节性波动。

输出结果:

原始数据的时间序列图:图表显示了航空乘客数量随时间的变化,呈现出上升趋势和季节性波动,这表明序列是非平稳的。 

2. 平稳性检验(ADF 检验)
# 进行ADF平稳性检验
adf_test = adfuller(data['Passengers'])
print('ADF Statistic:', adf_test[0])
print('p-value:', adf_test[1])

程序解释:  

  • 使用 adfuller 进行 ADF 平稳性检验,以确定是否需要进行差分。ADF 检验的 p 值大于 0.05 表明序列是非平稳的,需进一步差分处理。

输出结果:

ADF Statistic: 0.8153688792060597
p-value: 0.9918802434376411

ADF 平稳性检验结果:ADF 检验的 p 值通常较大(大于 0.05),说明原始时间序列是非平稳的,需要进行差分处理。 

3. 一阶差分
# 一阶差分
data_diff = data.diff().dropna()

# 绘制差分后的时间序列图
plt.figure(figsize=(12, 6))
plt.plot(data_diff['Passengers'], label='Differenced')
plt.title('Differenced Time Series')
plt.xlabel('Date')
plt.ylabel('Differenced Passengers')
plt.legend()
plt.grid(True)
plt.show()

程序解释:  

  • 对时间序列进行一阶差分,以消除趋势,使其成为平稳序列。差分后的序列应表现为围绕零线的随机波动。

输出结果:

差分后的时间序列图:差分后的序列消除了趋势,呈现出围绕零线的随机波动,表明序列趋于平稳。 

4. ACF 和 PACF 图的绘制
# 绘制 ACF 和 PACF 图
plt.figure(figsize=(12, 6))
plt.subplot(121)
plot_acf(data_diff['Passengers'], lags=40, ax=plt.gca())
plt.title('ACF')

plt.subplot(122)
plot_pacf(data_diff['Passengers'], lags=40, ax=plt.gca(), method='ywm')
plt.title('PACF')

plt.tight_layout()
plt.show()

程序解释:  

  • 绘制差分后序列的 ACF 和 PACF 图,用于识别 ARIMA 模型的参数 ppp 和 qqq。通常,ACF 图用于确定 MA 项的阶数 qqq,而 PACF 图用于确定 AR 项的阶数 ppp。

输出结果:

ACF 和 PACF 图:ACF 图和 PACF 图帮助识别 ARIMA 模型的阶数。本例中,ACF 图显示了滞后期的自相关性消失较快,而 PACF 图的截尾现象表明可以选择 AR(2) 和 MA(2) 作为模型参数。 

5. ARIMA 模型拟合
# ARIMA 模型拟合 (p, d, q) = (2, 1, 2)
model = ARIMA(data['Passengers'], order=(2, 1, 2))
results = model.fit()

# 输出模型摘要
print(results.summary())

程序解释:  

  • 根据 ACF 和 PACF 图选择的 ppp、ddd 和 qqq 值,使用 ARIMA 函数拟合 ARIMA 模型。本例中,选择 p=2p=2p=2、d=1d=1d=1(差分一次)和 q=2q=2q=2 来拟合 ARIMA(2, 1, 2) 模型。
  • 输出模型的摘要信息,包括模型参数的估计、标准误差、t 统计量等。

输出结果:

 

ARIMA 模型的摘要:ARIMA(2, 1, 2) 模型的拟合结果摘要包括模型参数的估计值、标准误差、t 统计量和 p 值。模型摘要还包括 AIC(赤池信息准则)和 BIC(贝叶斯信息准则)等指标,用于评估模型的优劣。通过模型摘要,我们可以了解每个参数在模型中的贡献,并评估模型的总体拟合效果。 

6. 模型残差分析
# 绘制模型残差
residuals = results.resid
plt.figure(figsize=(12, 6))
plt.plot(residuals)
plt.title('ARIMA Model Residuals')
plt.xlabel('Date')
plt.ylabel('Residuals')
plt.grid(True)
plt.show()

 输出结果:

SARIMAX Results                                
==============================================================================
Dep. Variable:             Passengers   No. Observations:                  144
Model:                 ARIMA(2, 1, 2)   Log Likelihood                -671.673
Date:                Thu, 29 Aug 2024   AIC                           1353.347
Time:                        20:46:55   BIC                           1368.161
Sample:                    01-01-1949   HQIC                          1359.366
                         - 12-01-1960                                         
Covariance Type:                  opg                                         
==============================================================================
                 coef    std err          z      P>|z|      [0.025      0.975]
------------------------------------------------------------------------------
ar.L1          1.6850      0.020     83.059      0.000       1.645       1.725
ar.L2         -0.9548      0.017    -55.419      0.000      -0.989      -0.921
ma.L1         -1.8432      0.125    -14.790      0.000      -2.087      -1.599
ma.L2          0.9953      0.135      7.371      0.000       0.731       1.260
sigma2       665.9552    114.140      5.835      0.000     442.245     889.665
===================================================================================
Ljung-Box (L1) (Q):                   0.30   Jarque-Bera (JB):                 1.84
Prob(Q):                              0.59   Prob(JB):                         0.40
Heteroskedasticity (H):               7.38   Skew:                             0.27
Prob(H) (two-sided):                  0.00   Kurtosis:                         3.14
===================================================================================

输出结果: 

  • 模型残差分析:模型残差图展示了 ARIMA 模型拟合后的残差序列。如果模型拟合良好,残差应该是白噪声,这意味着残差序列应表现为零均值、无自相关的随机波动。 

# 残差的 ACF 图
plot_acf(residuals, lags=40)
plt.title('Residuals ACF')
plt.show()

 程序解释: 

  • 绘制模型残差序列,检查残差是否为白噪声。如果残差没有显著的自相关性(ACF 图显示大部分自相关系数接近于零),则说明模型拟合效果较好。

输出结果:

进一步绘制残差的 ACF 图,以检查残差是否存在显著的自相关性。如果残差的 ACF 图中,大部分滞后期的自相关系数接近于零,且没有明显的模式,则说明模型残差是白噪声,模型拟合效果较好 。

三、结果分析
1. 差分处理
  • 差分后的序列消除了原始数据中的趋势成分,表现为平稳的随机波动。差分是将非平稳序列转化为平稳序列的关键步骤,使得后续的 ARIMA 模型可以有效应用。
2. ACF 和 PACF 图
  • ACF 图显示了差分后序列的自相关结构,帮助确定 MA 模型的阶数 qqq。
  • PACF 图显示了差分后序列的偏自相关结构,帮助确定 AR 模型的阶数 ppp。
  • 在本例中,选择 AR(2) 和 MA(2) 是基于 PACF 截尾和 ACF 减弱的特点。
3. ARIMA 模型拟合
  • ARIMA(2, 1, 2) 模型结合了自回归项、差分项和移动平均项,通过最大似然估计(MLE)方法拟合模型参数。模型摘要提供了各参数的统计显著性,以及 AIC、BIC 指标,表明模型的拟合效果。
4. 残差分析
  • 模型残差图显示,残差序列表现为白噪声,没有显著的自相关性,这说明 ARIMA 模型已经很好地捕捉了时间序列的结构,剩余的误差部分是随机的。
  • 如果残差的 ACF 图显示滞后期的自相关性较弱,则表明模型拟合充分,没有漏掉显著的序列信息。
5. 模型的评价
  • 通过 AIC 和 BIC 等信息准则,评估模型的优劣,并与其他候选模型进行比较。AIC 和 BIC 越低,模型的表现通常越好。
  • ARIMA(2, 1, 2) 模型在本案例中的表现良好,残差是白噪声,模型能够有效地对时间序列进行建模。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2091645.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

黑神话悟空带火了哪些三维建模技术

自《黑神话:悟空》面世以来,不少小伙伴们被其中的3D场景所惊艳! 在人工智能时代,NeRF(Neural Radiance Fields,神经辐射场)与3DGS(3D Gaussian Splatting,3D高斯溅射&am…

Elastic Stack--ELFK架构

前言:本博客仅作记录学习使用,部分图片出自网络,如有侵犯您的权益,请联系删除 学习B站博主教程笔记: 最新版适合自学的ElasticStack全套视频(Elk零基础入门到精通教程)Linux运维必备—Elastic…

肿瘤免疫新视野:揭秘CXCL13+ T细胞对免疫检查点阻断的响应

肿瘤免疫新视野:揭秘CXCL13 T细胞对免疫检查点阻断的响应 在免疫治疗领域,探索肿瘤反应性T细胞对免疫检查点阻断(ICB)的响应机制一直是研究热点。一篇2022年发表在《Nature Cancer》上的研究——“Single-cell meta-analyses rev…

C++set与map容器

目录 一、关联式容器和序列式容器 二、树形结构的关联式容器 三、set容器 1.set容器的定义 2.set的构造 3.set的迭代器 4.set的容量 5.set的修改操作(set容器不支持修改数据) 6.set的一些其他常用接口 (1)find函数 &…

Google Earth Engine:对NDVI进行惠特克平滑算法进行长时序分析

目录 简介 函数 ee.Array.identity(size) Arguments: Returns: Array transpose(axis1, axis2) Arguments: Returns: Array matrixMultiply(image2) Arguments: Returns: Image matrixSolve(image2) Arguments: Returns: Image arrayFlatten(coordinateLabels, …

Ajax day-01

目录 一. Ajax 1.1 创建XMLHttpRequest对象 1.2 Ajax向服务器发送请求 1.3 设置http请求头 1.4 发送请求 1.5 获得响应 1.6 监听请求状态的改变 1.7 获取响应头 1.8 获得响应主体 1.9 处理服务器返回的数据 1.10 怎样向服务器传递数据? 二. 接口文档 三…

线性表之数组

数组(Array)是 C/C 中最基础和重要的数据结构之一,它提供了一种有效存储和访问固定大小元素集合的方式。关于数组的定义和使用相信大家都已经熟练掌握,本文将着重为大家剖析数组的物理结构和逻辑结构。 1. 数组的物理结构 数组的…

视频技术未来展望:EasyCVR如何引领汇聚融合平台新趋势

随着科技的飞速发展,视频技术已成为现代社会不可或缺的一部分,广泛应用于安防监控、娱乐传播、在线教育、电商直播等多个领域。本文将探讨视频技术的未来发展趋势,并深入分析TSINGSEE青犀EasyCVR视频汇聚融合平台的技术优势,展现其…

【SolidWorks2024 详细安装教程【附安装包】】

提示:【SolidWorks2024 详细安装教程【附安装包】】 文章目录 安装包获取一、安装步骤总结 安装包获取 提示:这里可以获得软件安装包: SolidWorks2024详细安装教程,百度网盘 链接:https://pan.baidu.com/s/1UyipwXokK…

rsync搭建全网备份

rsync搭建全网备份 1. 总体概述1.1 目标1.2 简易指导图1.3 涉及工具或命令1.4 环境 2. 实施2.1 配置备份服务器2.2 备份文件准备2.3 整合命令2.4 扩展功能 1. 总体概述 1.1 目标 本次搭建目标: 每天定时把服务器数据备份到备份服务器备份完成后进行校验把过期数据…

【python】turtle的使用

文章目录 1.初始化2.颜色3.画笔4.其他案例:分形树的绘制 1.初始化 import turtle# 创建一支画笔 pen turtle.Turtle()# ...# 暂停屏幕,防止程序关闭 turtle.done()2.颜色 # 设置颜色模式(如果要使用颜色相关设置,必须要使用这个) turtle.c…

基于STM32的RFID高速收费系统(论文+源码+实物)

1系统方案设计 本文基于STM32的RFID高速收费系统,其可以实现小车和货车两种车型收费,当车辆超过了规定的重量后,出现声光报警提示,并且启动杆不会抬起,只有当车辆重量低于设置值时,启动杆才会自动抬起&…

零基础学习Redis(7) -- hash类型命令使用

Redis本身就是通过哈希表的方式组织数据,同时redis中的value也可以是另一个哈希表。 1. 常用命令 1. hset / hsetnx hset key filed1 value1 filed2 value2 ... hset 用于把键值对存入value中,这里的key为redis组织的键, filed1 value1 fil…

SpringData-ElasticSearch入门

文章目录 1、创建demo工程2、application.properties3、Goods 实体类4、EsDemoApplicationTests 测试类5、pom.xml6、查看索引库7、查看单个索引(数据库)8、从goods索引中检索出符合特定搜索条件的文档(或记录) 1、创建demo工程 2…

Elasticsearch:使用 LTR 进行个性化搜索

作者:来自 Elastic Max Jakob 如今,用户已经开始期待根据个人兴趣定制搜索结果。如果我们听的所有歌曲都是摇滚歌曲,那么在搜索 “Crazy” 时,我们会期望 Aerosmith 的歌曲排在搜索结果的首位,而不是 Gnarls Barkley 的…

使用安信可Ai-WB2-12F开启wifi与手机通信TCP-IP(AT指令)

当时在做两个单片机之间无线通信,或者单片机与手机无线通信,就像找一个蓝牙和wifi双模的无线模块,一开始看ESP8684(ESP32-C2)这个芯片模组是有wifi和蓝牙的,买回来后才发现他不可以在程序运行中更换蓝牙或者…

《黑神话·悟空》这款游戏到底是用什么编程语言开发的?

你也有被这段游戏试玩视频刷屏吗? 13分钟、国产团队出品、B站上线不到24小时,播放量已经破千万,迅速火爆全网。 这就是来自国内游戏团队游戏科学(Game Science)开发的3A大作《黑神话:悟空》。 《黑神话悟…

vscode开发小程序

1 安装 "微信小程序开发工具" 2 安装 "WXML - Language Service" 3 安装 "wxmp-api-plugin" 或 "wechat-snippet" 4 安装"WXSS"

顶级的python入门教程!小白到大师,从这篇教程开始!

1. 为什么要学习Python? 学习Python的原因有很多,以下是几个主要的原因: 广泛应用:Python被广泛应用于Web开发、数据科学、人工智能、机器学习、自动化运维、网络爬虫、科学计算、游戏开发等多个领域。掌握Python意味着你可以在这…

嵌入式全栈开发学习笔记---Linux系统编程(进程间通信)

目录 进程间通信概述 进程通信目的 进程间通信的发展 进程间通信分类 管道通信 无名管道 有名管道mkfifo() 信号 发送信号kill & raise 忽略信号signal() 发送信号alarm() 消息队列 消息队列使用的步骤 创建消息队列msgget() 读写消息队列msgrcv()/msgsnd()…