在 R 中繪製 ARIMA 時間序列中的預測值
在這個問題中可能存在不止一個嚴重的誤解,但這並不是為了讓計算正確,而是為了激發學習時間序列的一些重點。
在試圖理解時間序列的應用時,似乎去趨勢數據使得預測未來值變得不可信。例如,包中的
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")