非平稳时间序列预测
Posted Go一起学统计
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了非平稳时间序列预测相关的知识,希望对你有一定的参考价值。
人们喜欢对时间序列数据做预测,然后做出相应控制策略,比如:人们想知道若干年后气候变化情况,产品销量情况,患病人数等等,那么什么是时间序列呢?时间序列是同一现象在不同时间上的相继观察值排列而成的序列,可分为平稳序列和非平稳序列。平稳序列是指在某个固定水平上波动,基本不存在趋势的序列;非平稳序列是指由趋势(T)、季节性(S)、周期性(C)这三种成分中的一种或几种组成的模型序列,除此之外非平稳序列中还含有随机性(I)。
趋势:通常观测数据在长期内呈上升或下降趋势,趋势可以是线性代的,也可以是非线性的。
季节性:一年内重复出现的周期性波动,季节是泛指,不一定是季度,也可以是月份等。
周期性:长期上看呈现一种波浪或振荡形变动,不同于季节性,周期性的时间通常在一年以上。
非平稳序列在建模时常见模型有加法模型和乘法模型,模型如下:
我们通常先抛出散点图看趋势,然后确定时序模型由哪些成分构成,然后做模型、预测数据。
当数据表现出来只有趋势项时,用Holt exponential smoothing模型。
Eg:已知重庆市2000年~2015年社会消费品零售总额(万元)和对外经济合作实际完成营业额(万美元)数据,预测2016~2018年的数据。
数据:
先看看数据分布散点图:
数据只包含趋势项,用Holt exponential smoothing模型。
预测结果:
关于社会消费品零售总额的预测结果:
AAN是模型类型,Holt exponential smoothing模型。
alpha控制水平指数下降,beta控制斜率的指数型下降。两参数取值范围都是[0,1],参数越大,越接近的观测值权重越大。
sigma是RMSE(平均残差平方和的平方根),反映的是数据离散程度,sigma越小预测的越精准。这里sigma值1337557,看着比较吓人,实际上原始数据是上千万的数据,这里的sigma比原始数据少一个量级,不过总的来说离散度还是有些高。
2016~2018三年的社会消费品零售总额预测结果为:71192540,78214432和85236323。后面四列是80%的置信区间和95%的置信区间,如2016年数据95%的置信区间为[68570976,73814104]。
这里有七个判定预测精度的数据,常用RMSE,就是上面出现的sigma值。
关于对外经济合作实际完成营业额的预测结果:
这里就不分析了。
两个变量预测效果图
当数据表现出趋势和季节性时,用Holt-Winters exponential smoothing模型,只需在代码中把ets(data,model=’’)中的model换成AAA。
然后我们会想到如果遇到既有季节性又有周期性的数据了,我们又将如何处理?
可以用Double-Seasonal Holt-Winters Forecasting模型,
函数为dshw(y, period1=NULL, period2=NULL, h=2*max(period1,period2),
alpha=NULL, beta=NULL, gamma=NULL, omega=NULL, phi=NULL,
lambda=NULL, biasadj=FALSE, armethod=TRUE, model = NULL),这里要感谢R语言中文社区里面的祝姓朋友,他(她)给我推荐的这个模型。
Holt exponential smoothing模型完整代码:
times<-read.csv('tm1.csv')#读取数据
attach(times)#方便下面直接输入tm1中的变量
par(mfrow=c(2,2))#图形按两行两列摆放
plot(年份,社会消费品零售总额)#画散点图
plot(年份,对外经济合作实际完成营业额)
#cran安不好,github都安装了4次才安好,我也是醉了
library(devtools)
#install_github('robjhyndman/forecast')#安装forecast包
library(forecast)
t1<-ts(社会消费品零售总额,start=2000,end=2015)#ts()函数存储为时序对象
get1<-ets(t1,model='AAN')#AAN为Holt exponential smoothing模型
get1
forecast(get1,3)#预测三个数据
par(mfrow=c(2,2))
plot(forecast(get1,3),xlab='年份',ylab ='社会消费品零售总额',main='社会消费品零售总额预测图')#画出预测图
accuracy(get1)#预测准确的的度量
t2<-ts(对外经济合作实际完成营业额,start=2000,end=2015)
get2<-ets(t2,model='AAN')
get2
forecast(get2,3)
plot(forecast(get1,3),xlab='年份',ylab ='对外经济合作实际完成营业额',main='对外经济合作实际完成营业额预测图')
accuracy(get2)
参考文献:
[1] [美]Robert I. Kabacoff.王小宁,刘撷芯,黄俊文等译.R语言实战(第二版)[M].北京:人民邮电出版社,2016
[2] 贾俊平,何晓群,金勇进.统计学(第四版)[M].北京:中国人民大学出版社,2009
以上是关于非平稳时间序列预测的主要内容,如果未能解决你的问题,请参考以下文章