chapter15.1-2 时间序列1--时间序列分解
15.1 时间序列--概念
15.1.1 概念
- 横截面数据:在一个给定的时间点测量变量值
- 纵向数据:随着时间的变化反复测量变量值
对时序数据的研究包括两个基本问题:
- 对数据的描述【这段时间内发生了什么?趋势?季节性?】
- 预测【接下来会发生什么?时间序列模型的预测】
15.1.2 生成时间序列
在R中,一个数值型向量或数据框中的一列可通过ts()
函数存储为时序对象
myseries <- ts(data, start=, end=, frequency=)
- data:原始的包含观测值的数值型向量
- start:时序的起始时间
- end:时序的终止时间
- frequency:为每个单位时间所包含的观测值数量(如frequency=1对应年度数据,frequency=12对应月度数据,frequency=4对应季度数据
sales <- c(18, 33, 41, 7, 34, 35, 24, 25, 24, 21, 25, 20, 22, 31, 40, 29, 25, 21, 22, 54, 31, 25, 26, 35)
tsales <- ts(sales, start=c(2003, 1), frequency=12)
tsales
plot(tsales) # 绘制时间序列
start(tsales) # start()获得起始时间
end(tsales) # end()获得结束时间
frequency(tsales) # frequency()获得频率
# window()函数取子集
tsales.subset <- window(tsales, start=c(2003, 5), end=c(2004, 6))
tsales.subset
15.2 时序的平滑化和季节分解
时间序列数据【存在季节性因素,如月度数据、季度数据等】可以被分解为趋势因子、季节性因子和随机因子
-
趋势因子
trend component
能捕捉到长期变化 -
季节性因子
seasonal component
能捕捉到一年内的周期性变化 -
随机(误差)因子
irregular/error component
能捕捉到那些不能被趋势或季节效应解释的变化。
可以通过相加模型,也可以通过相乘模型来分解数据
对于乘法模型,可以取对数,将其转化为加性模型
那么如何将时间序列进行拆分,分解成这三部分呢?对于趋势和季节的分解,下面介绍移动平均和季节因子
15.2.1 分解趋势--移动平均
时序数据集中通常有很显著的随机或误差成分。为了辨明数据中的规律,我们总是希望能够撇开这些波动,画出一条平滑曲线。画出平滑曲线的最简单办法是简单移动平均。比如每个数据点都可用这一点和其前后q个点的平均值来表示,这就是居中移动平均centered moving average
St是时间点t的平滑值,k=2q+1
是每次用来平均的观测值的个数,一般我们会将其设为一个奇数。居中移动平均法的代价是,每个时序集中我们会损失最后的q个观测值,平均值消除了数据中的一些随机性
使用R语言forecast
包中的ma()
函数来对Nile时序数据进行平滑处理
ma(ts,k=)
- ts:时间序列数据
- k:移动平均的步长为k
library(forecast)
opar <- par(no.readonly=TRUE)
par(mfrow=c(2,2))
ylim <- c(min(Nile), max(Nile))
plot(Nile, main="Raw time series")
plot(ma(Nile, 3), main="Simple Moving Averages (k=3)", ylim=ylim)
plot(ma(Nile, 7), main="Simple Moving Averages (k=7)", ylim=ylim)
plot(ma(Nile, 15), main="Simple Moving Averages (k=15)", ylim=ylim)
par(opar)
从图像来看,随着k的增大,图像变得越来越平滑。因此我们需要找到最能画出数据中规律的k,避免过平滑或者欠平滑。这里并没有什么特别的科学理论来指导k的选取,我们只是需要先尝试多个不同的k,再决定一个最好的k
除此之外,还可以使用加权移动平均来进行平滑化
加权移动平均法的一大优势是它可以让趋势周期项的估计更平滑。观测值不是直接完全进入或离开计算,它们的权重缓步增加,然后缓步下降,让曲线更加平滑
15.2.2 季节分解
季节指数的计算
- 季节因子(Seasonal factor)
- Sk代表第k个季节的季节因子,分子代表第k个季度的平均数,分母代表总平均数
- 季节因子表示第k个季节的数相对于总平均数的占比,反应当前季节相对于平均值的变化
- Sk越接近1,季节性越弱,Sk大于1说明该季度的值高于平均值,Sk小于1说明该季度的值低于平均值
-
季节性差分
有时候我们需要消除季节性,需要将季节性从数据中剔除,这个过程叫季节调整
s代表周期,即使用t期的数据减t-s期的数据
将时序分解为趋势项、季节项和随机项的常用方法是用LOESS光滑做季节性分解。这可以通 过R中的stl()
函数
stl(ts, s.window=, t.window=)
- ts:要分解的时间序列
- s.window:控制季节效应变化的速度
- t.window:控制趋势项变化的速度
stl函数只能处理相加模型,如果要处理相乘模型,可以使用log进行转换
AirPassengers # 国际航班乘客数据集
plot(AirPassengers)
lAirPassengers <- log(AirPassengers)
plot(lAirPassengers, ylab="log(AirPassengers)")
fit <- stl(lAirPassengers, s.window="period") # 将季节效应限定为每年都一样
plot(fit)
fit$time.series
相关参考:
[1] https://www.youtube.com/watch?v=2mM8BUqWAZ4
[2] https://zhuanlan.zhihu.com/p/21877990
[3] https://www.jianshu.com/p/e6d286132690
[4] https://nwfsc-timeseries.github.io/atsa-labs/sec-boxjenkins-stationarity.html
[6] Kabacoff, Robert. R 语言实战. Ren min you dian chu ban she, 2016.