一个时间序列可以分解为多个模型的组合
三种时间序列模式(不计剩余残差部分)
1. 趋势Tend :比如线性趋势,先增加后降低的整体趋势
2. 季节性Seasonal :以时间为固定周期,呈现循环的特性
3. 周期性Cyclic:在以不固定周期不断震荡,通常周期性至少持续2年
下图就是讲时间序列分解之后的结果,应该比较容易理解上面的定义
下图是周期性的表现之一:
每个周期的震荡持续了6-10年,整体没有什么明显的趋势,第一幅图中trend包含了trend与cyclic
可以将时间序列按下式分解为上面的几种模式,分解方式有相加方式或者相乘的方式如下:
移动平均用于估计时间序列的趋势和周期
简单来说就是用数值前后k个时间点的值的平均值来代替当时值
m=2*k+1
称为m -MA
要注意的是,平滑之后,会使前面k个值和后面的k个值变为null.下图红色是平滑之后的曲线
简单来说就是在已经平滑的基础上再一次平滑,这样可以使不同远近的数据有不同的权重,例如下例先使用4-ma平滑再使用2-ma平滑,称为2x4-MA:
公式为:
故名,将原来的moving average 的每一相前面加一个权重,2*4-MA也相当于加了权重,文中提到了Spencer和Henderson权重,常见权重系数如下图:
S = Spencer’s weighted moving average
H = Henderson’s weighted moving average
经典分解分为加法分解和乘法分解
假设所用数据为季节性周期为m的时间序列,m也成为季节性指数
其步骤如下:
1. 如果季节性周期是偶数m,使用2*m-MA来估计trend-cyclic T^t 如果季节性周期是奇数m,使用m-MA来估计trend-cyclic T^t
2. 计算去趋势序列 y−T^t
3. 计算季节趋势中每一个元素的平均值,如以一年中12月为周期,那么计算所有的1月的平均值作为1月的值,计算12个月的作为周期的 S^t
4. 计算 E^t=yt−T^t−S^t
乘法未解与上面的模式类似
只不过是将减法变为除法,不再赘述
这是美国人口普查局的发明,克服了1.3.3中的缺点,但是只适用于季度或者月份为季节性周期的时间序列。
以乘法模式为例,分解步骤:
1. 以2*12-MA来计算 T^t
2. 计算集中率(centered rations) yt/T^t
3. 使用3*3-MA对 yt/T^t 的月份进行平滑以估计季节性 S^t
4. 用 yt/T^t 除以 S^t 得到 E^t
5. 去掉不合理的 E^t ,得到修正后 E^t
6. 使用 E^t 乘以 S^t 得到修正后的centered rations
7. 重复步骤3得到修正后的 S^t
8. 用新的seasonal除源数据得到seasonally adjusted序列( yt/S^t )
9. 使用Henderson MA对上面的seasonal adjusted 序列平滑得到trend-cyclic T^t ,注意随机性越大使用的平滑次数越大,对于以月份为周期的序列可以使用9-, 13-, or 23-term Henderson
10. 重复步骤二得到新的 yt/T^t centered rations
11. 使用新的数据,重复步骤3-6,其中使用3x5-MA代替3x3-MA
12. 使用3x5-MA重复步骤7
13. 重复步骤8得到seasonally adjusted序列( yt/S^t )
14. 上面得到的seasonally adjusted序列( yt/S^t )除以第9步得到的trend-cyclic T^t ,得到remainder component E^t
15. 去除 E^t 不合理的值
16. 完成
注意:是具体情况步骤11,12中的ma可以替换为3x3 3x5 3x9
R 中的相关包 https://cran.r-project.org/web/packages/x12/index.html
stl=Seasonal and Trend decomposition using Loess
Loess是一种评估非线性关系的方法
1990年Cleveland发表的文章阐述了stl
http://cs.wellesley.edu/~cs315/Papers/stl%20statistical%20model.pdf
优点
1. 可以适用于任何季节周期的数据,(x12ARIMA只能是季度或者月份)
2. 季节性成分随时间的变化率可以被控制
3. trend-cycle 的平滑可以被控制
4. 更加鲁棒
缺点
1. 不能自动处理trading day or calendar variation
2. 只有加法模式
可以使用Box-Cox 来将乘法变为加法,将 λ 设为0为乘法,1为加法。
看一下例子
图6.10中将季节性变化设置为不变,得到的趋势更多变2010年之后成下降趋势
6.10的代码:
fit <- stl(elecequip, t.window=15, s.window="periodic", robust=TRUE)
plot(fit)
t.window, s.window是两个最终要的参数
利用时间序列分解可以将时间序列分解为
fit <- stl(elecequip, t.window=15, s.window="periodic", robust=TRUE)
eeadj <- seasadj(fit)
plot(naive(eeadj), xlab="New orders index",
main="Naive forecasts of seasonally adjusted data")
,步骤2 用naive预测seasonal
fcast <- forecast(fit, method="naive")
plot(fcast, ylab="New orders index")
Further Reading
https://www.otexts.org/fpp/6/8
Cleveland, R. B., W. S. Cleveland, J. E. McRae and I. J. Terpenning (1990). STL : A seasonal-trend decomposition procedure based on loess. Journal of Official Statistics 6(1), 3–73.
Gomez, V. and A. Maravall (2001). “Seasonal adjustment and signal extraction in economic time series”. In: A course in time series analysis. Ed. by D. Pena, G.C. Tiao and R.S. Tsay. New York: John Wiley & Sons. Chap. 8, pp.202–246.
Ladiray, D. and B. Quenneville (2001). Seasonal adjustment with the X-11 method. Lecture notes in statistics. Springer-Verlag.
Miller, D. M. and D. Williams (2003). Shrinkage estimators of time series seasonal factors and their effect on forecasting accuracy. International Journal of Forecasting, 19(4), 669–684.
Theodosiou, M. (2011). Forecasting monthly and quarterly time series using STL decomposition. International Journal of Forecasting, 27(4), 1178–1195.