news 2026/2/25 13:14:53

用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/2/25 2:01:17

基于fluent的SLM过程模拟:包含案例、热源UDF及粉末导入

基于fluent的slm过程模拟&#xff0c;包含案例&#xff0c;热源udf&#xff0c;粉末的导入都有涉及。在增材制造领域&#xff0c;选择性激光熔化&#xff08;SLM&#xff09;技术因其高精度和复杂形状的制造能力而备受关注。今天&#xff0c;我们就来聊聊如何基于Fluent进行SLM…

作者头像 李华
网站建设 2026/2/23 23:05:34

Xshell:跨平台远程管理的终端利器

目录 一、技术架构 1.1 多协议引擎 1.2 跨平台支持 二、功能特性 2.1 多会话管理 2.2 自动化与脚本支持 2.3 文件传输集成 三、应用场景 3.1 开发测试环境 3.2 混合云管理 3.3 嵌入式系统调试 四、安全体系 4.1 传输加密 4.2 审计与合规 4.3 安全更新机制 五、版本演进 5.…

作者头像 李华
网站建设 2026/2/19 22:18:49

Golang Word文档自动化终极指南:5大实战场景深度解析

Golang Word文档自动化终极指南&#xff1a;5大实战场景深度解析 【免费下载链接】docx Simple Google Go (Golang) library for replacing text in Microsoft Word (.docx) file 项目地址: https://gitcode.com/gh_mirrors/docx/docx 在日常开发工作中&#xff0c;处理…

作者头像 李华
网站建设 2026/2/24 16:24:06

物流仓储Agent效率突飞猛进:基于强化学习的动态分拣策略全披露

第一章&#xff1a;物流仓储 Agent 的分拣效率 在现代物流系统中&#xff0c;仓储 Agent 作为自动化分拣的核心组件&#xff0c;其效率直接影响整体运营表现。通过智能调度与路径优化&#xff0c;Agent 能够在复杂仓库环境中快速定位货品并完成搬运任务&#xff0c;显著降低人工…

作者头像 李华
网站建设 2026/2/24 22:42:50

如何快速掌握文件差异对比:Diff Checker 完整使用指南

如何快速掌握文件差异对比&#xff1a;Diff Checker 完整使用指南 【免费下载链接】diff-checker Desktop application to compare text differences between two files (Windows, Mac, Linux) 项目地址: https://gitcode.com/gh_mirrors/di/diff-checker 在编程开发、文…

作者头像 李华
网站建设 2026/2/23 8:25:49

36、Linux 命令行实用技巧与高级特性

Linux 命令行实用技巧与高级特性 1. 信号处理与陷阱(Traps) 在编写脚本时,尤其是大型复杂脚本,需要考虑用户在脚本运行过程中注销或关机的情况。此时,系统会向受影响的进程发送信号,脚本应能做出相应处理,以确保程序正常有序终止。 1.1 陷阱机制 Bash 提供了 trap …

作者头像 李华