15.1 時間序列--概念
15.1.1 概念
- 橫截面數據:在一個給定的時間點測量變量值
- 縱向數據:隨著時間的變化反復測量變量值
對時序數據的研究包括兩個基本問題:
- 對數據的描述【這段時間內發生了什么?趨勢?季節性?】
- 預測【接下來會發生什么?時間序列模型的預測】
15.1.2 生成時間序列
在R中,一個數值型向量或數據框中的一列可通過ts()
函數存儲為時序對象
myseries <- ts(data, start=, end=, frequency=)
- data:原始的包含觀測值的數值型向量
- start:時序的起始時間
- end:時序的終止時間
- frequency:為每個單位時間所包含的觀測值數量(如frequency=1對應年度數據,frequency=12對應月度數據,frequency=4對應季度數據
sales <- c(18, 33, 41, 7, 34, 35, 24, 25, 24, 21, 25, 20, 22, 31, 40, 29, 25, 21, 22, 54, 31, 25, 26, 35)
tsales <- ts(sales, start=c(2003, 1), frequency=12)
tsales
plot(tsales) # 繪制時間序列
start(tsales) # start()獲得起始時間
end(tsales) # end()獲得結束時間
frequency(tsales) # frequency()獲得頻率
# window()函數取子集
tsales.subset <- window(tsales, start=c(2003, 5), end=c(2004, 6))
tsales.subset
15.2 時序的平滑化和季節分解
時間序列數據【存在季節性因素,如月度數據、季度數據等】可以被分解為趨勢因子、季節性因子和隨機因子
-
趨勢因子
trend component
能捕捉到長期變化 -
季節性因子
seasonal component
能捕捉到一年內的周期性變化 -
隨機(誤差)因子
irregular/error component
能捕捉到那些不能被趨勢或季節效應解釋的變化。
可以通過相加模型,也可以通過相乘模型來分解數據
對于乘法模型,可以取對數,將其轉化為加性模型
那么如何將時間序列進行拆分,分解成這三部分呢?對于趨勢和季節的分解,下面介紹移動平均和季節因子
15.2.1 分解趨勢--移動平均
時序數據集中通常有很顯著的隨機或誤差成分。為了辨明數據中的規律,我們總是希望能夠撇開這些波動,畫出一條平滑曲線。畫出平滑曲線的最簡單辦法是簡單移動平均。比如每個數據點都可用這一點和其前后q個點的平均值來表示,這就是居中移動平均centered moving average
St是時間點t的平滑值,k=2q+1
是每次用來平均的觀測值的個數,一般我們會將其設為一個奇數。居中移動平均法的代價是,每個時序集中我們會損失最后的q個觀測值,平均值消除了數據中的一些隨機性
使用R語言forecast
包中的ma()
函數來對Nile時序數據進行平滑處理
ma(ts,k=)
- ts:時間序列數據
- k:移動平均的步長為k
library(forecast)
opar <- par(no.readonly=TRUE)
par(mfrow=c(2,2))
ylim <- c(min(Nile), max(Nile))
plot(Nile, main="Raw time series")
plot(ma(Nile, 3), main="Simple Moving Averages (k=3)", ylim=ylim)
plot(ma(Nile, 7), main="Simple Moving Averages (k=7)", ylim=ylim)
plot(ma(Nile, 15), main="Simple Moving Averages (k=15)", ylim=ylim)
par(opar)
從圖像來看,隨著k的增大,圖像變得越來越平滑。因此我們需要找到最能畫出數據中規律的k,避免過平滑或者欠平滑。這里并沒有什么特別的科學理論來指導k的選取,我們只是需要先嘗試多個不同的k,再決定一個最好的k
除此之外,還可以使用加權移動平均來進行平滑化
加權移動平均法的一大優勢是它可以讓趨勢周期項的估計更平滑。觀測值不是直接完全進入或離開計算,它們的權重緩步增加,然后緩步下降,讓曲線更加平滑
15.2.2 季節分解
季節指數的計算
- 季節因子(Seasonal factor)
- Sk代表第k個季節的季節因子,分子代表第k個季度的平均數,分母代表總平均數
- 季節因子表示第k個季節的數相對于總平均數的占比,反應當前季節相對于平均值的變化
- Sk越接近1,季節性越弱,Sk大于1說明該季度的值高于平均值,Sk小于1說明該季度的值低于平均值
-
季節性差分
有時候我們需要消除季節性,需要將季節性從數據中剔除,這個過程叫季節調整
s代表周期,即使用t期的數據減t-s期的數據
將時序分解為趨勢項、季節項和隨機項的常用方法是用LOESS光滑做季節性分解。這可以通 過R中的stl()
函數
stl(ts, s.window=, t.window=)
- ts:要分解的時間序列
- s.window:控制季節效應變化的速度
- t.window:控制趨勢項變化的速度
stl函數只能處理相加模型,如果要處理相乘模型,可以使用log進行轉換
AirPassengers # 國際航班乘客數據集
plot(AirPassengers)
lAirPassengers <- log(AirPassengers)
plot(lAirPassengers, ylab="log(AirPassengers)")
fit <- stl(lAirPassengers, s.window="period") # 將季節效應限定為每年都一樣
plot(fit)
fit$time.series
相關參考:
[1] https://www.youtube.com/watch?v=2mM8BUqWAZ4
[2] https://zhuanlan.zhihu.com/p/21877990
[3] http://www.lxweimin.com/p/e6d286132690
[4] https://nwfsc-timeseries.github.io/atsa-labs/sec-boxjenkins-stationarity.html
[6] Kabacoff, Robert. R 語言實戰. Ren min you dian chu ban she, 2016.