时间序列建模一例

#部分运行结果以注释的形式给出,这段代码主要展示了时间序列模型识别,定阶,参数估计,模型判断的R语言示例
data(sunspots)
mean(sunspots)#51.26596
var(sunspots)#1887.813
fivenum(sunspots)#0.00  15.70  42.00  74.95 253.80
plot(sunspots,type="b",xlab="i",ylab=expression(X[i]),col=2)
#趋势分析
decompose(sunspots)#$figure
 #[1] -2.1619020 -0.1085010 -1.2754348 -0.2400181  1.1422112  0.2472504
 #[7]  0.1120830  0.7560467  1.0681372  0.6220011 -0.5170302  0.3551564
#没有很强的季节性,季节性指数大多在0附近。
plot(decompose(sunspots))
#没有季节性,趋势性不明显,没有增长趋势,这也是符合自然常识的。
adf.test(sunspots)
#数据仍然有非常好的平稳性
par(mfrow=c(1,2))
acf(sunspots)
pacf(sunspots)#see picture 5
#这里可以看出acf没有明显的周期性,
sunspots1<-diff(sunspots,lag=1)#从acf来看,一阶差分是有必要的
adf.test(sunspots1)#stationary
par(mfrow=c(1,2))
acf(sunspots1)
pacf(sunspots1)
stl(sunspots1,"per")
plot(stl(sunspots1,"per"))
par(mfrow=c(2,1))
acf(sunspots1)
pacf(sunspots1)#得到了非常好的平稳性数据,那么前面做的平稳性检验错了吗?
#从acf来看,差分后的数据应该是一个ar(2)模型,给出模型估计
ar2<-arima(sunspots1,order=c(2,0,0))
ar2
#Coefficients:
#          ar1      ar2  intercept
#      -0.3629  -0.2064    -0.0096
#s.e.   0.0184   0.0184     0.1926
#sigma^2 estimated as 257.3:  log likelihood = -11823.37,  aic = 23654.74
#建模确定为arima(2,1,0)
sunspots.fit1<-arima(sunspots,order=c(2,1,0))
#arima(x = sunspots, order = c(2, 1, 0))
#Coefficients:
#          ar1      ar2
#      -0.3629  -0.2064
#s.e.   0.0184   0.0184
#sigma^2 estimated as 257.3:  log likelihood = -11823.37,  aic = 23652.74
library(forecast)
sunspots.forecast1 <- forecast(sunspots.fit1,12)
plot.forecast(sunspots.forecast1)
#前面的时间序列文章中我们曾确定使用ar(2)模型,这个模型好吗?
sunspots.fit<-arima(sunspots,order=c(2,0,0))
#arima(x = sunspots, order = c(2, 0, 0))
#Coefficients:
#         ar1     ar2  intercept
#      0.6704  0.2722    51.2642
#s.e.  0.0181  0.0181     5.2842
#sigma^2 estimated as 262.8:  log likelihood = -11858.25,  aic = 23724.5
#思考:从aic判定角度来看,差别并不是十分大,这是不是说明了通过平稳性检验未必见得是真正平稳的,可能一阶差分后效果更好?
library(forecast)
sunspots.forecast <- forecast(sunspots.fit,12)
plot.forecast(sunspots.forecast)
#用pandit-wu法处理
aico=resi<-matrix(0,nrow=6)
for (i in 1:6) {
a<-arima(sunspots,order=c(2*i,1,2*i-1))
aico[i]<-a$aic
resi[i]=sum(a$resi^2)
}
aico
# 首先对ARMA(2,1)和ARMA(4,3)作F检验:
F<-(resi[1,1]-resi[2,1])*2809/(4*resi[2,1])  #s=4,p+q=7 N1=2820-2-2 length(sunspots)
F<qf(0.95,4,2089)#FALSE
#这与课堂上的结论不符,ARMA(4,3)是有显著改进的
F<-(resi[4,1]-resi[5,1])*2791/(4*resi[5,1])
F<qf(0.95,4,2791)#FALSE
F<-(resi[5,1]-resi[6,1])*2785/(4*resi[6,1])
F<qf(0.95,4,2785)#TRUE
arima(sunspots,order=c(10,0,9))#ar10 0.3924 se 0.0283 利用t检验知最高项系数不为0
aico1=resi1<-matrix(0,nrow=9)
for (i in 1:9) {
a<-arima(sunspots,order=c(10,0,i))
aico1[i]<-a$aic
resi1[i]=sum(a$resi^2)
}
aico1
F<-(resi1[8,1]-resi1[9,1])*2785/(resi1[8,1])
F<qf(0.95,4,2785)#FALSE,说明这里ma的阶数不可以降,所以选择模型arma(10,9)
sunspots.fit2<-arima(sunspots,order=c(10,0,9))#AIC=23473.9
#从AIC的角度来看,这个模型确实更好,但也更加的繁琐,从预测来看效果也没提高多少
library(forecast)
sunspots.forecast2 <- forecast(sunspots.fit2,12)
plot.forecast(sunspots.forecast2)
#做残差检验,来判断模型
Box.test(sunspots.fit1$residuals)#ARIMA(2,1,0)   p-value = 0.1031
Box.test(sunspots.fit$residuals)#AR(2) p-value = 0.006665
Box.test(sunspots.fit2$residuals)#ARMA(10,9)  p-value = 0.9418
#综上,sunspots模型确定为ARIMA(2,1,0)最好

你可能感兴趣的:(时间序列建模一例)