对时序数据的研究包括两个基本问题:
在R中,一个数值型向量或数据框中的一列可通过 ts() 函数存储为时序对象
时间序列数据【存在季节性因素,如月度数据、季度数据等】可以被分解为趋势因子、季节性因子和随机因子
可以通过相加模型,也可以通过相乘模型来分解数据
对于乘法模型,可以取对数,将其转化为加性模型
那么如何将时间序列进行拆分,分解成这三部分呢?对于趋势和季节的分解,下面介绍移动平均和季节因子
时序数据集中通常有很显著的随机或误差成分。为了辨明数据中的规律,我们总是希望能够撇开这些波动,画出一条平滑曲线。画出平滑曲线的最简单办法是 简单移动平均 。比如每个数据点都可用这一点和其前后q个点的平均值来表示,这就是居中移动平均 centered moving average
St是时间点t的平滑值, k=2q+1 是每次用来平均的观测值的个数,一般我们会将其设为一个 奇数 。居中移动平均法的代价是,每个时序集中我们会损失最后的q个观测值,平均值消除了数据中的一些随机性
使用R语言 forecast 包中的 ma() 函数来对Nile时序数据进行平滑处理
从图像来看,随着k的增大,图像变得越来越平滑。因此我们需要找到最能画出数据中规律的k,避免过平滑或者欠平滑。这里并没有什么特别的科学理论来指导k的选取,我们只是需要先尝试多个不同的k,再决定一个最好的k
除此之外,还可以使用 加权移动平均 来进行平滑化
加权移动平均法的一大优势是它可以让趋势周期项的估计更平滑。观测值不是直接完全进入或离开计算,它们的权重缓步增加,然后缓步下降,让曲线更加平滑
季节指数的计算
将时序分解为趋势项、季节项和随机项的常用方法是用LOESS光滑做季节性分解。这可以通 过R中的 stl() 函数
stl函数只能处理相加模型,如果要处理相乘模型,可以使用log进行转换
[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.