好啦,年更博主来了。上一节我们主要对时间序列的一些基于R的简单数据处理方式和操作方法进行了说明,这节,我们将会更深入地对时间序列预测和计算进行说明。
2.1对时间序列对象进行季节性分解
很明显,在我们进行数学建模竞赛的数据分析处理阶段,针对已经转化后的数据(时间序列对象)。我们必须知道该时间序列对象的特征:是否有周期,是否有随机性,是否有一些重要的影响因子等等.。接下来我将使用R对时间序列对象进行分解。
2.1.1使用stl()函数进行季节性分解
stl()函数,只需要安装相应的数据包或者你们主机安装的R语言系统比较完善就可以直接使用,并不需要使用forecast()函数,library()函数等进行载入。我首先来说说我使用这个函数最直接的感受:
1.该函数分解时间序列对象时,周期必须是要大于2的。也就是说,我第一节里面使用的nhtemp数据集是无法用这个函数进行季节性分解的。运行出来的结果如下:
2.stl()函数只适用于第一节里面的加法模型,乘法模型是不适用的。因此,在我们进行分解的时候,要对原数据集进行对数化处理。就像上面的程序一样。
好的,在我们说完使用感受后,我们来说说这个函数的R的作用机理。大体来说stl()函数的原理就是多项式拟合回归。他基于Loess。Loess为局部多项式回归拟合,是对两维散点图。这个函数shi局部加权回归散点平滑法,可分解时间序列成季节项、趋势项以及残余项。
要具体来说,stl()函数的形参表是很复杂的,很多参数的。主要形式如下:
stl(ts, s.window, s.degree=0, t.window=NULL, t.degree=1, robust=FALSE, na.action=na.fail)
那么这些参数都有什么意义呢?
其中:
ts:根据我第一节写的基本语句,我们知道就是代表时间序列对象的意思。
s.windows:小编在写这个代码的时候也不是很清楚这到底是什么,经过查阅资料,是指控制季节效应变化的速度。提取季节性的Loess算法的时间窗口的宽度,需要的是奇数;
s.degree:提取季节性时局部拟合多项式的阶数,需要的是0或1;
t.window:控制趋势项变化的速度。提取趋势性时的loess算法,时间窗口的宽度,需要的是奇数;较小的值意味着更快的变化速度;
t.degree:提取趋势性时,局部拟合多项式的阶数,需要是0或1;
robust:表示是否在loess过程中是否使用鲁棒拟合。
大家注意哈,这个函数的参数里面的ts和s.windows是必须给出的!
比如,我们使用R自带的AirPassengers数据集,不使用 nhtemp数据集的原因是因为nhtemp数据集的周期并不为大于或等于2。
具体代码段如下:
plot(AirPassengers) %画出原始数据集AirPassengers的图像
lAir<-log(AirPassengers) %对数据集进行对数化
plot(lAir,ylab="log(AirPassengers)") %画出对数化后数据集的图像
fit<-stl(lAir,s.window = 1) %设定stl函数分解时间序列的参数s.window大小为1
plot(fit) %画出分解后的各个分量图
fit<-stl(lAir,s.window = 12) %调整s.window大小为12
plot(fit) %画出分解后的各个分量图
fit$time.series %输出fit的每个观测值各分解项的值
exp(fit$time.series) %指数化fit的每个观测值各分解项的值
好的,在写完这几行代码后我们来说说在自学时同学们可能会遇到的问题(而这些问题相关的专业书籍并没有很清楚的解释):
1.很多相关的书籍并没有就s.window的参数设定在代码中的体现有具体的说明,都只是很简单地在代码段中列出s.window="period"的详细用法,事实上s.window是代表控制季节效应变化的速度,是一个数量,我们在详细代码中也是要列出其大小,比如说1,2,3,4,5…12等等,这数值的具体大小是根据季节效应的大小定的。按一般惯例来说,数据集的季节性趋势一般是以一年为季节性变化的周期。因此s.window的大小一般设置为12,为了更清楚更直观地展示s.window的参数大小对时间序列分解的效果的不同,我把上述代码画出的s.window的大小不同决定的时间序列的图像展示出来:
s.window=1的图像:
s.window=12的图像:
好的,在看到这两幅图像之后,我们可以很直观地看到,使用stl()函数对处理过后的数据集进行分解后,使用plot()函数对分解后的数据进行绘图,会得到数据样本data,季节性因子seasonal,趋势因子trend,随机波动因子remainder四个分量图。
从我们最开始对AirPassengers这个数据集进行绘图我们可以看到这个序列的趋势是单调增长的,而我们从上述季节性因子的分量图看出夏季乘客数量应该更多(我觉得应该是因为假期的原因)。而因为我们调整的参数不同,因为我们考量并绘制出的四个分量图最主要的作用是观察四个分量因子对原时序对象的影响以及他们的增减变化趋势,但是我们要知道四个分量他们的量纲是不一样的而且没有大小关系的相互比较的意义。那么我们在绘制出来的图象的最右侧的灰色长条来指示量级,那么我们就可以知道各个分量在大小上的大小关系。
当然,stl()函数处理后会出现一项是time.series。它包括每个观测值中的趋势,季节以及随机效应的具体组成。
此时,直接用fit$time.series则返回对数变换后的时序,而通过exp(fit…)则返回对数变换后的时序,这样才使得最后得到的数据是可用于后续实际计算的。
其实更简单地来说,我们可以通过R语言自带的monthplot()函数和forecast包中的seasonplot()函数来绘制图像,具体代码段如下:
par(mfrow=c(2,1)) %使用par(mfrow=c(2,1))绘制出一行两列的排列有序的图像
library(forecast) %载入forecast模块包,以便后面使用monthlot()函数
monthplot(AirPassengers,xlab="",ylab="") %设置第一幅图像的位置以及相关的参数
seasonplot(AirPassengers,year.labels = "TRUE",main="") %设置第二幅图像的相关参数
然后我们就得到如下图像集:
然后基于RStudio的时间序列的可视化分析一般就是这几种方法和思路,大家要善于结合使用。