R的分解/ stl函数无法从每日时间序列中完全提取年度季节性

时间:2018-11-06 19:40:32

标签: r time-series forecasting arima decomposition

上下文优先,底部是问题。

我有10年的逐年降水量数据,这些数据表现出年度季节性,我正尝试使用ARMA方法进行建模,然后进行预测。数据here,下面是时间序列对象的创建。

我知道常见的R包和函数在每日时间序列中遇到困难。例如,Forecast的arima()函数不接受高于350的频率,并且ts()不接受频率的非整数值(由于一年中的平均天数为365.25,因此这两个值将很有用)。

很明显,Forecast的msts()函数可以为Seasonal.perdiods参数接受非整数值,所以我创建了如下时间序列:

the_ts <- msts(data$PRCP, start=c(2007, 10), end=c(2017, 9),  seasonal.periods=c(365.25))

Time Series:
Start = c(2007, 10) 
End = c(2017, 9) 
Frequency = 365 
   [1] 0.09 0.75 1.63 0.06 0.36 0.63 0.76 0.43 0.13 0.00 0.00 0.02 0.31 1.80 0.03 0.19 0.25 0.01 0.00 0.52 0.01 0.00 0.00 0.00 0.00 ... etc

-

plot(the_ts)

plotted time series

该系列是固定的,因此不需要区别。

然后,我希望分解该序列,以提取季节和趋势,剩下的残差留在残差中,如果成功,残差应该近似于白噪声。

下面是绘制的分解图。我也尝试使用decompose()并进行了大量参数调整。

the_ts_decomp = stl(the_ts, s.window = "periodic")
plot(the_ts_decomp)

time series decomposition

显然,由于数据中季节性趋势的形状与残差平行,因此残差中存在某种类型的季节性。让我们删除已确定的季节性成分并检查所谓的反季节数据:

the_ts_deseasonal <- seasadj(the_ts_decomp)
plot(the_ts_deseasonal)

deseasonalized

对我来说,还是很季节性。 ACF和PACF(未显示)确认发生自相关。

Acf(the_ts_deseasonal, lag.max=1000)
Pacf(the_ts_deseasonal, lag.max=1000)

很明显,在预测时,可以通过将傅立叶变换作为外生协变量传递到ARMA模型中来解释该系列的季节性成分,如“预测”软件包here和{{ 3}},但我不清楚这与在拟合模型之前分解和反季节化序列的需求到底有什么关系。

我能够使用上述方法,根据上述看似不够充分的分解数据,得出以下预测。预测似乎不算是本垒打,残差证实有些问题了:

the_ts.fit <- auto.arima(the_ts, seasonal=FALSE, xreg=fourier(the_ts, K=5))
plot(forecast(the_ts.fit, h=365, xreg=fourier(the_ts, K=5, h=365)))
tsdisplay(residuals(the_ts.fit), lag.max=1000)

here forecast

我不太了解Hyndman的exreg = fourier解决方案,可能是我缺少如何正确地将其应用于我的情况。

问题1 :我是否不需要能够将数据分解为无趋势,无季节的白噪声,以便对其进行重构以进行预测?使用exreg = fourier解决方案怎么办?

问题2 :为什么上述代码无法提取该系列的季节性成分,我该如何解决?

问题3 :什么软件包,功能或技术可以用来指定365.25的年度季节性?

1 个答案:

答案 0 :(得分:0)

我将尝试回答以下问题:

问题1:为了重构数据以进行预测,我是否不需要将数据分解为无趋势,无季节的白噪声?使用exreg = fourier解决方案怎么办?

傅立叶解决方案考虑了确定性的季节性,即假定季节性模式不会随时间变化。通常,我不会说趋势和季节性调整后的序列确实需要是白噪声,因为序列中可能还保留一些短期模式。

问题2:为什么上述代码无法提取该系列的季节性成分,我该如何解决?

在stl函数中指定s.window =“ periodic”时,基本上可以认为季节性模式不会随时间变化。这可能是问题的根源。

问题3:可以使用什么软件包,功能或技术来指定365.25的年度季节性?

dsa包中的dsa函数,您需要将其转换为xts格式的时间序列。例如这样的

data = rnorm(365.25*10, 100, 1)
data_xts <- xts::xts(data, seq.Date(as.Date("2007-01-01"), by="days", length.out = length(data)))

sa = dsa::dsa(data_xts, fourier_number = 24) # the fourier_number is used to model monthly recurring seasonal patterns in the regARIMA part

data_adjusted <- sa$output[,1]