R

在 R 中繪製 ARIMA 時間序列中的預測值

  • August 15, 2016

在這個問題中可能存在不止一個嚴重的誤解,但這並不是為了讓計算正確,而是為了激發學習時間序列的一些重點。

在試圖理解時間序列的應用時,似乎去趨勢數據使得預測未來值變得不可信。例如,包中的gtemp時間序列astsa如下所示:

在此處輸入圖像描述

在繪製預測的未來值時,需要考慮過去幾十年的上升趨勢。

然而,為了評估時間序列波動,需要將數據轉換為平穩時間序列。如果我將其建模為具有差異的 ARIMA 過程(我猜這是因為 in 的中間1而執行order = c(-, 1, -)),如下所示:

require(tseries); require(astsa)
fit = arima(gtemp, order = c(4, 1, 1))

然後嘗試預測未來的值(年),我錯過了上升趨勢部分:

pred = predict(fit, n.ahead = 50)
ts.plot(gtemp, pred$pred, lty = c(1,3), col=c(5,2))

在此處輸入圖像描述

不必觸及特定 ARIMA 參數的實際優化, 如何恢復繪圖預測部分的上升趨勢?

我懷疑某處“隱藏”了一個OLS,這會導致這種非平穩性嗎?

我遇到了 的概念drift,可以將其合併到包的Arima()功能中forecast,呈現一個似是而非的情節:

par(mfrow = c(1,2))
fit1 = Arima(gtemp, order = c(4,1,1), 
            include.drift = T)
future = forecast(fit1, h = 50)
plot(future)
fit2 = Arima(gtemp, order = c(4,1,1), 
            include.drift = F)
future2 = forecast(fit2, h = 50)
plot(future2)

在此處輸入圖像描述

它的計算過程更加不透明。我的目標是對趨勢如何納入繪圖計算有某種理解。是(小寫)中沒有的問題之一drift嗎?arima()


相比之下,使用數據集AirPassengers,繪製了超出數據集端點的預測乘客數量,說明了這種上升趨勢:

在此處輸入圖像描述

代碼是:

fit = arima(log(AirPassengers), c(0, 1, 1), seasonal = list(order = c(0, 1, 1), period = 12))
pred <- predict(fit, n.ahead = 10*12)
ts.plot(AirPassengers,exp(pred$pred), log = "y", lty = c(1,3))

渲染一個有意義的情節。

這就是為什麼您不應該對非固定數據執行 ARIMA 或任何操作。

在查看 ARIMA 方程和其中一個假設之後,回答為什麼 ARIMA 預測變得平坦的問題非常明顯。這是簡化的解釋,請勿將其視為數學證明。

讓我們考慮 AR(1) 模型,但對於任何 ARIMA(p,d,q) 都是如此。

AR(1) 的方程是:

和假設就是它. 有了這樣的 β,每個下一個點都比前一個點更接近 0,直到, 和. 那麼,如何處理這樣的數據呢?您必須通過微分使其靜止() 或計算百分比變化 ()。您正在建模差異,而不是數據本身。差異隨著時間的推移而不斷變化,這是你的趨勢。

require(tseries)
require(forecast)
require(astsa)
dif<-diff(gtemp)
fit = auto.arima(dif)
pred = predict(fit, n.ahead = 50)
ts.plot(dif, pred$pred, lty = c(1,3), col=c(5,2))
gtemp_pred<-gtemp[length(gtemp)]
for(i in 1:length(pred$pred)){
  gtemp_pred[i+1]<-gtemp_pred[i]+pred$pred[i]
}
plot(c(gtemp,gtemp_pred),type="l")

在此處輸入圖像描述

引用自:https://stats.stackexchange.com/questions/229948

comments powered by Disqus