chapter15.1-2 時間序列1--時間序列分解

15.1 時間序列--概念

15.1.1 概念

  • 橫截面數據:在一個給定的時間點測量變量值
  • 縱向數據:隨著時間的變化反復測量變量值

對時序數據的研究包括兩個基本問題:

  1. 對數據的描述【這段時間內發(fā)生了什么?趨勢?季節(jié)性?】
  2. 預測【接下來會發(fā)生什么?時間序列模型的預測】

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 時序的平滑化和季節(jié)分解

時間序列數據【存在季節(jié)性因素,如月度數據、季度數據等】可以被分解為趨勢因子、季節(jié)性因子和隨機因子

  • 趨勢因子trend component能捕捉到長期變化
  • 季節(jié)性因子seasonal component能捕捉到一年內的周期性變化
  • 隨機(誤差)因子irregular/error component能捕捉到那些不能被趨勢或季節(jié)效應解釋的變化。

可以通過相加模型,也可以通過相乘模型來分解數據
\begin{align} \\&Y_{t} = Trend_{t} + Seasonal_{t} + Irregular_{t} \\ \\&Y_{t} = Trend_{t} \times Seasonal_{t} \times Irregular_{t} \end{align}
對于乘法模型,可以取對數,將其轉化為加性模型

那么如何將時間序列進行拆分,分解成這三部分呢?對于趨勢和季節(jié)的分解,下面介紹移動平均和季節(jié)因子

15.2.1 分解趨勢--移動平均

時序數據集中通常有很顯著的隨機或誤差成分。為了辨明數據中的規(guī)律,我們總是希望能夠撇開這些波動,畫出一條平滑曲線。畫出平滑曲線的最簡單辦法是簡單移動平均。比如每個數據點都可用這一點和其前后q個點的平均值來表示,這就是居中移動平均centered moving average
S_{t} =\frac{ (Y_{t-q}+...+Y + ...+Y_{t+q})}{2q+1}

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的增大,圖像變得越來越平滑。因此我們需要找到最能畫出數據中規(guī)律的k,避免過平滑或者欠平滑。這里并沒有什么特別的科學理論來指導k的選取,我們只是需要先嘗試多個不同的k,再決定一個最好的k

除此之外,還可以使用加權移動平均來進行平滑化
\begin{align} \\& assuming\ k=2q+1 \\ \\& weight = [a_{t-q},...,a_{t},...,a_{t+q}] \\ \\& S_{t} = \sum _{j = t-q}^{t+q}ajY_{j} \end{align}

加權移動平均法的一大優(yōu)勢是它可以讓趨勢周期項的估計更平滑。觀測值不是直接完全進入或離開計算,它們的權重緩步增加,然后緩步下降,讓曲線更加平滑

15.2.2 季節(jié)分解

季節(jié)指數的計算

  • 季節(jié)因子(Seasonal factor)

\begin{align} \\& \bar x_{k} = \frac{\sum_{i=1}^{n} x_{i}k}{n}, n = 1,2,3... \\ \\& \bar x = \frac{\sum_{i=1}^{n} \sum_{k=1}{m}x_{i}k}{nm},n = 1,2,3... ; k=1,2,3...m \\ \\&S_{k} = \frac{\bar x_{k}}{\bar x},k=1,2,3....m \end{align}

  1. Sk代表第k個季節(jié)的季節(jié)因子,分子代表第k個季度的平均數,分母代表總平均數
  2. 季節(jié)因子表示第k個季節(jié)的數相對于總平均數的占比,反應當前季節(jié)相對于平均值的變化
  3. Sk越接近1,季節(jié)性越弱,Sk大于1說明該季度的值高于平均值,Sk小于1說明該季度的值低于平均值
  • 季節(jié)性差分

    有時候我們需要消除季節(jié)性,需要將季節(jié)性從數據中剔除,這個過程叫季節(jié)調整
    \Delta _sx_{t} = x_{t} - x_{t-s}
    s代表周期,即使用t期的數據減t-s期的數據

將時序分解為趨勢項、季節(jié)項和隨機項的常用方法是用LOESS光滑做季節(jié)性分解。這可以通 過R中的stl()函數

stl(ts, s.window=, t.window=)

  • ts:要分解的時間序列
  • s.window:控制季節(jié)效應變化的速度
  • t.window:控制趨勢項變化的速度

stl函數只能處理相加模型,如果要處理相乘模型,可以使用log進行轉換

AirPassengers  # 國際航班乘客數據集
plot(AirPassengers) 
lAirPassengers <- log(AirPassengers) 
plot(lAirPassengers, ylab="log(AirPassengers)")
fit <- stl(lAirPassengers, s.window="period")  # 將季節(jié)效應限定為每年都一樣
plot(fit)
fit$time.series

相關參考:

[1] https://www.youtube.com/watch?v=2mM8BUqWAZ4

[2] https://zhuanlan.zhihu.com/p/21877990

[3] http://www.itdecent.cn/p/e6d286132690

[4] https://nwfsc-timeseries.github.io/atsa-labs/sec-boxjenkins-stationarity.html

[6] Kabacoff, Robert. R 語言實戰(zhàn). Ren min you dian chu ban she, 2016.

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內容