R语言在时间序列分析中的应用(二)
(2013-04-19 00:01:50)
标签:
rarma教育 |
R语言在时间序列分析中的应用(二)
http://wenku.baidu.com/view/6efb18c8d5bbfd0a7956734c
六、ARMA模型模拟与识别
模型 |
自相关系数 |
偏自相关系数 |
AR(P) |
拖尾 |
P阶截尾 |
MA(q) |
q阶截尾 |
拖尾 |
ARMA(p,q) |
拖尾 |
拖尾 |
-
-
注意这个函数不能生成非平稳序列。
(1)AR(1) :
D = arima.sim ( list( order = c(1, 0, 0), ar=0.8 ), n = 200 )
plot(D) ;
par(mfrow=c(1,2)) ; acf(D) ; pacf(D)
(2)AR(2) :
D = arima.sim ( list( order = c(2, 0, 0), ar=c(0.8,0.1) ), n = 200 )
(2)MA(2) :
##这里符号我还没验证是指正还是指负。
可以明显看出pacf的拖尾性,与acf的二阶截尾性。
(2)MA(2) :
D = arima.sim ( list( order = c(2, 0, 2), ar=c(0.3,0.4),ma=c(0.5,0.4) ), n = 200 )
七、ARMA模型的估计
对于一个给定的序列,如何用R求出相关的参数呢?
-
-
-
-
另一个可用的函数是auto.arima(),这个函数在forecast包里,它的估计依据是AIC/BIC标准。尤其对ARMA模型定阶困难时,可以考虑用auto.ARIMA。
现在模拟生成一个ARMA(2,2)的时间序列,然后分别运用两个函数进行估计。
library(forecast);
arima()的估计结果:
Coefficients:
s.e.
arima.auto()的估计结果:
Coefficients:
s.e.
可以看到两者的结果是一样的,也基本接近模拟时设定的参数。
但是还是存在一些困难难以克服。在我们难以定阶时,尤其是ARMA(p,q)模型中,难以确定arima() 函数中的阶数,因为我们并不知道p,q真正是多少。而在试验过程中,我测试了多组时序数据,在样本量200时auto.arima()确定的阶数也常常和模拟的参数不一样,这就是说auto.arima的结果(即AIC准则结果)经常不准确。
不过,在评价模型结果时,可以采取这样的标准:只要残差序列为纯随机序列,就可以认为模型已经建立成功。可以这样获取残差序列:
resid=ARIMA$residual
八、ARMA模型的预测
-
-
predict() 将会返回两个时间序列数据。一个是$pred,即点预测,另一个是$se即对应的估计误差。
下面给出一个较为完整的例子:
D = arima.sim ( list( order = c(2, 0, 2), ar=c(0.5,-0.2),ma=c(0.5,0.2) ), n = 100 )
plot(D)
;
par(mfrow=c(1,2)) ; acf(D) ; pacf(D)
ARIMA=arima(D,order=c(2,0,2),method="ML",include.mean=FALSE)
summary(ARIMA)
library(forecast)
ARIMA.auto=auto.arima(D)
summary(ARIMA.auto)
resid=ARIMA $residual
Box.test(resid,lag=6)
Box.test(resid,lag=12)
pre=predict(ARIMA,n.ahead=10)
U=pre$pred + 1.96*pre$se
L=pre$pred - 1.96*pre$se
ts.plot(D,pre$pred,col=1:2)
lines(U,col="blue",lty="dashed")
lines(L,col="blue",lty="dashed")
pre2=forecast.Arima(ARIMA,h=10,level=c(0.95))
pre2
plot.forecast(pre2)