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

用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)

时间: 2025-01-29 16:05:47

用R分析时间序列(time series)数据的相关文章

《数学建模:基于R》——1.1 数据的描述性分析

1.1 数据的描述性分析 在建立随机模型之前,首先要分析数据的主要特征,也就是数据的数字特征.这些特征通常是均值.方差,或者是数据服从什么分布.只有在确定了这些特征之后,才能建立起符合实际的模型. 本节介绍数据的描述性分析的统计方法,以及完成此类分析的R函数. 1.1.1 数据的数字特征 1.1.2 随机变量的分布 1.随机变量 从一个总体中抽取不同的样本,分析各个样本所获得的点估计往往不尽相同,这种表现出变异性特征的量称为变量. 在进行统计试验以前,一般并不知道某一试验的确切结果,但是可以赋予

《构建实时机器学习系统》一3.3 利用 Pandas 分析实时股票报价数据

3.3 利用 Pandas 分析实时股票报价数据 熟悉一项软件的最好方法就是通过示例来亲自使用它.这里将会通过分析苹果公司 2015 年 8 月 3 日秒级股票价格的数据来熟悉 Pandas 的用法.建议通过Python 笔记本或交互式窗口的方法来进行下面的操作. 首先,需要导入相关的模块,在导入Pandas模块的同时,我们还用到了Datetime模块.Datetime模块的主要功能是对时间.日期等数据进行处理,导入命令如下: import pandas as pd from datetime

《R的极客理想—工具篇》—— 2.1 R语言时间序列基础库zoo

2.1 R语言时间序列基础库zoo 问题 R语言怎么处理时间序列数据? 引言 时间序列分析是一种动态数据处理的统计方法,通过对时间序列数据的分析,我们可以感觉到世界正改变着什么!R语言作为统计分析的利器,对时间序列处理有着强大的支持.在R语言中,单独为时间序列数据定义了一种数据类型zoo,zoo是时间序列的基础,也是股票分析的基础.本节将介绍zoo库在R语言中的结构和使用. 2.1.1 zoo包介绍 zoo是一个R语言类库,zoo类库中定义了一个名为zoo的S3类型对象,用于描述规则的和不规则的

R语言是如何增强数据科学

当今数据科学领域最流行的工具之一是开源编程语言R语言,它广泛的应用于各个领域.简单来说,R语言就是一种数据语言.过去的20年间,全世界的统计学家已经为开源语言R语言做出了许多创新性的贡献.这些贡献意味着,R语言开发者们能够找到一种方法来接触到那些边缘学科运算规则的资料库(不再受统计学知识的限制),从而能够很迅速地开发出智能分析应用程序.正是如此,R语言变得越来越好,非常受用户欢迎,应用的行业也更加广泛. 我们已经可以看到R语言的强大功能既适用于初创企业,也可以在传统企业中发挥作用:比如,挪威的e

R语言会成为大数据时代的现象级语言吗?

文章讲的是R语言会成为大数据时代的现象级语言吗,大数据虽然能为企业带来很多好处,但同时它也让开发人员们很是头痛,更为要命的是,开发人员渐渐发现传统编程语言不足以应付他们遇到的许多挑战. 数据科学家和开发人员在处理数据时往往会有以下几个选择: ·基于GUI的开发平台. ·C-based语言(如C,C ++和Java). ·R语言. R语言论坛博主Oliver Bracht曾经写过一篇关于R语言优点的主题帖子,并指出R比其他语言更适合处理更大的数据查询. Jan Wijffels在talkR会议上列

vb.net-如何使用VB.NET分析浏览器的流量数据

问题描述 如何使用VB.NET分析浏览器的流量数据 在实际中需要分析浏览器的当前网址,来路网址.所以想通过VB.NET分析出网卡流量还原出http://格式数据.来分离出自己想要的数据.VC的代码已经有了,但VB.NET就没有这方面的代码.直接转过来会出错.

网站分析工具中的数据与PPC报告数据不一致的原因

如果使用按点击付费(PPC)的网站,一般可以获得来自各个网络的报告.而这些数据与网站分析工具中的数据常会出现不一致的情况,主要因为有以下几种原因: 1.跟踪类型URLs:流失的PPC点击 跟踪类型的URLs需要在PPC账户中设置,以便区分来自搜索引擎,例如Google.com或Yahoo.com的自然点击和付费点击.例如,跟踪类型URLs可以通过在PPC账户中将登陆页面的URLs简单修改成www.mysite.com?source=adwords而得到.忘记或者设置错误跟踪类型URLs可能会导致

如何利用百度管理员工具简单分析网站近期优化数据

众所周知,网站优化过程中数据分析是必不可少的日常工作,尤其对于一个新手朋友而言,笔者建议最好去百度站长平台申请下百度站长工具,一般就是提交申请的网站,下载验证码到ftp用域名访问这个验证码文件即可验证成功,新申请的网站数据信息,一般数据需经过一天之后才会显示在百度网站管理员工具的后台,今天笔者以自己蓝田玉网站为例子进行分析下如何用百度管理员工具分析我们网站优化数据.   第一,分析网站的百度索引量.首先笔者第一张图放的是近一周百度对于自身网站索引量的分析,上周笔者通过观其站长工具查到自己网站收录

R语言中如何删除数据对象

  R语言中如何删除数据对象 首先需要打开R studio,新建文件脚本,[File]--[New Script]. 然后会发现,global environment这里之前代码留下的数据集非常麻烦,清除方法如下: 首先,写入 rm(A),即可清除相应object的数据(rm=remove).对比即可发现,之前的object已经被清除了. 想要一了百了,全部清除的时候,则输入代码:rm(list=ls()). 这段代码的含义是:清除全部对象,即用ls()列出全部对象名,用一个list将全部对象装