在本文中,我將介紹ARMA,ARIMA(Box-Jenkins),SARIMA和ARIMAX模型如何用於預測時間序列數據。python
咱們可使用backshift滯後算子來執行計算。例如,滯後算子可用於計算的時間序列值的滯後差分, 函數
其中k表示的差分滯後期。對於k=1,咱們得到普通的差分,而對於k=2咱們得到相對於一階的差分。讓咱們考慮R中的一個例子。測試
使用R,咱們可使用diff
函數計算滯後差分。函數的第二個參數表示所需的滯後k,默認設置爲k=1。例如:spa
By <- diff(y) # y\_i - B y\_i B3y <- diff(y, 3) # y\_i - B^3 y\_i message(paste0("y is: ", paste(y, collapse =
## y is: 1,3,5,10,20 ## By is: 2,2,5,10 ## B^3y is: 9,17
滯後k的自相關定義爲:code
要計算自相關,咱們可使用如下R函數:對象
get_autocor <- function(x, lag) { x.left <- x\[1:(length(x) - lag)\] x.right <- x\[(1+lag):(length(x))\] autocor <- cor(x.left, x.right) return(autocor) }
get_autocor(y, 1) ## \[1\] 0.9944627 # 相隔2個時間點(滯後期2)測量值的相關性 get_autocor(y, 2) ## \[1\] 0.9819805
數據的高度自相關代表數據具備明確的時間趨勢。ip
因爲觀察到較大滯後的自相關能夠是較低滯後的相關結果,所以一般值得考慮偏自相關函數(pACF)。pACF的想法是計算偏相關性,這種相關性決定了對變量的最近觀察樣本的相關性。pACF定義爲:rem
使用pACF能夠識別是否存在實際滯後的自相關或這些自相關是不是由其餘樣本引發的。get
計算和繪製ACF和pACF的最簡單方法是分別使用acf
和pacf
函數:數據分析
par(mfrow = c(1,2)) acf(y) # ACF pacf(y) # pACF
在ACF可視化中,ACF或pACF被繪製爲滯後的函數。指示的水平藍色虛線表示自相關顯著的水平。
執行分解的方式取決於時間序列數據是加法仍是乘法。
加法模型假設數據能夠分解爲
另外一方面,乘法模型假設數據能夠被分解爲
AirPassengers
數據集提供了乘法時間序列的示例。
data(AirPassengers) plot(AirPassengers)
AirPassengers
數據集:
plot(log(AirPassengers))
正如咱們所看到的,採用對數已經使季節性成分的變化均衡。請注意,整體增加趨勢沒有改變。
要分解R中的時間序列數據,咱們可使用該decompose
函數。請注意,咱們應該經過type
參數提供時間序列是加法的仍是乘法的。
對於AirPassengers
數據集,咱們指定數據是乘法的並得到如下分解:
plot(decompose(AirPassengers, type = "multiplicative"))
分解代表,多年來航空公司乘客總數在增長。此外,咱們已經觀察到的季節性影響已被清楚地捕捉到。
讓咱們考慮能夠EuStockMarkets
數據集的分解:
daxData <- EuStockMarkets\[, 1\] #數據彷佛不是可乘的,請使用加法分解 decomposed <- decompose(daxData, type = "additive") plot(decomposed)
該圖顯示了1992年至1998年的DAX數據中的如下內容:
生成時間序列數據的過程能夠是平穩的也能夠是非平穩的。 例如,數據EuStockMarkets
和AirPassengers
數據都是非平穩的,由於數據有增長的趨勢。爲了更好地區分平穩和非平穩過程,請考慮如下示例:
par(mfrow = c(1,2))# data(nino) x <- nino3.4 plot(x, main = "Stationary process")# 飛機旅客數據 plot(AirPassengers, main = "Non-stationary process")
左圖顯示了一個平穩過程,其中數據在全部測量中表現類似。右圖顯示了一個非平穩過程,其中平均值隨着時間的推移而增長。
介紹了與時間序列數據分析相關的最重要概念後,咱們如今能夠開始研究預測模型。
ARMA表明自迴歸移動平均模型。ARMA模型僅適用於平穩過程,並具備兩個參數:
使用backshift運算符,咱們能夠經過如下方式制定ARMA模型:
經過定義和,ARMA模型簡化爲。
總之,ARIMA模型具備如下三個參數:
在ARIMA模型中,經過將替換差分,將結果轉換爲差分yt
而後經過指定模型
在下文中,讓咱們考慮ARIMA模型的三個參數的解釋。
咱們可使用該arima.sim
函數模擬自迴歸過程。經過該函數,能夠經過提供要使用的MA和AR項的係數來指定模型。在下文中,咱們將繪製自相關圖,由於它最適合於發現自迴歸的影響。
第一個例子代表,對於ARIMA(1,0,0)過程,階數1的pACF很是高,而對於ARIMA(2,0,0)過程,階數1和階數2自相關都很重要。所以,能夠根據pACF顯着的最大滯後來選擇AR項的階數。
ARIMA(0,1,0)模型簡化爲隨機遊走模型
如下示例演示了差分對AirPassengers
數據集的影響:
雖然第一個圖表顯示數據顯然是非平穩的,但第二個圖代表差分時間序列是至關平穩的。
其中當前估計值取決於先前測量值的殘差。
能夠經過繪製自迴歸函數來研究移動平均的影響:
請注意,對於自迴歸圖,咱們須要注意第一個x軸位置表示滯後爲0(即標識向量)。在第一個圖中,只有第一個滯後的自相關是顯着的,而第二個圖代表前兩個滯後的自相關是顯着的。爲了找到MA的階數,適用與AR相似的規則:MA的階數對應於自相關顯着的最大滯後期。
爲了肯定哪一個更合適,AR或MA,咱們須要考慮ACF(自相關函數)和PACF(偏ACF)。
AR和MA的組合獲得如下時間序列數據:
auto.arima
`forecast`
咱們將使用數據展現ARMA的使用,該數據tseries
給出了Nino Region 3.4指數的海面溫度。讓咱們驗證數據是否平穩:
d=0
爲了驗證是否存在任何季節性趨勢,咱們將分解數據:
沒有總體趨勢,這是平穩過程的典型趨勢。可是,數據存在強烈的季節性因素。所以,咱們確定但願包含對季節性影響進行建模的參數。
對於季節性模型,咱們須要指定額外的參數參數(P,D,Q)S。因爲季節性趨勢在時間序列數據中不佔主導地位,咱們將設置D=0。此外,因爲尼諾數據中的季節性趨勢是一種年度趨勢,咱們能夠設置S=12個月。爲了肯定季節性模型的其餘參數,咱們考慮季節性成分的圖。
咱們設置P=2 Q=0
對於非季節性模型,咱們須要找到p和q。爲此,咱們將繪製ACF和pACF來肯定AR和MA參數的值。
咱們可使用包中的Arima
函數來擬合模型forecast
。
咱們如今可使用該模型來預測將來Nino 3.4地區的氣溫如何變化。有兩種方法能夠從預測模型中得到預測。第一種方法依賴於predict
函數,而第二種方法使用包中的forecast
函數。使用該predict
功能,咱們能夠經過如下方式預測和可視化結果:
## ## Attaching package: 'ggplot2' ## The following object is masked from 'package:forecast': ## ## autolayer
若是咱們不須要自定義繪圖,咱們可使用如下forecast
函數輕鬆地獲取預測和相應的可視化:
# 使用內置繪圖功能: forecast <- forecast(A, h = 60) # 預測將來5年 plot(forecast)
爲了演示ARIMA模型對非平穩數據的使用,咱們將使用數據集astsa
。該數據集提供全球平均陸地 - 海洋溫度誤差的年度測量值。
d=1
p=0q=1
咱們如今能夠預測將來幾年平均陸地 - 海洋溫度誤差將如何變化:
該模型代表,將來幾年平均陸地 - 海洋溫度誤差將進一步增長。
爲了展現ARIMAX模型的使用,咱們將使用臭氧數據集 。
讓咱們加載臭氧數據集並將其劃分爲測試和訓練集。請注意,咱們已確保訓練和測試數據包含連續的時間測量。
爲此,咱們將在臭氧數據集中建立一個新列,該列反映了相對時間點:
如今咱們有了時間維度,咱們能夠繪製臭氧水平:
時間序列數據彷佛是平穩的。讓咱們考慮ACF和pACF圖,看看咱們應該考慮哪些AR和MA
自相關圖很是不清楚,這代表數據中實際上沒有時間趨勢。所以,咱們會選擇ARIMA(0,0,0)模型。因爲具備參數(0,0,0)的ARIMAX模型沒有傳統線性迴歸模型的優點,咱們能夠得出結論,臭氧數據的時間趨勢不足以改善臭氧水平的預測。讓咱們驗證一下:
print(Rsquared.linear) ## \[1\] 0.7676977
`````` print(Rsquared.temporal)
`````` ## \[1\] 0.7569718
咱們能夠看到具備負二項式機率線性模型優於ARIMAX模型。
要在更合適的數據集上演示ARIMAX模型,讓咱們加載數據集:
該Icecream
數據集包含如下變量:
測量結果是從1951-03-18到1953-07-11的四周觀測。
咱們將模擬消費,冰淇淋消費做爲時間序列,並使用_收入_,_價格_和_平均值_做爲外生變量。在開始建模以前,咱們將從數據框中建立一個時間序列對象。
咱們如今調查數據:
所以,數據有兩種趨勢:
因爲季節性趨勢,咱們可能擬合ARIMA(1,0,0)(1,0,0)模型。可是,因爲咱們知道溫度和外生變量的收入,所以它們能夠解釋數據的趨勢:
income
解釋了總體趨勢。此外,temp
解釋了季節性趨勢,咱們不須要季節性模型。所以,咱們應該使用ARIMAX(1,0,0)模型進行預測。爲了研究這些假設是否成立,咱們將使用如下代碼將ARIMAX(1,0,0)模型與ARIMA(1,0,0)(1,0,0)模型進行比較
ARIMAX(1,0,0)模型的預測顯示爲藍色,而ARIMA(1,0,0)(1,0,0)模型的預測顯示爲虛線。實際觀察值顯示爲黑線。結果代表,ARIMAX(1,0,0)明顯比ARIMA(1,0,0)(1,0,0)模型更準確。
但請注意,ARIMAX模型在某種程度上不像純ARIMA模型那樣有用於預測。這是由於,ARIMAX模型須要對應該預測的任何新數據點進行外部預測。例如,對於冰淇淋數據集,咱們沒有超出1953-07-11的外生數據。所以,咱們沒法使用ARIMAX模型預測超出此時間點,而ARIMA模型能夠實現:
若是您有任何疑問,請在下面發表評論。
最受歡迎的看法
1.在python中使用lstm和pytorch進行時間序列預測
2.python中利用長短時間記憶模型lstm進行時間序列預測分析