用R做时间序列分析之ARIMA模型预测

第一步.对原始数据进行分析
一.ARIMA预测时间序列

指数平滑法对于预测来说是非常有帮助的,而且它对时间序列上面连续的值之间相关性没有要求。但是,如果你想使用指数平滑法计算出预测区间,那么预测误差必须是不相关的, 而且必须是服从零均值、 方差不变的正态分布。即使指数平滑法对时间序列连续数值之间相关性没有要求,在某种情况下,我们可以通过考虑数据之间的相关性来创建更好的预测模型。自回归移动平均模型( ARIMA) 包含一个确定(explicit)的统计模型用于处理时间序列的不规则部分,它也允许不规则部分可以自相关。

二.确定数据的差分

ARIMA 模型为平稳时间序列定义的。 因此, 如果你从一个非平稳的时间序列开始,首先你就需要做时间序列差分直到你得到一个平稳时间序列。如果你必须对时间序列做 d 阶差分才能得到一个平稳序列,那么你就使用ARIMA(p,d,q)模型,其中 d 是差分的阶数。
以每年女人裙子边缘的直径做成的时间序列数据为例。
先导入数据:
###导入在线数据,并跳过前5行
skirts <- scan(“http://robjhyndman.com/tsdldata/roberts/skirts.dat”,skip=5)
skirts<- ts(skirts,start = c(1866)) #设定时间1866开始
plot.ts(skirts) #画出图
键入下面的代码来得到时间序列(数据存于“skirtsts”) 的一阶差分, 并画出差分序列的图:
skirtsdiff<-diff(skirts,differences=1)   #一阶差分
plot.ts(skirtsdiff)   #画图
二次差分(上面)后的时间序列在均值和方差上确实看起来像是平稳的, 随着时间推移,时间序列的水平和方差大致保持不变。

第二步,找到合适的ARIMA模型

如果你的时间序列是平稳的,或者你通过做 n 次差分转化为一个平稳时间序列, 接下来就是要选择合适的 ARIMA模型,这意味着需要寻找 ARIMA(p,d,q)中合适的 p 值和 q 值。为了得到这些,通常需要检查[平稳时间序列的(自)相关图和偏相关图。
我们使用 R 中的“acf()”和“pacf” 函数来分别(自) 相关图和偏相关图。“acf()”和“pacf 设定“plot=FALSE” 来得到自相关和偏相关的真实值。
acf(skirtsdiff2,lag.max=20)
acf(skirtsdiff2,lag.max=20,plot=FALSE)
自相关图显示滞后1阶自相关值基本没有超过边界值,虽然5阶自相关值超出边界,那么很可能属于偶然出现的,而自相关值在其他上都没有超出显著边界,而且我们可以期望 1 到 20 之间的会偶尔超出 95%的置信边界。
pacf(skirtsdiff2,lag.max=20)
pacf(skirtsdiff2,lag.max=20,plot=FALSE)
偏自相关值选5阶。
故我们的ARMIA模型为armia(1,2,5)
skirtsarima<-arima(skirts,order=c(1,2,5))
skirtsarima
预测后5年裙子的边缘直径
install.packages(“forecast”)
library(forecast)
skirtsarimaforecast<-forecast(skirtsarima,h=5,level=c(99.5))
skirtsarimaforecast
输入下面指令,得到残差图像:
plot.forecast(skirtsarimaforecast$residuals)
注(补充):auto.arima自动给出估计值
为了尽量避免因个人经验不足而导致的模型识别不准确的问题,R提供了auto.arima函数。该函数基于信息量最小原则自动识别模型阶数,并给出了该模型的参数估计值。需要先加载zoo和forecast.
library(zoo)
library(forecast)
auto.arima(x,max.p = ,max.q= ,ic)
-x:需要定阶的序列名。
-max.p:自相关系数的最高阶数,不特殊指定的话,系统的默认值为5。
-max.q:移动平均系数最高阶数,不特殊指定的话,系统的默认值为5。
-ic:指定信息量准则。有“aicc”,“aic”,“bic”三个选型,系统默认AIC准则。
有时选择不同的信息量准则会导致模型的识别阶数不同,有时系数指定的模型阶数高于真实阶数。

第三步,检验

在指数平滑模型下, 观察 ARIMA 模型的预测误差是否是平均值为 0 且方差为常数的正态分布(服从零均值、方差不变的正态分布) 是个好主意,同时也要观察连续预测误差是否(自)相关。
acf(skirtsarimaforecast r e s i d u a l s , l a g . m a x = 20 ) B o x . t e s t ( s k i r t s a r i m a f o r e c a s t residuals,lag.max=20) 输入下面指令: Box.test(skirtsarimaforecast residuals, lag=20, type=“Ljung-Box”)
为了调查预测误差是否是平均值为零且方差为常数的正态分布(服从零均值、方差不变的正态分布),我们可以做预测误差的时间曲线图和直方图(具有正态分布曲线):
plot.ts(skirtsarimaforecast$residuals)

发布了30 篇原创文章 · 获赞 0 · 访问量 343

猜你喜欢

转载自blog.csdn.net/hua_chang/article/details/105035114