R 语言做时间序列分析的实例(模式识别、拟合、检验、预测)

2023-11-02

一、准备工作

1、数据准备

所使用的数据是TSA包中的co2数据,如果没有这个包的话,可以先装一下

install.packages("TSA")	# 安装包 TSA

会有让你选镜像的过程,随便选就行了。下载好之后,导入并查看数据

library(TSA)
data(co2)
win.graph(width = 4.875,height = 3,pointsize = 8)
plot(co2,ylab='CO2')        #绘制原始数据


可以看到,原始数据明显有一个向上的趋势和一个周期趋势。

2、基本概念

赤池信息准则(Akaike’s(1973) Information Criterion, AIC)是建立在熵的概念基础上,可以权衡所估计模型的复杂度和此模型拟合数据的优良性。
A I C = − 2 l o g ( 极 大 似 然 估 计 值 ) + 2 k AIC=-2log(极大似然估计值)+2k AIC=2log()+2k
其中,如果模型包含截距或常数项,那么k=p+q+1;否则k=p+q。AIC越小越好。

Ljung-Box检验即LB检验、随机性检验,用来检验m阶滞后范围内序列的自相关性是否显著,或序列是否为白噪声(或者统计量服从自由度为m的卡方分布)。若是白噪声数据,则该数据没有价值提取,即不用继续分析了。

二、数据处理

拿到一个序列之后,首先判断它是不是平稳时间序列,如果是就进行模式识别;如果不是就扣除趋势项将其变成一个平稳时间序列。接着做模式识别、参数估计、模型诊断和预测。

ps: 这是从老师课件上找的流程图,个人感觉模式识别部分,不应包含参数d,因为含有d的一般是ARIMA(p,d,q)模型,它是非平稳模型,而上一步已将非平稳时间序列转成平稳时间序列了,d应该是在上一步确认的。也有可能是,扣除趋势项和模式识别的界限根本不可能分那么细,但是又要用流程图表示出来,所以才这么写的。

1、模式识别

一般来讲,模式识别就是判别出ARIMA(p,d,q)中的各阶数p,d,q。模式识别常用的方法有:acf, pacf, eacf

首先来看它的自相关函数

acf(as.vector(co2),lag.max = 36)                #自相关函数


季节自相关关系十分显著:在滞后12,24,36,……上表现出很强的相关性。

plot(diff(co2),ylab='1st Diff. of CO2',xlab='Year') #一次差分,消除整体上升趋势


可以看到,经过一次差分后,序列中的整体上升趋势已经消除。再来看其样本自相关函数

acf(as.vector(diff(co2)),lag.max = 36)          #一次差分后的自相关函数


一次差分后,序列中仍存在强烈的季节性;应用季节差分法应该可以得到更为简约的模型。

plot(diff(diff(co2),lag=12),xlab='Year',ylab='1st & seasonal Diff.')


绘制其自相关函数

acf(as.vector(diff(diff(co2),lag=12)),lag.max=36,ci.type='ma')


可以看到,经过一次差分和季节差分后的时间序列已经消除了季节性的大部分影响。根据样本自相关函数可以看到,除了在滞后1和12上具有自相关性外,经一次和季节差分后的序列几乎不再具有自相关性,所建模型只需要在滞后1和12上具有自相关性即可。

综上,考虑构建乘法季节 A R I M A ( 0 , 1 , 1 ) × ( 0 , 1 , 1 ) 12 ARIMA(0,1,1)\times (0,1,1)_{12} ARIMA(0,1,1)×(0,1,1)12模型。

2、参数估计

模型建立后,需要估计模型的参数。乘法季节ARIMA模型只是一般ARIMA模型的特例。

m1.co2=arima(co2,order=c(0,1,1),seasonal=list(order=c(0,1,1),period=12))
print(m1.co2)
-------------------------------------------
Coefficients:
          ma1     sma1
      -0.5792  -0.8206
s.e.   0.0791   0.1137

sigma^2 estimated as 0.5446:  log likelihood = -139.54,  aic = 283.08

上面第一行代码便得到了参数的极大似然估计值,参数估值的标准差为0.5446,对数似然值为-139.54AIC=283.08。模型的参数估值均为高度显著,进而将对该模型加以检验。

ps:为什么能根据这些指标值说明参数估值高度显著,标准是多少?

3、诊断性检验

1 残差序列

首先观察残差的时间序列图

plot(window(rstandard(m1.co2),start=c(1995,2)),ylab='Standardized Resi.',type='o');
abline(h=0)

除了序列中间存在某些异常行为外,残差图中并没有表明模型有任何主要的不规则性。然后对残差的样本自相关函数进一步观察

acf(as.vector(window(rstandard(m1.co2),start=c(1995,2))),lag.max=36)


统计上显著的相关系数位于滞后22,其值仅为-0.194,相关性非常小,且滞后22上的依赖关系难以给出合理的解释。除了滞后22处的边缘显著以外,该模型似乎已捕捉到了序列中依赖关系的本质。

注:在acf前打个print即可输出滞后各阶的自相关函数的值。

2 Ljung-Box 检验

下面进行Ljung-Box检验:

win.graph(width=3,height =3,pointsize = 8)
hist(window(rstandard(m1.co2),start=c(1995,2)),xlab='Standardized Resi.',ylab='Frequency')


直方图的形状像钟形,但并不标准。对模型进行Ljung-Box检验,给出自由度为22的x=25.59, p=0.27,表明该模型已捕获时间序列中的依赖关系。

why?

R 语言进行 Ljung-Box 检验的函数如下:

Box.test(x, lag = 1, type = c("Box-Pierce", "Ljung-Box"), fitdf = 0)
  • x: 一个时间序列,残差检验时,一般是残差
  • lag: 基于自相关因子得出的lag值
  • type: Ljung-Box 检验就设置为 Ljung-Box
  • fitdf: 如果x是一系列残差,则需要减去自由度。

调用函数后,我们关心的就是p值,如果p > 0.05,则说明是白噪声序列,是纯随机性序列。否则数据不是白噪声,具有研究价值。

示例如下:

x <- rnorm (100)
Box.test(x, lag = 5)
Box.test(x, lag = 10, type = "Ljung")
a=Box.test(resid(m1.xpole),type="Ljung",lag=20,fitdf=11)

接着绘制分位数-分位数图(qq图)

win.graph(width=5,height =5,pointsize = 8)
qqnorm(window(rstandard(m1.co2),start=c(1995,2)))
abline(c(0,0),c(1,1),col='red')

QQ 图的上尾部,再次出现了一个异常值。但是,Shapiro-Wilk正态性检验给出的统计量W=0.982,进而得到p=0.11,且在任何显著水平上正态性都未被拒绝。

作为对模型的进一步检验,考虑用 A R I M A ( 0 , 1 , 2 ) × ( 0 , 1 , 1 ) 12 ARIMA(0,1,2)\times (0,1,1)_{12} ARIMA(0,1,2)×(0,1,1)12模型进行过度拟合。

m2.co2=arima(co2,order=c(0,1,2),seasonal=list(order=c(0,1,1),period=12))
print(m1.co2)
print(m2.co2)
--------------------------------
arima(x = co2, order = c(0, 1, 1), seasonal = list(order = c(0, 1, 1), period = 12))
Coefficients:
          ma1     sma1
      -0.5792  -0.8206
s.e.   0.0791   0.1137
sigma^2 estimated as 0.5446:  log likelihood = -139.54,  aic = 283.08
--------------------------------
arima(x = co2, order = c(0, 1, 2), seasonal = list(order = c(0, 1, 1), period = 12))

Coefficients:
          ma1      ma2     sma1
      -0.5714  -0.0165  -0.8274
s.e.   0.0897   0.0948   0.1224

sigma^2 estimated as 0.5427:  log likelihood = -139.52,  aic = 285.05

可以看到, θ 1 \theta_1 θ1 θ \theta θ的估计变化很小(考虑标准差的大小时)。新参数 θ 2 \theta_2 θ2的估值在统计上与零无异。AIC 已经增加的情况下,sigma^2和对数似然值均无显著变化。所以使用 A R I M A ( 0 , 1 , 2 ) × ( 0 , 1 , 1 ) 12 ARIMA(0,1,2)\times (0,1,1)_{12} ARIMA(0,1,2)×(0,1,1)12模型是过度拟合,根据“奥卡姆剃刀原理”,如无必要,勿增实体。所以使用 A R I M A ( 0 , 1 , 1 ) × ( 0 , 1 , 1 ) 12 ARIMA(0,1,1)\times (0,1,1)_{12} ARIMA(0,1,1)×(0,1,1)12模型即可。

4、预测

前置时间设为2年,进行预测2年并绘制预测值与预测极限。

win.graph(width = 4.875,height = 3,pointsize = 8)
plot(m1.co2,n1=c(2003,1),nahead=24,xlab='Year',type='o',ylab='CO2 Levels')


前置时间设为1年,进行预测4年并绘制预测值与预测极限。

win.graph(width = 4.875,height = 3,pointsize = 8)
plot(m1.co2,n1=c(2004,1),n.ahead=48,xlab='Year',type='b',ylab='CO2 Levels')

ps: 上面参数的含义,n1=c(2004,1)代表从2004年1月开始(实际数据到2005年12月结束),n.ahead=48代表预测48个值(一年12个值,所以是4年)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

R 语言做时间序列分析的实例(模式识别、拟合、检验、预测) 的相关文章

  • 替换向量中非 %in% 向量的值

    简短的问题 我可以像这样替换某些变量值 values lt c a b a b c a b df lt data frame values 将 df values 的所有值替换为 x 其中值是neither a 或 b 输出应该是 c a
  • 如何在R中绘制仪表图表?

    如何在 R 中绘制以下图 Red 30 Yellow 40 Green 30 Needle at 52 所以这里有一个完整的ggplot解决方案 注意 从原始帖子中编辑 在仪表中断处添加数字指示器和标签 这似乎是OP在评论中所要求的 如果不
  • R ifelse 错误地用整数替换文本

    我正在使用 Udacity 课程中的一些数据 链接 Reddit 调查回复 https s3 amazonaws com udacity hosted downloads ud651 reddit csv 我试图通过使用单个单词替代替换任何
  • 合并具有一个共同元素的集合 R

    我有一个这样的列表 lista list lista 1 c 1 2 4 6 8 9 10 11 12 19 32 34 35 36 37 38 lista 2 c 7 8 lista 3 c 13 14 16 26 27 28 29 30
  • 使用 gtable 排列 ggplot 绘图(具有相同宽度的 grobs)以创建 2x2 布局

    我正在尝试使用 grobs 和 gtable 将 4 个 ggplot2 图排列成 2x2 网格 我不知道如何设置宽度 也不知道如何设置非 1xn 或 nx1 排列 使用此代码 data iris a lt ggplot iris aes
  • 生成因子变量水平的预测值

    我正在使用连续结果变量对多个因子变量进行回归lm 例如 fit lt lm dv factor hour factor weekday factor month factor year count data df 我想生成预测值 yhat
  • 如何在R中使用OpenNLP获取POS标签?

    这是 R 代码 library NLP library openNLP tagPOS lt function x s lt as String x word token annotator lt Maxent Word Token Anno
  • 使用 RMySQL 会干扰 RPostgreSQL

    我有一个 R 脚本 我想从 MySQL 数据库中提取一些数据 然后从 PostgreSQL 数据库中提取一些数据 但是 从 RMySQL 加载 MySQL 驱动程序会阻止我从以下位置加载 PostgreSQL 驱动程序 PostgreSQL
  • 如何加速 R for 循环?

    我正在为 R 中 GWmodel 包中的 gwr basic 函数运行以下 for 循环 我需要做的是收集任何给定带宽的估计参数的平均值 代码如下 library GWmodel data DubVoter Dub voter LARent
  • 无重叠的抖动点

    My data a lt sample 1 5 100 replace TRUE b lt sample 1 5 100 replace TRUE c lt sample 1 10 100 replace TRUE d lt sample
  • lmer(来自 R 包 lme4)如何计算对数似然?

    我试图理解 lmer 函数 我发现了很多关于如何使用该命令的信息 但关于它实际执行的操作的信息却很少 除了这里的一些神秘注释 http www bioconductor org help course materials 2008 PHSI
  • 带有nearPoints()的动态ggplot图层闪亮

    我熟悉闪亮的基础知识 但在这里遇到了一些困难 我希望能够在单击某个点以突出显示该点时添加 ggplot 图层 我知道 ggvis 可以做到这一点 并且画廊中有一个很好的例子 但我希望能够使用nearPoints 捕获点击作为 ui 输入 我
  • grid.arrange 中的错误 -rangeGrob() 函数

    我有两个图 p1 和 p2 我试图使用 grid arrage 绘制它们 我的代码如下所示 grid arrange p1 p2 ncol 2 top textGrob Distribution across each day of the
  • 在嵌套 tibbles 上应用 ntile

    我正在尝试申请ntile在一些嵌套的小标题上 但我似乎无法让它工作 你能看出我错在哪里吗 data iris iris gt group by Species gt mutate quintile ntile Petal Length 5
  • 确定向量中是否存在元素的最有效方法

    我有几种算法取决于确定元素是否存在于向量中的效率 在我看来 这 in 这相当于is element 应该是最有效的 因为它只返回一个布尔值 在测试了几种方法之后 令我惊讶的是 这些方法是迄今为止效率最低的 以下是我的分析 随着向量大小的增加
  • 优化 R 中的嵌套 for 循环

    我尝试加速下面的代码 但没有成功 我读到Rfast https cran r project org web packages Rfast Rfast pdf包 但我也未能实现该包 有没有办法优化R中的以下代码 RI lt function
  • 抑制 R 中的错​​误消息

    我正在 R 中运行模拟研究 有时 我的模拟研究会产生错误消息 当我在函数中实现模拟研究时 当出现此错误消息时模拟停止 我知道抑制错误是不好的做法 但此时对我来说 除了抑制错误然后继续下一个模拟 直到达到我喜欢运行的模拟总数为止 没有其他选择
  • 在 Shiny 应用程序中过滤数据时,长度为 1 的字符向量除了第一个元素之外的所有元素都将被忽略错误

    我有以下闪亮的应用程序 library shiny library rhandsontable library shinydashboard library ggplot2 library dplyr setwd C Users Marc
  • 在ggplotly散点图中添加自定义数据标签

    我想显示Species对于每个数据点 当光标位于该点上方而不是 x 和 y 值时 我用iris数据集 另外 我希望能够单击数据点以使标签持久存在 并且当我在图中选择新位置时标签不会消失 如果可能的话 最基本的是标签 持久性问题是一个优点 这
  • 无法在 Document-Term-Matrix 中看到 `RTextTools::toLower()` 文本的结果

    我尝试创建一个矩阵 为此我想降低文本 为此 我使用此 R 指令 matrix create matrix tweets 1 toLower TRUE language english removeStopwords FALSE remove

随机推荐

  • git本地仓库基本操作--查看提交历史和版本回退前进

    1
  • 版本问题导致 导入vue报错:Uncaught TypeError: Vue is not a constructor

    版本问题导致 导入vue报错 Uncaught TypeError Vue is not a constructor 浏览器控制台错误信息 问题代码 某博客带来的启发 解决方案 附录 vue2生产环境部分代码 vue3生产环境部分代码 浏览
  • window7 配置telnet 服务

    第一步 点击开始 选择控制面板 第二步 选择 程序 选择打开或关闭windows 功能 在选择对话框中勾选Telnet客户端和Telnet服务端 第三步 点击 计算机 管理 属性 修改Telnet服务的启动方式 第四步 判断Telnet服务
  • [LeetCode] Reverse Linked List I II - 链表翻转问题

    题目概述 Reverse a singly linked list 翻转一个单链表 如 1 gt 2 输出 2 gt 1 1 gt 2 gt 3 输出3 gt 2 gt 1 题目解析 本人真的比较笨啊 首先想到的方法就是通过判断链尾是否存在
  • MySQL中的正斜杠和反斜杠

    目录 问题背景 问题提出 1 为什么书上的这种方法得不到正确的数据呢 2 是因为DBMS的问题嘛 3 如何在MySQL上得到正确的数据呢 问题总结 问题背景 今天数据库老师留了一道实验题 如下 14 查询 A C 课程的课程号和学分 如果没
  • 初识C++Primer plus

    写在前面 从事c 编程转眼也快一年了 一直从事工厂数据采集工作 然而就与硬件交互效率来说 无疑c c 与硬件更加契合 就很任性的买了一本c Primer plus 第六版 希望自己在博客里能坚持下去 将自己所悟所感写在这里与大家分享 分割线
  • 飞驰的高铁-第15届蓝桥杯第一次STEMA测评Scratch真题精选

    导读 超平老师的 Scratch蓝桥杯真题解析100讲 已经全部完成 后续会不定期解读蓝桥杯真题 这是Scratch蓝桥杯真题解析第150讲 飞驰的高铁 本题是2023年8月20日举行的第15届蓝桥杯STEMA测评Scratch编程中级组编
  • 源码大杀器:怎样查看源码

    一 以SpringBoot来分析下 首先获取到源码 二 点击GitHub获取源码 三 下载源码 SpringSpace 11 24 24 ls emptydemo springdemo gs accessing data jpa maste
  • 【Python网络爬虫与信息提取】Scrapy爬虫框架

    1 理论知识 pip install scrapy i http pypi douban com simple trusted host pypi douban com scrapy h scrapy startproject python
  • 第五章 初始化与清理(下)

    第五章 初始化与清理 现在总结的东西很多都需要用代码来帮助理解了 所以会有大量的测试代码 不过这中方式非常有用 如果认真敲过一遍之后 并且将这些代码弄清楚了 我相信你一定会对书中描述的内容有一个更清楚的认识 我是在eclipse工具上进行测
  • requests.session()会话保持

    可能大家对session已经比较熟悉了 也大概了解了session的机制和原理 但是我们在做爬虫时如何会运用到session呢 就是接下来要讲到的会话保持 首先说一下 为什么要进行会话保持的操作 requests库的session会话对象可
  • Flink如何连接hive

    回顾在上篇文章中 笔者使用的 CDH 版本为 5 16 2 其中 Hive 版本为 1 1 0 CDH 5 x 系列 Hive 版本都不高于 1 1 0 是不是不可理解 Flink 源代码本身对 Hive 1 1 0 版本兼容性不好 存在不
  • 测绘eps软件快捷键_行业内三款常用软件快捷键汇总整理及自定义设置

    今天小编要和各位看官分享的是测绘行业内三款常用软件的快捷键 这三款常用软件分别是CASS CAD EPS ARCGIS 快捷键是提高绘图速度 提升作业效率的不二法宝 小编也经常在给朋友们说一定要学会使用快捷键 特别是左手键的用法 今天我们就
  • 学习python过程中的心得体会和收获,也说一下好处坏处

    首先 Python是一种流行的编程语言 用于数据分析 机器学习 人工智能等领域 Python的语法简单易懂 易于学习和理解 这使得它成为许多初学者的首选编程语言 对于初学者来说 建议从基础开始学习 例如语法 数据类型 控制流等 同时 也要多
  • Linux下使用《du》命令查看某文件及目录的大小

    du ah max depth 1 这个是我想要的结果 a表示显示目录下所有的文件和文件夹 不含子目录 h表示以人类能看懂的方式 max depth表示目录的深度 du sh 目录 查看目录的大小 du sh 文件 查看文件大小 du命令用
  • Go语言学习史诗级教程-带你领略GoLang语言新世界

    Go基础 下载Go语言开发工具 下载Go语言环境 下载地址 https golang google cn dl 下载Go语言开发工具 下载地址 https www jetbrains com go 第一个Go语言代码 package mai
  • OAuth2 授权码模式为什么不直接返回access_token

    https www cnblogs com erichi101 p 13497971 html OAuth2的实际应用中 最常见的就是 授权码模式 了 微博是这种模式 微信也是这种模式 总结来说 就是简单的二步 1 获取code 2 根据c
  • buuctf- [BJDCTF2020]Easy MD5 (小宇特详解)

    buuctf BJDCTF2020 Easy MD5 小宇特详解 这里显示查询 这里没有回显 f12一下查看有没有有用的信息 我使用的火狐浏览器在网模块中找到了响应头 Hint select from admin where passwor
  • Incompatible ssh peer (no acceptable kex algorithm)

    安装greenplum数据库进行交换密码时输入root的密码一直不成功 后 用 gpssh exkeys f hostfile exkeys 命令结果如下 STEP 1 of 5 create local ID and authorize
  • R 语言做时间序列分析的实例(模式识别、拟合、检验、预测)

    文章目录 一 准备工作 1 数据准备 2 基本概念 二 数据处理 1 模式识别 2 参数估计 3 诊断性检验 1 残差序列 2 Ljung Box 检验 4 预测 一 准备工作 1 数据准备 所使用的数据是TSA包中的co2数据 如果没有这