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

简介: 用R分析时间序列(time series)数据 时间序列(time series)是一系列有序的数据。通常是等时间间隔的采样数据。如果不是等间隔,则一般会标注每个数据点的时间刻度。  下面以time series 普遍使用的数据 airline passenger为例。 这是十一年的每月乘客数量,单位是千人次。 如果想尝试其他的数据集,可以访问这里:  https:

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

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

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

如果想尝试其他的数据集,可以访问这里:  https://datamarket.com/data/list/?q=provider:tsdl

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

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

这篇文章主要讨论prediction(forecast,预测)问题。 即已知历史的数据,如何准确预测未来的数据。

先从简单的方法说起。给定一个时间序列,要预测下一个的值是多少,最简单的思路是什么呢?

(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: AutoRegressive Integrated Moving Average

ARIMA是两个算法的结合:AR和MA。其公式如下:

是白噪声,均值为0, C是常数。  ARIMA的前半部分就是Autoregressive:, 后半部分是moving average: 。  AR实际上就是一个无限脉冲响应滤波器(infinite impulse resopnse), MA是一个有限脉冲响应(finite impulse resopnse),输入是白噪声。

ARIMA里面的I指Integrated(差分)。 ARIMA(p,d,q)就表示p阶AR,d次差分,q阶MA。  为什么要进行差分呢? ARIMA的前提是数据是stationary的,也就是说统计特性(mean,variance,correlation等)不会随着时间窗口的不同而变化。用数学表示就是联合分布相同:

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

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

(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(p$pred,test)  #18.55567
BT = Box.test(ma$residuals, lag=30, type = "Ljung-Box", fitdf=2)
复制代码
相关文章
|
算法 网络安全 数据安全/隐私保护
使用 openssl 生成证书
一、openssl 简介 openssl 是目前最流行的 SSL 密码库工具,其提供了一个通用、健壮、功能完备的工具套件,用以支持SSL/TLS 协议的实现。官网:https://www.openssl.
9871 0
|
8月前
|
JSON 监控 API
关键词搜索淘宝商品列表API指南
本API提供合规、高效的淘宝商品关键词搜索服务,支持价格/销量/店铺类型等多维筛选,实时同步价格与销量(延迟&lt;5分钟),返回含标题、主图、SKU等全字段JSON数据,适配选品、比价、运营等场景。(239字)
|
10月前
|
编解码 人工智能 文字识别
【Github热门项目】DeepSeek-OCR项目上线即突破7k+星!突破10倍无损压缩,重新定义文本-视觉信息处理
DeepSeek-OCR开源即获7k+星,首创“上下文光学压缩”技术,仅用100视觉token超越传统OCR模型256token性能,压缩比达10-20倍,精度仍超97%。30亿参数实现单卡日处理20万页,显著降低大模型长文本输入成本,重新定义高效文档理解新范式。
789 2
【Github热门项目】DeepSeek-OCR项目上线即突破7k+星!突破10倍无损压缩,重新定义文本-视觉信息处理
|
API 云栖大会
通义千问升级旗舰模型Qwen-Max,性能接近GPT-4o
通义旗舰模型Qwen-Max全方位升级,性能接近GPT-4o
13214 12
|
10月前
|
边缘计算 自然语言处理 算法
实时交互数字人端到端延迟压至0.8秒:关键技术节点与商业价值解析
0.8秒是实时数字人体验的关键阈值,端到端延迟低于此值可实现自然流畅交互。本文解析其技术链路、核心支撑与商业价值,揭示为何这一指标成为数字人从“可用”到“好用”的分水岭。
|
人工智能 前端开发 机器人
10个优质独立开发者社区
以下是我整理的10个优质独立开发者社区,都是自己平时经常逛或参与过的,分类整理方便不同需求的开发者参考
|
安全 网络安全 网络虚拟化
采用默认配置通过IKE协商方式建立IPSec隧道示例
本文介绍了通过配置IPSec隧道实现分支与总部网络间流量安全保护的组网需求与操作步骤。分支网关RouterA和总部网关RouterB通过公网通信,子网分别为10.1.1.0/24和10.1.2.0/24。配置思路包括:设置接口IP地址与静态路由、定义ACL规则、配置IPSec安全提议、IKE对等体属性、安全策略以及在接口上应用策略组,确保数据流的安全传输。
采用默认配置通过IKE协商方式建立IPSec隧道示例
|
Web App开发 Ubuntu IDE
Linux也可以这样美—Ubuntu18.04美化
并且注意一下解压后shell的主题文件夹的二级目录应该是/gnome-shell,然后分别放到对应的目录,就能在gnome-tweak工具里面识别了,直接可以进行替换,建议用这种方式,管理比较方便,并且里面的图标样式文件什么,都可以自己去修改的。熟悉了后操作还是挺简单的,我把需要注意的地方都说清楚了,至于美化自行去搭配,之前的链接我也没保存,就不去找了。
391 0
|
算法 前端开发 rax
互动游戏之我养的鸡要旅行
游戏的开发区别于传统前端,本文记录了作者慢慢摸索该项目过程中遇到的问题和解决的思路。

热门文章

最新文章