时间序列分析与建模

1 时间序列的分解

1.1 wold分解定理

对于任意一个离散平稳过程{Xt},他都可以分解为两个不相关的平稳序列之和,其中一个为确定性的,另一个是随机性的。记为Xt=Vt+Et。

1.2 Cramer分解定理

任何一个时间序列{Xt}都可以分解为两部分的叠加,其中一部分是有多项式决定的确定性趋势成分,另一部分是平稳的零均值误差成分。记为Xt=Ut+Et。

1.3 确定性因素分析

最常用的确定性分析法是确定因素分解方法,该方法产生于长期的观察与实践。大致可分为四大类因素的综合影响。
(1)长期趋势。该因素的影响会导致序列呈现出明显的长期递增、递减趋势。
(2)循环波动。该因素会导致序列呈现出从高到底再由从低到高的反复循环波动。
(3)季节性变化。该因素会导致序列呈现出和季节变化相关的稳定的周期波动。
(4)随机波动。除了以上三种外,序列还会受到其他各种因素的综合影响,而这些影响会导致序列呈现一定的随机波动。
假定这四种因素主要有两种相互作用模型。加法模型:Xt=Tt+C
t+St+It。乘法模型:Xt=Tt.Ct.St.It。

1.4 趋势分析

有些时间序列具有非常显著的线性趋势,又是我峨嵋你分析的目的就是要找到序列中的趋势,并利用这些趋势对序列未来的发展做出合理的预测。

1.5 趋势拟合法

趋势拟合法是将时间作为自变量,相应的序列观察值作为因变量,建立序列值随时间变化的回归模型的方法。根据序列所表现出的线性或非线性特征,拟合方法可以分为线性拟合与曲线拟合。

1.5.1 线性拟合

如果长期趋势呈现出线性特征,那么我们可以用线性模型来拟合,模型的具体形式为:Xt=a+bt+It。It为随机波动,a+bt是为了显出随机波动的影响之后的该序列的长期趋势。在R语言中可以使用lm()函数来拟合线性趋势。格式为lm(Y~a+X1+X2+…+Xn,data=)。其中Y是影响变量,a为常数项,默认为1,X为自变量。data为数据框,传入数据。

例题
线性趋势分析。澳大利亚政府1981-1990年每季度消费支出。

#读入数据
library("readxl")
x<-read_xlsx("E:/R语言时间序列/4-3.xlsx")
#构建时间自变量
t<-c(1:40)

#拟合模型
x.fit<-lm(x$消费支出~t)

#查看拟合信息
summary(x.fit)

#绘制拟合效果图
x<-ts(x)
plot(x)
abline(lm(x~t),col=2)

在这里插入图片描述
从模型汇总的结果来看,常熟为8502.496,t的系数为89.070。P值都小于0.05,即模型的鲜果是显著的,和检验通过。因此可以得到线性模型为:Xt=8502.496+89.070t+Et,Et~N(0,432.4^2)。现在将绘制模型的拟合图。
在这里插入图片描述
从模型的拟合图来看,红色的为拟合的线,可见真实值大致均匀的分布在红线的两侧。

1.5.2 曲线拟合

如果长期趋势呈现出非线性特征,那么我们就用曲线模型来拟合它。对曲线模型进行参数估计时,要将能转化乘线性模型的都转换为线性模型,用线性最小二乘法进行参数估计,或者迭代法进行参数估计。R语言拟合非线性模型也可以分为两类。一是写成关于时间t的多项式,再用lm()函数拟合;另一类则是用nls()函数解决非线性模型的拟合。函数格式为:nls(Y~f(X1,…,X2),data=,start=)。

例题
对我国1949-2008年的化肥产量进行曲线拟合。

#曲线拟合
library("readxl")
data<-read_xlsx("E:/R语言时间序列/12.xlsx")
data1<-ts(data$化肥产量,start = 1949)

#  lm()函数拟合
t1<-c(1:60)
t2<-t1^2
data1.fit<-lm(data1~t1+t2)
summary(data1.fit)

#  nls()函数拟合
data1.fit1<-nls(data1~a+b*t1+c*t1^2,start = list(a=1,b=1,c=1))
summary(data1.fit1)

lm()函数拟合
在这里插入图片描述
从拟合结果来看,P值都小于0.05,即模型的显著性效果好,模型的检验通过。
nls()函数拟合
在这里插入图片描述
根据nls()函数拟合的结果来看,他与lm()函数拟合的结果时一致的。因此我们可以得到1949-2008年我国花费参量序列的拟合模型为:Xt=318.0479-57.6974t+2.3552t^2+et。
接着我们进行绘制拟合图

#拟合图形展示
tu<-predict(data1.fit1)
tu<-ts(tu,start = 1949)
plot(data1,type="p")
#添加趋势线
lines(tu,col=2,lwd=2)

在这里插入图片描述

1.6 平滑法

平滑法是进行趋势分析和预测时常用的一种方法,它主要时削弱短期随机波动对序列的影响,使序列平滑化,从而显示出变化的规律。平滑分分为移动平均法与指数平滑法。

1.6.1 移动平均法

移动平均法的基本思想是对于一个时间序列{Xt},我们可以假定在一个比较短的时间间隔里,序列的取值是比较稳定的,他们的差异主要是有随机波动造成的。根据这种假定,我峨嵋你可以用一定时间间隔内的平均值作为下一期的估计值。在R语言中,TTR函数包中的SMA()函数是专门做简单移动平均趋势拟合的函数。SMA()函数的格式为:SMA(x,n=)。
对1949-1998年北京市每年最高气温序列机型五期移动平均。

library("readxl")
library("TTR")
data<-read_xlsx("E:/R语言时间序列/气温.xlsx")
x<-ts(data$温度,start=1949)
#调用函数,并给出移动期数
x.ma<-SMA(x,n=5)
#绘制移动平均拟合图
plot(x,type="o")
lines(x.ma,col=2,lwd=2)

在这里插入图片描述
从结果来看,给出了每年的一个平均气温,没五期为一个预测单位。最后给出五期移动平均拟合图。
在这里插入图片描述
从北京市最高气温5期移动平均可以看出,北京市每年的最高气温集中在36-38度中间。在该范围内随机波动。

1.6.2 指数平滑法

指数平滑分为三种,分别为:简单指数平滑,Holt两参数指数平滑,以及Holt-winters三参数指数平滑。在R语言中,Holt-winters函数可以拟合上述三种指数平滑,函数格式为:HoltWinters(x,alpha=,beta=,gamma=,seasonal=)。其中x为指数平滑的序列名,alpha为随机波动部分参数,beta为趋势部分参数,gamma为季节部分参数。其中有规定:
(1)当alpha不指定,beta=F,gamma=F时,拟合简单指数平滑;
(2)当alpha与beta不指定,gamma=F时,拟合Holt两参数指数平滑;
(3)当alpha,beta,gamma都不指定时,拟合Holt-winters三参数指数平滑。
(4)seasonal=“additive”表示加法模型,seasonal=“multiplication”表示乘法模型。

对1964-1999年中国纱年产量序列进行Holt两参数指数平滑,并预测未来十年的中国纱产量。

#两参数指数平滑
#纱产量预测
library("readxl")
library("forecast")
data1 <-read_xlsx("E:/R语言时间序列/纱产量.xlsx")
x<-ts(data1$产量,start = 1964)
#进行两参数平滑
x.fit<-HoltWinters(x,gamma = F)

在这里插入图片描述
上图为未来十年中国纱产量的预测结果,在结果中,给出了置信水平为80%与95%的置信区间。下面我们绘制两参数指数平滑拟合效果图。

#绘制两参数指数平滑拟合效果图
plot(x.fit)

在这里插入图片描述
在上面的两参数指数平滑拟合效果图中,红色的线为两参数平滑拟合,可见拟合效果很好,基本上跟原始数据吻合。从该图来看,没有之后序列为挂插值序列,滞后为序列Holt两参数指数平滑。下面我们绘制未来十年产量的纱产量的预测图。

#预测序列并绘制预测效果图
x.fore<-forecast(x.fit,h=10)
plot(x.fore)

在这里插入图片描述
上图为预测未来十年的纱产量,前部分黑色的线为原始数据,后面灰色部分为预测值与预测值的置信区间,蓝色的线为预测值,深色的区域为80%的置信区间,浅色的区域为95%的置信区间。

对1962年1月到1975年12月平均每头奶牛产奶量序列,进行三参数指数平滑,并预测未来两年平均产奶量。

#三参数指数平滑
library("readxl")
library("forecast")
data2 <-read_xlsx("E:/R语言时间序列/产奶量.xlsx")
x<-ts(data2$平均产奶量,start=c(1962,1),frequency=12)
#进行三参数指数平滑
x.fit<-HoltWinters(x)
#绘制三参数指数平滑拟合效果图
plot(x.fit)

在这里插入图片描述
从结果来看,三参数指数平滑拟合效果图没有滞后序列为观察值,之后序列为Holt两参数指数平滑。接下来我们进行未来两年预测。

#预测序列并绘制预测效果图
x.fore<-forecast(x.fit,h=24)
plot(x.fore)

在这里插入图片描述
上图为未来两年每头奶牛每月平均产奶量的预测值,分别给出了80%,95%的置信区间。下面进行拟合预测效果图。

#预测序列并绘制预测效果图
x.fore<-forecast(x.fit,h=24)
plot(x.fore)

在这里插入图片描述

1.7 综合分析

在确定性影响很强时,可以选择合适的确定性模型。在R语言中,进行确定性因素分解的函数是decompose(),函数的格式为:decompose(x,type=),其中x为序列名,type为模型类型,有加法模型additive,乘法模型multiplicative。

对1993-2000年中国社会消费屏零售总额序列进行确定性因素分解。

#零售消费总额
#绘制时序图
library("readxl")
data3 <-read_xlsx("E:/R语言时间序列/零售消费总额.xlsx")
x<-ts(data3$消费总额,start=c(1993,1),frequency=12)
plot(x)

在这里插入图片描述
从时序图来看,消费零售总额有单调递增趋势。接下来进行因素分解与绘制季节指数图

#确定性因素分解
x.fit<-decompose(x,type = "mult")

#查看季节指数,并绘制季节指数图
x.fit$figure
plot(x.fit$figure,type = "o")

在这里插入图片描述
上面为季节消费指数。
在这里插入图片描述
查看趋势拟合值,并绘制趋势拟合图

#查看趋势拟合值,并绘制趋势拟合图
x.fit$trend

#绘制趋势拟合图
plot(plot(x.fit$trend))

在这里插入图片描述
在这里插入图片描述
从趋势拟合图来看,我国消费平零售总额有单调递增趋势。
查看随机波动值(残差),并绘制残差图

#查看随机波动值(残差),并绘制残差图
x.fit$random
plot(x.fit$random)

在这里插入图片描述
下面我们可以将所有的图合到一个图中,即有“

plot(x.fit)

在这里插入图片描述
由此来看,该图包含了前面的4中图形,当我们不想一个一个分解研究时,可以直接绘制一个总的图。

2 非平稳序列的随即分析

2.1 差分运算

在R语言中,diff函数可以完成各种差分运算,其函数格式为:diff(下,lag=,differences=),其中x时变量名,lag为差分的步长,默认为1,differences为差分次数,默认为1.diff函数的参数定义为,形式为diff(x,d,k),意思表示进行k次差分,d步差分。1阶差分diff(x),2阶差分diff(x,1,2),k阶差分diff(x,1,k),d步差分diff(x,d,1)。一阶差分后在进行d步差分diff(diff(x),d)。差分的选择方式有三种,根据不同的特点选择不同的差分形式。

2.1.1序列蕴含显著的线性趋势,1阶差分可以实现平稳

对1964-1999年中国纱产量序列蕴含一个近似线性的递增趋势。现在对线性趋势进行1阶差分运算。

#差分运算
library("readxl")
data1 <-read_xlsx("E:/R语言时间序列/纱产量.xlsx")
x<-ts(data1$产量,start = 1964)
x.dif<-diff(x)
plot(x.dif)

在这里插入图片描述
从差分后的时序图来看,1阶差分运算后已经成功的从原序列中提取线性趋势,差分后序列呈现出非常平稳的随机波动。

2.1.2 序列蕴含曲线趋势,通常使用低阶差分运算就可以提取出曲线趋势的影响

1950-1999年北京市民用车量拥有序列的确定性信息。

#2阶差分
library("readxl")
data4<-read_xlsx("E:/R语言时间序列/车辆拥有量.xlsx")
x<-ts(data4$车辆拥有量,start=1950)
plot(x)
#1阶差分
x.dif<-diff(x)
plot(x.dif)
#2阶差分
x.dif1<-diff(x,1,2)
plot(x.dif1)

原始数据的时序图,从时序图来看,具有单调递增的趋势。
在这里插入图片描述
现在进行1阶差分运算
在这里插入图片描述
从图来看原来的曲线变为了有一点规律的趋势,提取不够充分,因此我们进行2阶差分运算。
在这里插入图片描述
从图可知,进行2阶差分运算后,比较充分的提取了原序列中蕴含的长期趋势,使得差分后序列不在呈现确定性趋势。

2.1.3 蕴含固定周期的序列

对于蕴含固定周期的序列进行步长为周期长度的差分运算,通常可以较好的提取周期信息。
利用差分运算提取每头奶牛月平均产量序列的确定性信息

#周期差分运算
library("readxl")
data5 <-read_xlsx("E:/R语言时间序列/产奶量.xlsx")
x<-ts(data5$平均产奶量,start=c(1962,1),frequency=12)
plot(x)
#1阶差分
x.dif<-diff(x)
plot(x.dif)
#1阶差分,12步差分
x.dif_12<-diff(diff(x),12)
plot(x.dif_12)

原始数据时序图。
在这里插入图片描述
从图来看,具有明显的线性递增的长期趋势和一个周期长度为1年的稳定季节变动。下面我们进行差分运算。先进行1阶差分运算,提取线性递增趋势。
在这里插入图片描述
从1阶差分后线性递增信息被提取,1阶差分后序列具有稳定的季节波动与随机波动。对1阶差分后在进行12步的周期差分,提取季节波动信息。并绘制差分后的时序图。
在这里插入图片描述
从12步差分运算结果时序图来看,周期信息已经被提取,差分运算较为充分的提取了原序列中的季节效应和长期周期趋势效应等确定性信息。

2.2 ARIMA模型

ARIMA模型又名随机游走模型,记为ARIMA(p,d,p)模型。

2.2.1 平稳性

现在拟合一个随机游走模型。Xt=Xt_1+Et。Et~NID(0,100).

#拟合随机游走模型
x<-arima.sim(n=1000,list(order=c(0,1,0)),sd=10)
plot(x)

在这里插入图片描述
从图来看,该序列为一个非平稳序列。

2.2.2 方差齐性

对于ARIMA(p,d,q)模型,当d不等于0时,不仅均值非齐性,序列方差页非齐性。

2.2.3 ARIMA建模

(1)首先绘制原始数据的时序图
在这里插入图片描述
从时序图可知,该序列具有线性趋势,因此我们需要进行1阶差分运算。
(2)进行1阶差分运算,并绘制差分运算后的时序图
在这里插入图片描述
从1阶差分后的序列的时序图可知,序列在均值附近比较稳定的波动。因此可借助差分后序列自相关图进一步观察差分后序列的平稳性。
(3)绘制差分后的自相关图和偏自相关图
在这里插入图片描述
从上图的系相关图可以看出,除了延迟1阶,其他阶数的自相关阶数均在2被标准差范围内,有很强的短期相关性,所以可以认为1阶差分后序列平稳。
在这里插入图片描述
从上可知,自相关系数具有截尾的特点,偏自相关系数具有拖尾特征。
(4)白噪声检验
在这里插入图片描述
从拟合结果看,模型为:Xt=Xt_1+0.6672Et_1,Et~N(0,67,31)。
结合白噪声检验的结果,可知模型是显著的,认为ARIMA(0,1,1)模型对该序列拟合成功。

2.3.4 ARIMA模型预测

在最小均方误差原理下,ARIMA模型与ARMA模型类似。
对1952-1988年中国农业实际收入指数进行为期10年的序列预测

#农业ARIMA模型预测
library("readxl")
library("zoo")
library("forecast")
data6 <-read_xlsx("E:/R语言时间序列/农业.xlsx")
x<-ts(data6$农业,start = 1952)
x.fit<-arima(x,order = c(0,1,1))
x.fore<-forecast(x.fit,h=10)
#绘制预测图
plot(x.fore)

未来十年预测结果
在这里插入图片描述
从上面的预测结果可知,有80%,95%两个置信区间的值。接着我峨嵋你绘制预测结果图。
在这里插入图片描述

Guess you like

Origin blog.csdn.net/m0_56444893/article/details/121809656