用Python实现时间序列模型实战——Day 7: ARIMA 模型的诊断与调整

news2024/11/13 11:15:00
一、学习内容
1. 残差分析与模型诊断

残差分析

  • 在 ARIMA 模型拟合之后,我们需要检查模型残差是否满足白噪声的假设。如果模型残差表现为零均值、方差恒定且无自相关性,这说明模型已经捕捉了时间序列中的主要结构,剩下的残差是随机波动。
  • 残差分析可以通过以下方式进行:
    • 可视化残差序列:通过绘制残差时间序列图来观察残差的分布和波动情况。
    • 残差的 ACF 图:检查残差的自相关性,如果残差是白噪声,则其 ACF 图中应没有显著的自相关性。
2. 模型的优化与调整
  • 参数调整:如果模型残差表现出显著的自相关性,说明模型没有完全捕捉到序列中的依赖结构。这时我们需要调整 ARIMA 模型的参数 pdq,可以根据 AIC 或 BIC 信息准则的最小化来选择更优的模型。
  • 差分次数的调整:差分次数 d 决定了时间序列平稳化的程度,如果模型拟合后的残差仍有趋势或周期性,可以考虑调整差分次数。
  • 模型对比:尝试不同的 ARIMA 模型,比较 AIC/BIC 值,选择最优的模型。
3. Ljung-Box 检验

Ljung-Box 检验

  • Ljung-Box 检验是一种用于检验时间序列的自相关性是否显著的统计检验。它主要用于检查时间序列的白噪声特性,特别适用于 ARIMA 模型的残差检验。
  • Ljung-Box 检验的原假设是“序列无自相关性”,即序列是白噪声。如果 p 值较大(通常大于 0.05),则无法拒绝原假设,说明残差无显著自相关性。
二、实战案例
1. 数据加载与差分处理
import pandas as pd
import matplotlib.pyplot as plt
from statsmodels.tsa.arima.model import ARIMA
from statsmodels.graphics.tsaplots import plot_acf
from statsmodels.stats.diagnostic import acorr_ljungbox

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

# 对数据进行差分处理以使其平稳
data_diff = data.diff().dropna()

 程序解释:

  • 载入航空乘客数据集,并对数据进行一阶差分,以消除趋势和季节性,使序列平稳。
2. ARIMA(2, 1, 2) 模型拟合
# 拟合 ARIMA 模型 (p, d, q) = (2, 1, 2)
model = ARIMA(data['Passengers'], order=(2, 1, 2))
results = model.fit()

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

 程序解释: 

  • 使用 ARIMA 函数拟合 ARIMA(2, 1, 2) 模型,并输出模型摘要信息。通过模型摘要,我们可以评估模型的拟合效果,包括 AIC/BIC 等信息准则。

运行结果:

SARIMAX Results                                
==============================================================================
Dep. Variable:             Passengers   No. Observations:                  144
Model:                 ARIMA(2, 1, 2)   Log Likelihood                -671.673
Date:                Sun, 01 Sep 2024   AIC                           1353.347
Time:                        15:14:03   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.060      0.000       1.645       1.725
ar.L2         -0.9548      0.017    -55.420      0.000      -0.989      -0.921
ma.L1         -1.8432      0.124    -14.809      0.000      -2.087      -1.599
ma.L2          0.9953      0.135      7.380      0.000       0.731       1.260
sigma2       665.9584    114.053      5.839      0.000     442.419     889.498
===================================================================================
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(2, 1, 2) 模型的摘要:模型摘要中显示了各参数的估计值、标准误差、t 统计量等信息,以及 AIC、BIC 等信息准则,用于评估模型的拟合效果。 

3. 残差分析
# 绘制残差时间序列图
residuals = results.resid
plt.figure(figsize=(12, 6))
plt.plot(residuals)
plt.title('Residuals of ARIMA(2, 1, 2) Model')
plt.xlabel('Date')
plt.ylabel('Residuals')
plt.grid(True)
plt.show()

 程序解释: 

  • 绘制模型残差时间序列图,观察残差的分布和波动情况。如果残差围绕零线随机波动,说明残差是白噪声,模型拟合效果较好。

运行结果:

残差分析:残差时间序列图显示了 ARIMA 模型拟合后的残差分布。如果残差序列表现为零均值且无趋势,说明模型的拟合效果较好。

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

 程序解释: 

  • 使用 ACF 图检查残差是否存在自相关性。如果残差的 ACF 图中没有显著的自相关性,说明模型已经捕捉了序列中的主要信息。

运行结果:

 残差的 ACF 图用于检查残差的自相关性,如果 ACF 图中没有显著的自相关性,则残差可以被认为是白噪声。 

4. Ljung-Box 检验
# Ljung-Box 检验
ljung_box_results = acorr_ljungbox(residuals, lags=[10], return_df=True)
print("Ljung-Box Test Results:")
print(ljung_box_results)

 程序解释: 

  • 使用 acorr_ljungbox 函数对模型残差进行 Ljung-Box 检验。检验的 p 值用于判断残差是否为白噪声。如果 p 值较大(大于 0.05),则不能拒绝原假设,说明残差没有显著自相关性。

运行结果:

Ljung-Box Test Results:
      lb_stat     lb_pvalue
10  64.958535  4.128000e-10

Ljung-Box 检验:Ljung-Box 检验的 p 值较大(大于 0.05)表明残差无显著自相关性,残差可以被认为是白噪声,模型已经充分拟合时间序列中的信息。 

5. 模型优化
# 尝试不同的模型进行优化
model_alt = ARIMA(data['Passengers'], order=(3, 1, 2))
results_alt = model_alt.fit()

# 输出新的模型摘要
print("\nAlternative ARIMA(3, 1, 2) Model Summary:")
print(results_alt.summary())

 程序解释: 

  • 尝试拟合一个新的 ARIMA(3, 1, 2) 模型,并输出新的模型摘要信息。通过比较 AIC/BIC 值,判断新的模型是否比原模型更优。

运行结果:

Alternative ARIMA(3, 1, 2) Model Summary:
                               SARIMAX Results                                
==============================================================================
Dep. Variable:             Passengers   No. Observations:                  144
Model:                 ARIMA(3, 1, 2)   Log Likelihood                -682.543
Date:                Sun, 01 Sep 2024   AIC                           1377.086
Time:                        15:14:16   BIC                           1394.863
Sample:                    01-01-1949   HQIC                          1384.310
                         - 12-01-1960                                         
Covariance Type:                  opg                                         
==============================================================================
                 coef    std err          z      P>|z|      [0.025      0.975]
------------------------------------------------------------------------------
ar.L1          0.2580      0.135      1.914      0.056      -0.006       0.522
ar.L2          0.3732      0.136      2.736      0.006       0.106       0.641
ar.L3         -0.3367      0.125     -2.684      0.007      -0.583      -0.091
ma.L1          0.0712      0.114      0.626      0.531      -0.152       0.294
ma.L2         -0.7846      0.098     -8.022      0.000      -0.976      -0.593
sigma2       812.4782    101.644      7.993      0.000     613.260    1011.696
===================================================================================
Ljung-Box (L1) (Q):                   1.53   Jarque-Bera (JB):                 0.75
Prob(Q):                              0.22   Prob(JB):                         0.69
Heteroskedasticity (H):               6.89   Skew:                             0.18
Prob(H) (two-sided):                  0.00   Kurtosis:                         2.98
===================================================================================

模型优化与对比:新拟合的 ARIMA(3, 1, 2) 模型通过调整参数 pq 提升了模型性能。通过 AIC 和 BIC 的比较,如果新的模型有更低的 AIC/BIC 值,则表明新模型的拟合效果更好。 

# 绘制新的模型残差时间序列图
residuals_alt = results_alt.resid
plt.figure(figsize=(12, 6))
plt.plot(residuals_alt)
plt.title('Residuals of ARIMA(3, 1, 2) Model')
plt.xlabel('Date')
plt.ylabel('Residuals')
plt.grid(True)
plt.show()

# 对新模型的残差进行 Ljung-Box 检验
ljung_box_results_alt = acorr_ljungbox(residuals_alt, lags=[10], return_df=True)
print("Ljung-Box Test Results for ARIMA(3, 1, 2):")
print(ljung_box_results_alt)

 程序解释: 

  • 对新模型的残差进行 Ljung-Box 检验,并与原模型的结果进行比较。

运行结果:

Ljung-Box Test Results for ARIMA(3, 1, 2):
      lb_stat  lb_pvalue
10  17.938524    0.05601

新模型的 Ljung-Box 检验结果与原模型进行对比,以确认新模型的残差是否进一步改善。 

三、运行结果分析
  1. 残差分析与模型诊断

    • 通过残差时间序列图和 ACF 图,验证了 ARIMA 模型残差的白噪声性质。如果残差没有显著的自相关性,说明模型已经有效捕捉了时间序列中的结构。
  2. Ljung-Box 检验

    • Ljung-Box 检验结果表明残差无显著的自相关性,进一步证明模型拟合后的残差是白噪声。模型的诊断分析可以通过 Ljung-Box 检验的 p 值确认。
  3. 模型的优化与调整

    • 通过调整 ARIMA 模型的参数,可以进一步提升模型的拟合效果。新拟合的 ARIMA(3, 1, 2) 模型在 AIC/BIC 值方面优于原模型,说明新模型的拟合效果更好。

通过这次分析,您可以学会如何进行 ARIMA 模型的诊断与优化,包括残差分析、Ljung-Box 检验以及参数调整的过程。在实践中,正确的残差诊断与模型调整能够大大提升时间序列预测的准确性。

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

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

相关文章

jarbas 靶机渗透(cms 渗透)

靶机信息 vulnhub 靶机 主机发现 (base) ┌──(root㉿kali)-[/home/kali/testJarbas] └─# sudo nmap -sn 192.168.50.0/24 Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-08-28 15:45 CST Nmap scan report for 192.168.50.1 Host is up (0.00023s latency). MAC …

职场真相:在草台班子中寻找自我价值

在踏入社会的那一刻起,我们每个人都怀揣着对未来的无限憧憬与梦想,渴望在职场这个广阔的舞台上绽放光彩。然而,现实往往比理想骨感得多,尤其是在初入职场的几年里,那些曾经以为的“精英团队”、“完美计划”逐渐被现实…

如何选到好的宠物空气净化器,用哪款宠物空气净化器比较好?

在当今社会,养宠物已成为许多家庭不可或缺的一部分,猫猫狗狗以其独特的魅力,悄然融入了我们的生活,成为了家中的一员,它们不仅带来了无尽的欢笑与陪伴,更在无形中丰富了我们的情感世界,让家充满…

【Python】如何使用pip,安装第三方库和生成二维码、操作Excel

文章目录 第三方库使用 pip安装第三方库 生成二维码1. 确定使用哪个库2. 查看对应文档3. 开始操作 操作 Excel1. 安装 xlrd2. 编写代码 第三方库 第三方库就是别人已经实现好了的库,我们可以拿过来直接使用 虽然标准库已经很强大了,但是终究是有限的&am…

QT线程同步

#线程同步 在前面理解了QThread两种使用方法,和线程机制以及退出过程后,需要了解线程同步的内容了,今天开启学习线程同步知识。 还是从大佬的文章开始。 从下面这篇文章开始学习 线程同步 线程同步有: QMutex(互斥&…

【PID系列】一文理解PID原理

【PID系列目录】 [1、一文理解PID原理] 2、PID代码设计 本文目录 1、引出2、 PID概念2.1 首先,什么是偏差呢?2.2 其次,什么是PID比例项?2.3 积分————解决稳态误差的利器2.4  微分————改善动态响应…

while (r > b[i].r) del(a[r--]); while (r < b[i].r)

论 分治 cdq | [SDOI2011] 拦截导弹 某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统。但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度、并且能够拦截任意速度的导弹,但是以后每一发炮弹都不能高于前一发的高度…

利用深度学习实现验证码识别-2-使用Python导出ONNX模型并在Java中调用实现验证码识别

1. Python部分:导出ONNX模型 首先,我们需要在Python中定义并导出一个已经训练好的验证码识别模型。以下是完整的Python代码: import string import torch import torch.nn as nn import torch.nn.functional as FCHAR_SET string.digits# …

静态库和共享库

文章目录 库的概念函数库库函数静态库的创建与使用静态库的概念静态库的创建代码示例--静态库的创建和使用 共享库的创建和是使用共享库的概念共享库的创建共享库的使用 总结 库的概念 当进行编辑C代码的时候常常会用到printf函数,这个函数被声明在stdio.h头文件中…

企业内部通信软件:打造高效协同办公的IM即时通讯工具

在现代企业中,高效的内部通信和协同办公是保持竞争优势的重要因素。为了实现团队间的快速沟通和协作,许多企业采用了企业内部通信软件,其中包括IM即时通讯工具。本文将探讨企业内部通信软件的重要性以及如何利用IM即时通讯工具打造高效协同办…

Clickhouse 为什么这么快

Clickhouse 的缘起 Clickhouse 最初是为 Yandex.Metrica 这个世界上第二大的Web分析平台开发的,并且一直是这个系统的核心组件。ClickHouse在Yandex.Metrica中的主要任务是使用非聚合数据在在线模式下构建报告,使用374台服务器组成的集群,在…

服务器间进行文件传输-SFTPSCP一篇搞定

1.简单介绍一下 在一些特殊场景,两台服务器之间需要进行文件传输的时候,或许我们会想到FTP,这也是我们常见的实现方式,但是如果我们不能操作远程服务器,无法判断远程服务器是否安装了FTP呢,众所周知&#…

学习周报-2024.8.31

目录 摘要 Abstract 创新点总结 模型数学原理 实验设置 一、验证实验 二、对比实验 摘要 这周重新梳理出论文的三个创新点,对所提出方法进行数学原理验证,证明其可行性。重新设置了实验部分,分为验证实验和对比实验,一共四…

使用 Eigen 库中的 Kronecker 积运算

前言 在数值计算和线性代数的众多应用中,Kronecker 积(Kronecker Product)是一种常用的矩阵运算。Eigen 是一个高性能的 C 数值计算库,广泛用于科学计算和工程应用中。在 Eigen 库中,Kronecker 积运算属于不常用的扩展…

资料分析(1)

1)截三个数去做&#xff0c;属于马上进位了&#xff0c;差距小&#xff0c;1/19<10% 2)截两位数去做&#xff0c;1/18>10% 3)次位差分别是:3&#xff0c;4&#xff0c;1&#xff0c;选项差距分别是大&#xff0c;大&#xff0c;小 截尾不需要考虑数量级 算一半&#xff0…

抽奖项目技术亮点

活动是通过秒杀领取的。&#xff08;即&#xff1a;活动对应着某一商品&#xff09; 这里超卖指&#xff1a;对于一个活动它的参与量有数量限制&#xff0c;就是活动的库存&#xff0c;当活动的领取数大于活动库存总量&#xff0c;就是超卖 用户秒杀参与活动的资格&#xff08;…

一.海量数据实时分析-Doris入门和安装

前言 停了一个月又开始写文章啦&#xff0c;因为公司数据量达到了几十亿&#xff0c;老板需要做实时数据分析&#xff0c;报表看板。这么大的数据量比较好的选择是使用Doris来做&#xff0c;他可以脱离hadoop生态独立使用所以大受企业喜爱&#xff0c;也因为如此就有了这个系列…

【JavaWeb】Http请求与响应

文章目录 Http 请求与响应一、Http 请求格式1、请求行2、请求头3、请求体&#xff08;post请求才有&#xff09; 二、HttpServletRequest1、获取 请求行 信息2、获取 请求头 信息3、获取 请求参数 信息 三、Http 响应格式1、响应行2、响应头3、响应体&#xff08;正文&#xff…

AI大模型应用开发环境配置

目录 一、工具下载 1、Python官网下载 2、Pycharm官网下载 3、Streamlit官网下载 二、升级PIP &#xff08;一&#xff09;检查PIP版本 &#xff08;二&#xff09;在anaconda Prompt命令窗口输入 三、安装openai组件 四、安装streamlit组件 五、启动streamlit 一、工…

Voi滑板车公司助农扶商,着手打造流量板块

Voi滑板车公司助农扶商&#xff0c;着手打造流量板块。 吉林是粮食大省&#xff0c;是全国优质粳稻主产区&#xff0c;现阶段全省水稻年产量600多万吨&#xff08;商品量400万吨左右&#xff09;&#xff0c;占东北三省一区的24%。巍巍长白山、悠悠松江水&#xff0c;辽阔黑土…