添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

多周期时间序列分解算法-MSTL原理

1.时间序列分解和STL算法

时间序列算法分解一般是指把一个时间序列分解成:趋势序列,周期序列,残差序列。

时间序列分解算法最广为人知的可能是STL算法。它只能分解出一个周期序列。有很多博客和文章叙述了STL分解的原理,例如博客 时间序列分解算法:STL 。其中也有原论文的链接,看原论文也较容易理解。

2.MSTL分解算法

MSTL可以理解成multiple-STL。它和STL的区别是:STL分解的输入包含一个周期数,而这个算法可以输入多个周期数。MSTL可以分离出多个周期序列。

STL:Y(t)=Trend(t)+Season(t)+Remainder(t)

MSTL:Y(t)=Trend(t)+Season1(t)+Season2(t)+...+SeasonN(t)+Remainder(t)

它的原理简述如下: ————————————————————————————————————

Step0 :初始化。

(a)原始序列设为x,空缺值用插值补全;、

(b)将给定的所有周期数按从小到大排序,记为数组msts;

(c)各个周期成分seas初始值均设为0,seas可以理解成一个二维数组,第一维的长度为周期的个数;

(d)给定算法内部循环次数iterate;

去周期成分设为deseas,初始值为原始序列deseas=x;
Step1 :对下述{}内的过程循环iterate次后停止,特别的第j次循环如下。

{从小到大遍历周期数组msts中的周期,运行下述(1.a)~(1.d),特别的,对第i个周期     msts[i],执行下述操作:

(1.a)更新去周期成分:deseas=deseas+seas[i](seas[i]为第i个周期对应的

序列,初始设为0向量);

(1.b)对deseas用stl分解算法以第i个周期(msts[i])进行分解,分解模型记

为fit;

(1.c)更新第i个周期对应的周期序列为fit的周期序列,即
seas[i]=seasonal(fit);

(1.d)更新去周期成分,deseas=deseas–seas[i]。

遍历msts中的每个周期数之后,计算原序列的其他成分:

(2.a)计算原始序列的趋势成分,trend=trendcycle(fit)。

(3.a)计算原始序列分解的残差成分,remainder=deseas-trend。

}

Step2 :输出原始序列的分解结果:趋势序列trend,若干周期序列seas,残差序列       remainder。 ————————————————————————————————————

可以看到:

(1)第一次循环,从小到大遍历周期时,用STL算法把各个周期序列“剥离”出

来,存到seas里。然后计算一个什么周期都没有trend和remainder。注意

这时候deseas等于trend+remainder。

(2)第二次循环,从小到大遍历周期时,这时STL分解的是trend+reminder+seas[i],没有

其他周期项的干扰,这时分解出第i个周期对应的周期序列应该更好。用它来更新

seas[i]。然后再次更新trend和remainder。注意这时候deseas一直等于

trend+remainder。

(3)依次遍历,不断地优化所有的子序列。

3.参考资料

上述算法是从R的mstl()源码解析出来的,可能有误差,详情请参考 R函数mstl()源码地址

编辑于 2020-07-12 10:43

文章被以下专栏收录