用R語言進行時間序列ARMA模型分析

一眉師傅發表於2023-05-07

應用時間序列

時間序列分析是一種重要的資料分析方法,應用廣泛。以下列舉了幾個時間序列分析的應用場景:

  1.經濟預測:時間序列分析可以用來分析經濟資料,預測未來經濟趨勢和走向。例如,利用歷史股市資料和經濟指標進行時間序列分析,可以預測未來股市的走向。

  2.交通擁堵預測:時間序列分析可以用來預測交通擁堵情況。例如,根據歷史車流量和天氣資訊,可以建立一個時間序列模型來預測未來某個時間段的路況。

  3.天氣預測:時間序列分析可以用於天氣預測,例如預測未來幾天或幾周的降雨量、溫度等。這對於農業生產和水資源的管理非常重要。

  4.財務規劃:時間序列分析可以用來幫助企業進行財務規劃。例如,透過分析歷史銷售資料,可以預測未來銷售額,並制定相應的預算計劃。

  5.工業控制:時間序列分析可以用來最佳化工業生產過程。例如,根據機器執行狀態和歷史生產資料,可以建立一個時間序列模型來最佳化生產線的執行,提高生產效率。

以下是資料的具體時間序列分析步驟:

1.匯入資料

a=c(12.373,12.871,11.799,8.850,8.070,7.886,6.920,7.593,7.574,8.230,10.347,9.549,7.461,8.159,9.243,9.160,10.683,10.516,9.077,8.104,7.700,8.640 ,8.736 ,9.027 ,9.380 ,9.783 ,9.648, 8.135 ,8.222, 9.155,8.941, 9.682, 10.331, 10.601, 10.693 ,8.311)

2.更改為時間序列型資料

a=ts(a)

3.繪製時序圖

時序圖是一種用於展示時間序列資料的圖表,通常將時間作為X軸,將變數(如銷售額、溫度等)作為Y軸。時序圖可以幫助我們觀察和分析時間序列資料的趨勢、季節性、週期性以及異常值等。

一個典型的時序圖通常包括以下幾個元素:

  1-->X軸:表示時間軸,通常根據資料的時間粒度來設定刻度。例如,如果資料是按日收集的,則X軸可能顯示日期;如果是按小時收集的,則X軸可能顯示小時數。

  2-->Y軸:表示變數的取值範圍,通常根據資料的特性來設定刻度。例如,如果資料表示某個產品的銷售額,則Y軸可能顯示金額數值;如果資料表示溫度,則Y軸可能顯示攝氏度或華氏度。、

  3-->資料線:表示時間序列資料的變化趨勢,通常用一條連續的曲線或折線來表示。資料線的顏色和樣式可以根據需要進行調整,以突出重點資訊。

  4-->標題和註釋:用於說明時序圖的含義、資料來源和相關資訊。

將時間序列資料視覺化成時序圖,可以更加直觀地觀察和分析資料的變化趨勢和規律,從而更好地理解資料。

  首先可以繪製線圖直接觀察資料走勢粗略判斷平穩性,既無趨勢也無週期

1 #時序圖
2 plot(a,col='blue')

4.自相關圖和偏自相關圖是用於識別時間序列資料中的自相關性(autocorrelation)和偏自相關性(partial autocorrelation)的工具。

  自相關性是指時間序列資料中相鄰觀測值之間的相關性,即一個滯後版本與原始序列之間的相關程度。偏自相關性則是在控制其他滯後項的影響下,特定滯後項與序列之間的相關性度量。

  自相關圖和偏自相關圖可以幫助我們識別時間序列資料中的自相關性和偏自相關性,從而確定時間序列模型的階數。這對於進行預測和分析非常重要。

  自相關圖通常以滯後時間(lag)為X軸,以自相關係數為Y軸繪製。自相關係數是一個介於-1和1之間的值,表示當前時點與滯後版本之間的相關程度。自相關圖中的峰值通常表示時間序列資料中的週期性或季節性。

  偏自相關圖也以滯後時間為X軸,以偏自相關係數為Y軸繪製。偏自相關係數也是介於-1和1之間的值,但它表示特定滯後項與序列之間的相關程度,同時控制了其他滯後項的影響。偏自相關圖中的峰  值通常表示時間序列資料中的趨勢或週期性。

  一個極大的用途是人工定階:

             自相關圖                                                 偏自相關圖

    AR       拖尾                p階截尾

    MA      q階截尾                 拖尾

    ARMA       拖尾                 拖尾

總之,自相關圖和偏自相關圖是識別時間序列資料中的自相關性和偏自相關性的重要工具。透過觀察這些圖形的峰值和趨勢,可以確定時間序列模型的階數,並進行進一步的分析和預測。

1 #自相關圖與偏自相關圖
2 acf(a)
3 pacf(a)

5.純隨機性檢驗(白噪聲檢驗)

  純隨機性檢驗,也稱為白噪聲檢驗(White Noise Test),是一種用於檢驗時間序列資料是否具有純隨機性的方法。在時間序列分析中,純隨機性通常是假設時間序列資料中不存在任何潛在的模式、趨勢或週期性。

  白噪聲指的是均值為0、方差為常數的純隨機序列。在進行純隨機性檢驗時,我們希望時間序列資料的殘差值(即實際值與預測值之間的誤差)符合白噪聲假設。如果殘差值不符合白噪聲假設,則可能存在潛在的模式、趨勢或週期性等,需要進一步分析和處理。

常見的純隨機性檢驗方法包括:

  1-->Ljung-Box檢驗:基於殘差序列的自相關和偏自相關係數來檢驗序列是否具有相關性。

  2-->Breusch-Godfrey檢驗:基於迴歸模型的殘差來檢驗序列是否具有相關性。

  3-->ARCH檢驗:用於檢驗序列的異方差性(heteroscedasticity)。 

  4-->Runs檢驗:基於序列的正負交替次數來檢驗序列是否具有趨勢或週期性。

  在實踐中,我們通常會使用多種方法來檢驗時間序列資料的純隨機性,並結合其他分析方法來判斷資料是否存在潛在的模式和趨勢。只有在滿足純隨機性假設的情況下,才能進行有效的預測和分析。

  注:當p值小於0.05時為顯著非白噪聲序列

1 #純隨機性檢驗,白噪聲檢驗
2 Box.test(a)

6.單位根檢驗:ADF檢驗

  單位根檢驗,也稱為增廣迪基-福勒檢驗(Augmented Dickey-Fuller test,ADF test),是一種用於檢驗時間序列資料是否具有單位根(unit root)的方法。在時間序列分析中,單位根通常是假設時間序列資料中存在一種長期的趨勢或非平穩性。

  單位根檢驗旨在驗證時間序列資料是否具有平穩性。如果時間序列資料具有單位根,則說明資料存在非平穩性,並且預測和分析可能會出現問題。因此,在進行時間序列分析之前,我們需要先進行單位根檢驗,以確保資料具有平穩性。

  ADF檢驗是一種常用的單位根檢驗方法,它透過計算時間序列資料的ADF統計量來判斷資料是否具有單位根。ADF統計量與t值類似,表示觀測值與滯後版本之間的差異程度,同時考慮了其他因素的影響。如果ADF統計量小於對應的臨界值,則拒絕原假設,即資料不存在單位根,表明資料具有平穩性。

  除了ADF檢驗外,還有許多其他的單位根檢驗方法,例如Dickey-Fuller檢驗、KPSS檢驗等。不同的單位根檢驗方法具有不同的假設條件和適用範圍,需要根據具體情況來選擇合適的方法。

  總之,單位根檢驗是一種重要的時間序列分析工具,用於驗證資料是否具有平穩性。只有在資料具有平穩性的情況下,才能進行有效的預測和分析。

  檢驗假設:H0:存在單位根 vs H1:不存在單位根

  如果序列平穩,則不應存在單位根,所以我們希望能拒絕原假設

1 #ADF檢驗
2 #install.packages('aTSA')
3 library(aTSA)
4 adf.test(a)

7.ARMA引數估計

1 #引數估計
2 result=arima(a,order=c(2,0,1),method = 'CSS')
3 result

8.序列擬合結果圖

ts.diag(result)

9.模型預測

1 #預測
2 #install.packages('forecast')
3 library(forecast)
4 pre=forecast(result,h=5)
5 pre
6 plot(pre,lty=2)
7 lines(pre$fitted,col=2)

R語言程式碼實戰:

用R語言進行時間序列ARMA模型分析
#題3
a=c(12.373,12.871,11.799,8.850,8.070,7.886,6.920,7.593,7.574     ,8.230,10.347,9.549,7.461,8.159,9.243,9.160,10.683,10.516,9.077,8.104,7.700,8.640 ,8.736 ,9.027 ,9.380 ,9.783 ,9.648, 8.135 ,8.222, 9.155,8.941, 9.682, 10.331, 10.601, 10.693 ,8.311)
a=ts(a)
#時序圖
plot(a,col='blue')
#自相關圖與偏自相關圖
acf(a)
pacf(a)
#純隨機性檢驗,白噪聲檢驗
Box.test(a)
#ADF檢驗
#install.packages('aTSA')
library(aTSA)
adf.test(a)
#引數估計
result=arima(a,order=c(2,0,1),method = 'CSS')
result

ts.diag(result)
#預測
#install.packages('forecast')
library(forecast)
pre=forecast(result,h=5)
pre
plot(pre,lty=2)
lines(pre$fitted,col=2)
View Code

相關文章