语境首先,问题在底部 .

我有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模型中,可以在预测时考虑系列的季节性成分,如预测包herehere的作者所述,但我不确定这涉及在拟合模型之前分解和去除系列化的需要 .

基于上面看似不充分分解的数据,我能够使用该方法产生以下预测 . 预测似乎不是本垒打,剩余部分证实某些事情已经结束:

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)

forecast

forecast residuals

我不太了解Hyndman的exreg = fourier解决方案,可能是因为我错过了如何正确地将它应用到我的环境中 .

Question 1 :我不需要能够将数据分解为无趋势,无季节的白噪声,以便为预测重建数据吗?使用exreg = fourier解决方案时怎么样?

Question 2 :为什么上面的代码无法提取系列的季节性组件,我该如何解决?

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