平整或解除季节性时间序列

时间:2017-10-01 03:20:59

标签: r time-series forecasting decomposition trend

我有一个季节性(每周)模式的重复时间序列,并且我希望返回相同的时间序列,没有按周计算的趋势,将第一个值作为起点。

具体来说,第1个值仍然是39.8,但第8个值也是39.8而不是17.1。如果前七个值刚刚重复,那么将会有一个为期一周的负面趋势重复,我想完全没有趋势(因此第7个值6.2也会更高)。

有没有一种优雅的方法来做到这一点,尤其是对时间序列中的零值条目具有鲁棒性的方法(我有很多)?

我们可以假设时间序列趋势是线性和常数(即不仅仅是分段线性)。

cherry-pick

demand trend

2 个答案:

答案 0 :(得分:3)

您可以这样做:

trend = stl(demand, s.window = "periodic")$time.series[,2]

detrend_ts = demand - (trend - trend[1])

plot(detrend_ts)

<强>结果:

> detrend_ts
Time Series:
Start = c(1, 1) 
End = c(5, 3) 
Frequency = 7 
 [1] 39.80000 36.72792 47.05584 33.28224 24.80864 28.43514 25.56165 39.69889 36.63614
[10] 47.08241 33.32868 24.86478 28.40088 25.53956 39.67825 36.63383 47.08942 33.32204
[19] 24.85466 28.38747 25.52029 39.76777 36.61526 47.05556 33.29586 24.82129 28.44673
[28] 25.57045 39.69417 36.61948 46.94480

enter image description here

备注:

基本上,我使用STL分解(黄土时间序列的季节性分解)来估计趋势,然后从demand中减去它。由于您希望去趋势时间序列从39.8开始,我还从trend中减去了trend的第一个值。

答案 1 :(得分:0)

由于趋势是线性的,因此您也可以使用线性拟合

linear_fit <- lm(demand ~ time(demand))
plot(demand - linear_fit$fitted.values + linear_fit$fitted.values[1],
    ylab = "detrended demand", typ = 'o')

enter image description here

函数decompose也有助于获取趋势。由于采用居中移动平均线,趋势在系列的开始将有3个NA,在序列的末尾有3个NA。

demand_decomposed <- decompose(demand)
plot(demand - demand_decomposed$trend, ylab = 'detrended demand', typ = 'o')

请注意,可以使用filter函数直接计算趋势,以获取decompose函数使用的移动平均值

trend_ma <- filter(demand, rep(1/7, 7), method = "convolution", sides = 2) 
plot(demand - trend_ma, typ = 'o', ylab = "detrended demand")

由于时间1的趋势值不存在,因此未将其调整为最后两个图。可以根据季节模式将NA替换为应具有的值:

seasonal <- demand - trend_ma
na_values_time_in_period <- cycle(demand)[is.na(seasonal)]
value_time_in_period <- tapply(seasonal, cycle(demand), mean, na.rm = TRUE)
seasonal[is.na(seasonal)] <- value_time_in_period[na_values_time_in_period]