成分分解
一条时间序列通常是好几件事叠在一起:一个长期走向、一个按季节重复的形状、还有一堆说不清的波动。把它们拆开不是为了好看,而是因为这三样东西的建模方法、预测方式和业务含义完全不同。分解常常是时间序列分析的第一步,也是最容易被做错的一步。
LAB 01
移动平均
窗口长度一调,趋势线从紧贴数据变成一条平滑曲线
残差标准差—
相位滞后—
两端缺失了多少个点—
季节项被保留了多少—
窗口长度正好等于季节周期(这里是 12)时,季节项被干净地平掉。读数里"季节项被保留了多少"量的就是漏进趋势线的那部分:窗口 12 时是 0.066(季节振幅是 12,也就是漏了 0.5%);换成 11 或 13,立刻涨到 1.4 和 1.1;换成 6,涨到 7.2。(窗口 24 也几乎不漏,因为它是周期的整数倍。)这就是为什么经典分解要用"居中移动平均",而且窗口必须取季节周期:它不是一个平滑参数,是一个结构参数。再把平均方式换成"只用过去"。趋势线整体往右挪了半个窗口——这就是相位滞后。实时监控里你只能用过去的数据,所以这个滞后躲不开;很多"指标开始下滑了吗"的争论,其实是在争论滞后了几周的平均值。最后注意两端:居中移动平均会在序列首尾各丢掉半个窗口的点,而恰恰是最新的那几个点最重要。这是经典分解在实时场景里的硬伤,也是 STL 等方法要解决的问题之一。
LAB 02
加法与乘法分解
季节振幅随水平增长时,为什么要用乘法模型
残差标准差—
加法 / 乘法两种分解的残差 sd—
残差的一阶自相关—
哪种模型更合适—
把数据设成"季节振幅随水平增长",再用加法模型去分解。看残差那一栏:它不是一团均匀的噪声,而是前面窄、后面宽的喇叭形。这正是"用错模型"在残差图上的典型长相——加法模型假设季节波动的绝对大小不变,而数据里它是按比例变的,于是差额随水平一起变大。换成乘法分解,残差立刻变成均匀的一条带,标准差也明显下降。判断用哪个的实用办法有两条:一是画图看季节波动的宽度会不会随水平变;二是对数据取对数——如果取完对数之后振幅变均匀了,那就该用乘法模型(因为 log 把乘法变成了加法,这也是很多序列先取对数再建模的原因)。残差图永远比残差的标准差更有信息量,因为它能告诉你"错在哪里",而不只是"错了多少"。
LAB 03
STL 分解
三条分量曲线同屏,残差是否还剩结构一眼可见
STL 残差标准差—
经典分解的残差标准差—
STL 残差的一阶自相关—
STL 抓到的季节漂移—
经典分解有个隐含假设:季节形状永远不变。它把每个相位上的值直接平均,得到一组固定的季节指数。真实数据里这条假设经常不成立——节假日在挪、消费习惯在变、气候在变。把"季节形状漂移的幅度"从 0 调到 1,再对比两种方法的残差标准差:经典分解从 1.52 涨到 7.04(它把漂移当成了噪声),而 STL 只从 1.19 涨到 2.00,因为它允许季节项慢慢变。"季节平滑跨度"就是这个允许量的旋钮:调到最大 = 季节项几乎固定(退化成经典分解),调到很小 = 季节项跟着每一年的数据跑,这时它会把一部分噪声也吸进季节项里,残差会假性变小。看残差的一阶自相关:它接近 0 才说明分解干净了;如果它明显为正,说明还有结构没被拆出来,这时残差的标准差再小也不能说明问题。默认参数、漂移拉满时这个值是 0.60,还是偏高;把"趋势平滑跨度"往小调,让趋势跟得更紧一点,它会降下来——这个来回调整的过程,本身就是时间序列分析里最常做的事。
这一页想说的
分解的价值不在那三条曲线本身,而在它把一个笼统的问题拆成了三个能分别回答的问题:长期在往哪走?(趋势)周期性的形状是什么?(季节)剩下的还有没有结构?(残差)最后一个问题最重要——如果残差还有明显的自相关,说明你的分解漏掉了东西,基于它做的任何预测和显著性检验都会偏乐观。所以分解做完,第一件事是画残差的 ACF,而不是急着去预测。