news 2026/5/26 1:05:23

用R分析时间序列(time series)数据

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
用R分析时间序列(time series)数据

时间序列(time series)是一系列有序的数据。通常是等时间间隔的采样数据。如果不是等间隔,则一般会标注每个数据点的时间刻度。

下面以time series 普遍使用的数据 airline passenger为例。 这是十一年的每月乘客数量,单位是千人次。

可以很明显的看出,airline passenger的数据是很有规律的。

time series data mining 主要包括:decompose(分析数据的各个成分,例如趋势,周期性),prediction(预测未来的值),classification(对有序数据序列的feature提取与分类),clustering(相似数列聚类)等。

本文主要讨论prediction(forecast,预测)问题。即已知历史的数据,如何准确预测未来的数据。先从简单的方法说起。

1、给定一个时间序列,要预测下一个的值是多少,最简单的思路是什么呢?

(1)mean(平均值):未来值是历史值的平均。

(2)exponential smoothing (指数衰减):当去平均值得时候,每个历史点的权值可以不一样。最自然的就是越近的点赋予越大的权重。

或者,更方便的写法,用变量头上加个尖角表示估计值

(3) snaive : 假设已知数据的周期,那么就用前一个周期对应的时刻作为下一个周期对应时刻的预测值

(4) drift:飘移,即用最后一个点的值加上数据的平均趋势

介绍完最简单的算法,下面开始介绍两个time series里面最火的两个强大的算法: Holt-Winters 和 ARIMA。 上面简答的算法都是这两个算法的某种特例。

(5)Holt-Winters:三阶指数平滑

Holt-Winters的思想是把数据分解成三个成分:平均水平(level),趋势(trend),周期性(seasonality)。R里面一个简单的函数stl就可以把原始数据进行分解:

一阶Holt—Winters假设数据是stationary的(静态分布),即是普通的指数平滑。

二阶算法假设数据有一个趋势,这个趋势可以是加性的(additive,线性趋势),也可以是乘性的(multiplicative,非线性趋势),只是公式里面一个小小的不同而已。

三阶算法在二阶的假设基础上,多了一个周期性的成分。同样这个周期性成分可以是additive和multiplicative的。

举个例子,如果每个二月的人数都比往年增加1000人,这就是additive;如果每个二月的人数都比往年增加120%,那么就是multiplicative。

R里面有Holt-Winters的实现,现在就可以用它来试试效果了。我用前十年的数据去预测最后一年的数据。 性能衡量采用的是RMSE。 当然也可以采用别的metrics:

预测结果如下:

结果还是很不错的。

(6) ARIMA:ARIMA是两个算法的结合:AR和MA。

其公式如下:

是白噪声,均值为0, C是常数。

ARIMA的前半部分就是Autoregressive:

后半部分是moving average:

AR实际上就是一个无限脉冲响应滤波器,MA是一个有限脉冲响应,输入是白噪声。

ARIMA里面的I指差分。ARIMA(p,d,q)就表示p阶AR,d次差分,q阶MA。

2、为什么要进行差分呢?

ARIMA的前提是数据是stationary的,也就是说统计特性,不会随着时间窗口的不同而变化。

用数学表示就是联合分布相同:

当然很多时候并不符合这个要求,例如这里的airline passenger数据。有很多方式对原始数据进行变换可以使之stationary:

(1)差分:例如一阶差分是把原数列每一项减去前一项的值。二阶差分是一阶差分基础上再来一次差分。这是最推荐的做法

(2)先用某种函数大致拟合原始数据,再用ARIMA处理剩余量。例如,先用一条直线拟合airline passenger的趋势,于是原始数据就变成了每个数据点离这条直线的偏移。再用ARIMA去拟合这些偏移量。

(3)对原始数据取log或者开根号。这对variance不是常数的很有效。

如何看数据是不是stationary呢?这里就要用到两个很常用的量了: ACF(auto correlation function)和PACF(patial auto correlation function)。对于non-stationary的数据,ACF图不会趋向于0,或者趋向0的速度很慢。 下面是三张ACF图,分别对应原始数据,一阶差分原始数据,去除周期性的一阶差分数据:



确保stationary之后,下面就要确定p和q的值了。定这两个值还是要看ACF和PACF:

确定好p和q之后,就可以调用R里面的arime函数了。 值得一提的是,R里面有两个很强大的函数: ets 和 auto.arima。 用户什么都不需要做,这两个函数会自动挑选一个最恰当的算法去分析数据。

在R中各个算法的效果如下:

代码如下:

passenger = read.csv(‘passenger.csv’,header=F,sep=’ ')

p<-unlist(passenger)

pt<-ts(p,frequency=12,start=2001)

plot(pt)

train<-window(pt,start=2001,end=2011+11/12)test<-window(pt,start=2012)

library(forecast)

pred_meanf<-meanf(train,h=12)

rmse(test,pred_meanf$mean) #226.2657

pred_naive<-naive(train,h=12)

rmse(pred_naive$mean,test)#102.9765

pred_snaive<-snaive(train,h=12)

rmse(pred_snaive$mean,test)#50.70832

pred_rwf<-rwf(train,h=12, drift=T)

rmse(pred_rwf$mean,test)#92.66636

pred_ses <- ses(train,h=12,initial=‘simple’,alpha=0.2)

rmse(pred_ses$mean,test) #89.77035

pred_holt<-holt(train,h=12,damped=F,initial=“simple”,beta=0.65)

rmse(pred_holt$mean,test)#76.86677 without beta=0.65 it would be 84.41239

pred_hw<-hw(train,h=12,seasonal=‘multiplicative’)

rmse(pred_hw$mean,test)#16.36156

fit<-ets(train)

accuracy(predict(fit,12),test) #24.390252

pred_stlf<-stlf(train)

rmse(pred_stlf$mean,test)#22.07215

plot(stl(train,s.window=“periodic”)) #Seasonal Decomposition of Time Series by Loess

fit<-auto.arima(train)

accuracy(forecast(fit,h=12),test) #23.538735

ma = arima(train, order = c(0, 1, 3), seasonal=list(order=c(0,1,3), period=12))

p<-predict(ma,12)

accuracy(pKaTeX parse error: Expected 'EOF', got '#' at position 13: pred,test) #̲18.55567BT = Bo…residuals, lag=30, type = “Ljung-Box”, fitdf=2)

文章来源:网络 版权归原作者所有

上文内容不用于商业目的,如涉及知识产权问题,请权利人联系小编,我们将立即处理

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/26 6:05:00

HumanML3D深度解析:构建3D人体运动语言数据集的技术实践

HumanML3D深度解析&#xff1a;构建3D人体运动语言数据集的技术实践 【免费下载链接】HumanML3D HumanML3D: A large and diverse 3d human motion-language dataset. 项目地址: https://gitcode.com/gh_mirrors/hu/HumanML3D 在人工智能和计算机视觉领域&#xff0c;3D…

作者头像 李华
网站建设 2026/5/26 8:27:49

IQ-TREE2系统发育树构建实战指南:从入门到精通

还在为复杂的系统发育分析头疼吗&#xff1f;IQ-TREE2作为一款基于最大似然法的高效系统发育分析工具&#xff0c;能够帮你轻松解决这个难题。无论是处理小型基因数据集还是开展基因组规模的系统发育分析&#xff0c;这款开源软件都能满足你的需求。 【免费下载链接】iqtree2 N…

作者头像 李华
网站建设 2026/5/26 7:22:14

终极指南:3步在Windows上搭建免费微信智能助手

终极指南&#xff1a;3步在Windows上搭建免费微信智能助手 【免费下载链接】puppet-xp Wechaty Puppet WeChat Windows Protocol 项目地址: https://gitcode.com/gh_mirrors/pu/puppet-xp 还在为每天重复回复微信消息而烦恼吗&#xff1f;想象一下&#xff0c;有一个智能…

作者头像 李华
网站建设 2026/5/25 15:16:44

Draw.io电子工程绘图库完全指南:5步快速掌握专业电路设计

Draw.io电子工程绘图库完全指南&#xff1a;5步快速掌握专业电路设计 【免费下载链接】Draw-io-ECE Custom-made draw.io-shapes - in the form of an importable library - for drawing circuits and conceptual drawings in draw.io. 项目地址: https://gitcode.com/gh_mir…

作者头像 李华
网站建设 2026/5/26 7:21:36

MCP PL-600 Agent部署全解析,资深架构师不愿透露的4个秘密

第一章&#xff1a;MCP PL-600 Agent部署的核心价值与架构定位在现代混合云管理场景中&#xff0c;MCP PL-600 Agent作为核心通信组件&#xff0c;承担着本地资源与云端控制平面之间的桥梁作用。其部署不仅实现了跨环境的统一监控、策略下发与安全合规检查&#xff0c;还显著提…

作者头像 李华
网站建设 2026/5/26 5:53:43

终极指南:如何轻松将NTFS转换为Btrfs文件系统

终极指南&#xff1a;如何轻松将NTFS转换为Btrfs文件系统 【免费下载链接】ntfs2btrfs 项目地址: https://gitcode.com/gh_mirrors/nt/ntfs2btrfs 想要在Linux系统上享受Btrfs文件系统的强大功能&#xff0c;却担心数据迁移的麻烦&#xff1f;ntfs2btrfs正是你需要的解…

作者头像 李华