一、時間序列的定義
時間序列是將統一統計值按照時間發生的先后順序來進行排列,時間序列分析的主要目的是根據已有數據對未來進行預測。
一個穩定的時間序列中常常包含兩個部分,那么就是:有規律的時間序列+噪聲。所以,在以下的方法中,主要的目的就是去過濾噪聲值,讓我們的時間序列更加的有分析意義。
二、時間序列的預處理
1、平穩性檢驗:
拿到一個時間序列之后,我們首先要對其穩定性進行判斷,只有非白噪聲的穩定性時間序列才有分析的意義以及預測未來數據的價值。
所謂平穩,是指統計值在一個常數上下波動並且波動范圍是有界限的。如果有明顯的趨勢或者周期性,那么就是不穩定的。一般判斷有三種方法:
畫出時間序列的趨勢圖,看趨勢判斷
畫自相關圖和偏相關圖,平穩時間序列的自相關圖和偏相關圖,要么拖尾,要么截尾。
(關於拖尾截尾的概念:https://blog.csdn.net/xianyuhenxian/article/details/60602828)
檢驗序列中是否存在單位根,如果存在單位根,就是非平穩時間序列。
(關於單位根檢驗:http://bbs.pinggu.org/thread-2412454-1-1.html)
在R語言中,DF檢測是一種檢測穩定性的方法,如果得出的P值小於臨界值,則認為是數列是穩定的。
2、白噪聲檢驗
白噪聲序列,又稱為純隨機性序列,序列的各個值之間沒有任何的相關關系,序列在進行無序的隨機波動,可以終止對該序列的分析,因為從白噪聲序列中是提取不到任何有價值的信息的。
3、平穩時間序列的參數特點
均值和方差為常數,並且具有與時間無關的自協方差。
三、時間序列建模步驟
拿到被分析的時間序列數據集。
對數據繪圖,觀測其平穩性。若為非平穩時間序列要先進行d階差分運算后化為平穩時間序列,此處的d即為ARIMA(p,d,q)模型中的d;若為平穩序列,則用ARMA(p,q)模型。所以ARIMA(p,d,q) 模型區別於ARMA(p,q)之處就在於前者的自回歸部分的特征多項式含有d個單位根。
對得到的平穩時間序列分別求得其自相關系數ACF 和偏自相關系數PACF,通過對自相關圖和偏自相關圖的分析,得到最佳的階層 p 和階數 q。由以上得到的d、q、p ,得到ARIMA模型。
模型診斷。進行診斷分析,以證實所得模型確實與所觀察到的數據特征相符。若不相符,重新回到第(3)步。
四、自回歸綜合移動平均模型ARIMA
首先我們先了解AR(自回歸模型)和MA(移動平均模型)
AR(自回歸模型):當存在xt = f1 xt-1 + f2 xt-2 + ..+fp xt-p+ut .時,其中ut是白噪聲過程,則這個線性過程成為p階自回歸過程。
一般我們常用的即為1階以及2階自回歸即:xt = f1 xt-1 + ut,xt = f1 xt-1 + f2 xt-2 + ut。
自回歸模型平穩必要非充分條件為所有系數相加<1
MA(移動平均模型):移動平均即將時間序列中的若干項進行算術平均得到的一系列平均數,若平均的數據項數為k,則成為k期的平均移動。相應的,還有加權平均移動法,即將特定期數的值進行加權計算平均值。
ARMA(自回歸移動平均模型):
自回歸滑動平均模型(ARMA)
如果時間序列Yt滿足:
則稱時間序列為服從(p,q)階自回歸滑動平均混合模型。或者記為φ(B)
(摘自百度百科,MA的體現形式有所出入,請仔細體會)
ARIMA(自回歸差分移動平均模型):
有了以上基礎之后,我們便很容易理解ARIMA模型了。
前邊我們提到,非穩定性模型可以通過差分的方式使之平穩化,而ARIMA即在參數中比ARMA多了一個差分過程,如果ARMA的公式為ARMA(P,Q),那么ARIMA即為ARIMA(P,D,Q)這里的d即為差分的意思,代表是幾階差分。
五、指數平滑法
基本原理:指數平滑法是移動平均法中的一種,其特點在於給過去的觀測值不一樣的權重,即較近期觀測值的權數比較遠期觀測值的權數要大。根據平滑次數不同,指數平滑法分為一次指數平滑法、二次指數平滑法和三次指數平滑法等。但它們的基本思想都是:預測值是以前觀測值的加權和,且對不同的數據給予不同的權數,新數據給予較大的權數,舊數據給予較小的權數。
方法應用:指數平滑法是生產預測中常用的一種方法。也用於中短期經濟發展趨勢預測,所有預測方法中,指數平滑是用得最多的一種。
指數平滑法的基本公式:St=a*yt+(1-a)*St-1 式中,
St--時間t的平滑值;
yt--時間t的實際值;
St-1--時間t-1的平滑值;
a--平滑常數,其取值范圍為[0,1]
據平滑次數不同,指數平滑法分為:一次指數平滑法、二次指數平滑和三次指數平滑法等。
具體可以參考:https://blog.csdn.net/u013527419/article/details/52822622
六、R語言中實現案例
#時間序列相關案例
#ts方法構建時間序列介紹
a<-ts(1:30,frequency = 12,start = c(2011,3))
print(a)
# > print(a)
# Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec
# 2011 1 2 3 4 5 6 7 8 9 10
# 2012 11 12 13 14 15 16 17 18 19 20 21 22
# 2013 23 24 25 26 27 28 29 30
str(a)
attributes(a)
#在ts函數的參數中,1:30代以1-30為基礎建立30個時間序列值,frequence=7代表以周循環,=12代表以月循環,=4代表以季度循環
#start 代表起始的日期
#將時間序列拆分成趨勢成分、季節成分、隨機成分
#所謂的趨勢成分是指長時間間隔的大體運動方向,季節成分是指季節性的變化,隨機成分是指重復但非周期的波動,最終是隨機成分
#R自帶的AirPassengers中很好演示了時間序列
plot(AirPassengers)
install.packages("tseries")
install.packages("forecast")
library(tseries)
library(forecast)
#同樣可以使用tsdisplay函數顯示ACF和PACF圖,用來確定arima函數的參數
tsdisplay(AirPassengers)
#使用decompose()函數將其拆分為不同成分
dc<-decompose(AirPassengers)
#打印出四種趨勢圖
plot(dc)
#打印出關於季節性趨勢的圖表
season<-dc$figure
plot(season,type = "b",xaxt="n",xlab = "")
#構建arima模型,我們首先使用forcast包里的auto.arima進行參數估計,然后再使用arima
a<-auto.arima(AirPassengers)
print(a)
# > print(a)
# Series: AirPassengers
# ARIMA(2,1,1)(0,1,0)[12]
#
# Coefficients:
# ar1 ar2 ma1
# 0.5960 0.2143 -0.9819
# s.e. 0.0888 0.0880 0.0292
#
# sigma^2 estimated as 132.3: log likelihood=-504.92
# AIC=1017.85 AICc=1018.17 BIC=1029.35
fit<-arima(AirPassengers,order = c(2,1,1),seasonal = list(order=c(0,1,0),period=12))
print(fit)
fore=predict(fit,n.head=24)
U<-fore$pred+2*fore$se
L<-fore$pred-2*fore$se
ts.plot(AirPassengers,fore$pred,U,L,col=c(1,2,4,4),lty=c(1,1,2,2))
install.packages("urca")
library(urca)
ur.df(AirPassengers)
# ###############################################################
# # Augmented Dickey-Fuller Test Unit Root / Cointegration Test #
# ###############################################################
#
# The value of the test statistic is: -0.3524
-0.3524小於5%的小概率時間,所以是穩定的?
本案例中最終預測曲線沒有畫出上下界,尚未找到原因。
另外,時間序列中存在時間序列聚類和時間序列分類的問題,尚待總結。
參考書目:
A Complete Tutorial on Time Series Modeling in R
《時間序列預測實踐教程》-清華大學出版社
《時間序列分析28講視頻》-中國科技大學
時間序列完全教程:https://blog.csdn.net/Earl211/article/details/50957029
原文鏈接:https://blog.csdn.net/glodon_mr_chen/java/article/details/79848827