2017-10-01 40 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的第一個值。