更多地设计做时间序列的思路
#产生时间序列数据
#产生规则的时间序列,frequency=1,4,12分别对应年度,季度,月度
timeseries = ts(x,start=c(1940,01),frequency=1)
#产生不规则的时间序列
library(zoo)
#以天为单位的时间序列
date = seq(as.Date("2012-01-01"),length=500,by="day")
timeseries = zoo(1:500,date)
#读入数据
kings = scan("http://robjhyndman.com/tsdldata/misc/kings.dat",skip=3)
#转化成ts格式,frequency=1,4,12分别对应年度季度,月度
#要生成以天为单位的数据,只好生成一列时间序列数
kingsts = ts(kings,start=c(1940),frequency=1)
#有了数据,下一步就是用Box.test()检验纯随机性,根据P值可以轻易判断
Box.test(kingsts,lag=1,type="Box-Pierce") #缺点是只可以做某一阶的判断
#可以生成各阶检验的结果汇总表,一般是检验1到12阶,一般短期延迟之内不存在相关关系,长期之内更不会有
#通过type = c("Box-Pierce", "Ljung-Box")控制方法,分别是Q统计量(大样本)、LB统计量(小样本)
lag = c()
Q.value = c()
p.value = c()
for(i in 1:12){
test = Box.test(kingsts,lag=i,type="Ljung-Box")
lag[i] = i
Q.value[i] = test$statistic
p.value[i] = test$p.value
}
data.frame(lag=lag,Q.value=Q.value,p.value=p.value)
#观察随机性检验的结果,如果是纯随机序列,没有再分析的必要了
#上述的结果表明该序列不是纯随机序列,可认为是非随机的
#下一步就是平稳性检验,方法有:
#1、时序图检验,就是简单的观察是否平稳,直接plot()即可
#2、自相关图检验,平稳序列会快速趋向0
acf(kingsts) #自相关图
pacf(kingsts) #偏自相关图
#3、单位根检验
#平稳性检验之后,如果是不平稳就有确定性分析和随机性分析,下面先是随机性分析
#可以知道kingsts是非平稳的
#这里不讲平稳序列,因为这会在后面被不平稳序列分析覆盖到
#随机性分析,先做差分使其平稳
kingstsdiff1 = diff(kingsts,differences=1)
plot.ts(kingstsdiff1) #观察图像
#进一步通过单位根检验是否平稳,这里图像观察已经平稳了
#平稳后就是确定ARIMA模型的阶数了
#可以观察自相关图、偏自相关图来确定,acf(),pacf()操作即可
#也可以用forecast包的auto.arima()自动识别最优的姐阶数,识别标准的参数ic=c("aicc", "aic", "bic")
library(forecast)
auto.arima(kingsts)#这里可以分别试下AIC和BIC准则下给出来的模型阶数是否一样,不一样的话可以再分析选择
#知道模型的阶数之后,拟合模型,得出模型参数,参数估计方法method = c("CSS-ML", "ML", "CSS")
fit = arima(kingsts,order=c(0,1,1))
#拟合模型后,并不能马上用于预测,还要观察模型的性质怎样,参数显著性,残差序列是否纯随机、是否同方差
#首先检验模型的参数是否显著,通过T检验就可
#再检验残差的纯随机性,如果残差序列是随即的话,表明有用信息被提取的很干净,
#否则表明相关信息还没提取干净,需要重新选择模型(不建议),一般是对残差序列做自回归(残差自回归模型)
tsdiag(fit) #图像观察法
Box.test(fit$residuals,type="Ljung-Box",lag=6, fitdf=1) #更严密的检验方法
#检验1到12阶的函数
lag = c()
Q.value = c()
p.value = c()
for(i in 1:12){
test = Box.test(fit$residuals,lag=i,type="Ljung-Box", fitdf=1)
lag[i] = i
Q.value[i] = test$statistic
p.value[i] = test$p.value
}
data.frame(lag=lag,Q.value=Q.value,p.value=p.value)
#还有一个是DW检验(不好用,有误差),所以由DW检验衍生Durbin h和Duebin t统计量,这也是常用的自变量相关检验方法,不过在R中不知道怎么做
#上述结果表明残差序列时随机的。如果是非随机的,就要做残差自回归了
#检验是否异方差
#残差平方图,观察法
plot(fit$residuals*fit$residuals)
#更严谨的检验方法有G-Q检验(各种不好,勿用),还有White检验(回归模型中可以用,时间序列不太适合),
#ARCH检验,包括Portmanteau Q检验、LM检验,其实ARCH检验跟white检验并没有本质上的区别,只不过更适合于时间序列数据
library("FinTS") #ARCH检验的包,ArchTest(),不过只能ARCH_LM检验(检验残差平方序列是否随机的)
AutocorTest(fit$residuals) #该包用AutocorTest()还可以检验残差序列的序列相关性(等同于Box.test()检验随机性的作用)
ArchTest(fit$residuals,lags=12)
#写成一个函数检验1到12阶的
lag = c()
LM.value = c()
p.value = c()
for(i in 1:12){
test = ArchTest(fit$residuals*fit$residuals,lags=i)
lag[i] = i
LM.value[i] = test$statistic
p.value[i] = test$p.value
}
data.frame(lag=lag,LM.value=LM.value,p.value=p.value)
#观察上述的结果,在0.02水平下,残差平方序列是纯随机的,在0.05下,是非随机的
#当残差平方序列是非随机的,然后拟合GARCH(ARCH是GARCH当p=0时的特例)
library("fGarch")
#如果是没什么毛病的模型的预测,forecast包的forecast()函数
x = forecast(fit,h=5,level=99.5)
plot.forecast(x)
#还可以画出置信区间