R语言ARIMA预测交通流量
交通流量预测分析研究是智能运输系统的核心研究内容之一,实例使用ARIMA(p,d,q)-差分自回归移动平均模型,AR是自回归, p为自回归项; MA为移动平均,q为移动平均项数,d为时间序列成为平稳时所做的差分次数。所谓ARIMA模型,是指将非平稳时间序列转化为平稳时间序列,然后将因变量仅对它的滞后值以及随机误差项的现值和滞后值进行回归所建立的模型。ARIMA模型根据原序列是否平稳以及回归中所含部分的不同,包括移动平均过程(MA)、自回归过程(AR)、自回归移动平均过程(ARMA)以及ARIMA过程。
具体代码及描述如下:
-
##############################################ARIMA############################################
-
##############根据趋势定差分,使得满足平稳性#########本实例里只需进行一次差分即可##############
-
library(tseries)
-
library(DBI)
-
library(ROracle)
-
drv=dbDriver('Oracle')
-
conn=dbConnect(drv,'AQTS_ZHZX','AQTS_ZHZX','192.168.1.1:1521/jgyw')
-
rs=dbSendQuery(conn,"select d.gcsjrq, sum(ZLL) zll from dw_fact_flux d
-
where d.gcsjrq >= 20160201 and d.gcsjrq<20160308
-
group by d.gcsjrq
-
order by d.gcsjrq asc")
-
datad=fetch(rs)
-
lostjobOra <- apply(datad, 2, as.numeric)
-
graphics.off()
-
split.screen(c(1,3))
-
screen(1)
-
plot(lostjobOra[,2],type="b")
-
#如果序列有明显的指数趋势,故先对数列进行对数变换得到新的数列
-
#对具有明显线性趋势的数列常用的平稳化措施是差分
-
#lostjob <- log(lostjobOra[,2])#取对数可以消除数据波动变大趋势,
-
lostjob <- lostjobOra[,2]
-
df1 = diff(lostjob)#d=1阶差分,对数列进行一阶差分,可以消除数据增长趋势性和季节性
-
screen(2)
-
plot(df1,type = "b")
-
# s4_df1=diff(df1,4) # 对d=1阶差分结果进行k=4步(季节)差分
-
# screen(3)
-
# plot(s4_df1,type = "b")
-
##############对差分结果作ADF检验(单位根检验),确定其其是否为平稳性##################
-
##############p值小于默认p值(0.05),拒绝接受存在单位根的原假设######################
-
#####所以可以接受序列是平稳的。因为这就可以对序列进行ARMA模型分析了##################
-
adf.test(df1)
-
#实际上,我们是对一阶差分后的序列在进行ARMA建模,
-
#因此,建立的模型从原序列角度应该称为ARIMA模型,其中,差分部分的参数d=1.
-
#adfTest(df1,lag=6) #对差分结果进行平稳性检验
-
################模型的识别与定界,ARIMA(p,d,q)中的pq定阶##############################
-
#模型的识别与定阶主要是通过对序列的自相关和偏自相关观察得到的,可以看到自相关和偏自相
-
#关的拖尾性并不明显,因此考虑建立混合ARMA模型
-
###############模型选择的方法
-
#若平稳序列的偏相关函数是截尾的,而自相关函数是拖尾的,可断定序列适合AR模型
-
#若平稳序列的偏相关函数是拖尾的,而自相关函数是截尾的,则可断定序列适合MA模型
-
#若平稳序列的偏相关函数和自相关函数均是拖尾的,则序列适合ARMA模型
-
acf(df1,40)
-
pacf(df1,40)
-
##############建立arima模型,ARIMA(1,0,0),即为AR(1)##################
-
##模型参数的估计:ML表示参数的极大似然估计,CSS表示参数的条件最小二乘法以及混合方法CSS-ML估计
-
ansCd=arima(df1,order=c(1,0,1),method='ML') #ARMA(1,1)
-
ans=arima(lostjob,order=c(1,1,1),method='ML')
-
##############检验模型残差白噪声,最主要是残差序列的独立性检验##################
-
#P值大于0.05,则接受原假设,认为残差序列通过纯随机性检验
-
ar(df1)$order#确定lag,或者通过pacf确定
-
Box.test(df1,lag=5,type='Ljung')
-
Box.test(ans$residuals,lag=5,type='Ljung')
-
#Box.test(ansCd$residuals,lag=5,type='Ljung')
-
##############预测##################
-
predict(ans,10)
-
#######R语言中有专门的forecast包,包里的auto.arima函数可以对序列模型进行智能识别建模