2017-10-01 45 views
2

我有一个季节性(每周)模式的重复时间序列,我想返回同一时间序列,没有逐周趋势,将第一个值作为初始点。展平或消化一个季节性时间序列

具体而言,第1个值仍然是39.8,但第8个值也将是39.8而不是17.1。如果前七个值只是重复,那么会重复一个星期的负面趋势,我想根本没有趋势(所以6.2的第7个值也会更高)。

有没有一种优雅的方式来做到这一点,尤其是对于时间序列中的零值条目(我有很多这样的方法)是健壮的呢?

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

demand <- ts(
    c(39.8, 33.5, 40.6, 23.6, 11.9, 12.3, 6.2, 17.1, 10.8, 18, 1, -10.7, 
-10.4, -16.5, -5.6, -11.9, -4.7, -21.7, -33.4, -33.1, -39.2, -28.2, 
-34.6, -27.4, -44.4, -56.1, -55.7, -61.8, -50.9, -57.2, -50.1), 
frequency = 7 
) 

plot(demand) 

demand trend

回答

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的第一个值。