多周期时间序列分解算法——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:初始化。
    原始序列设为x,空缺值用插值补全;
    将给定的所有周期数按从小到大排序,记为数组msts;
    各个周期成分seas初始值均设为0,seas可以理解成一个二维数组,第一维的长度为
    周期的个数;
    给定算法内部循环次数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()源码地址

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值