1. 程式人生 > >時間序列完全教程(R)

時間序列完全教程(R)

簡介

在商業應用中,時間是最重要的因素,能夠提升成功率。然而絕大多數公司很難跟上時間的腳步。但是隨著技術的發展,出現了很多有效的方法,能夠讓我們預測未來。不要擔心,本文並不會討論時間機器,討論的都是很實用的東西。 
本文將要討論關於預測的方法。有一種預測是跟時間相關的,而這種處理與時間相關資料的方法叫做時間序列模型。這個模型能夠在與時間相關的資料中,尋到一些隱藏的資訊來輔助決策。 
當我們處理時序序列資料的時候,時間序列模型是非常有用的模型。大多數公司都是基於時間序列資料來分析第二年的銷售量,網站流量,競爭地位和更多的東西。然而很多人並不瞭解的時間序列分析這個領域。 
所以,如果你不瞭解時間序列模型。這篇文章將會想你介紹時間序列模型的處理步驟以及它的相關技術。 
本文包含的內容如下所示: 
目錄 
* 1、時間序列模型介紹 
* 2、使用R語言來探索時間序列資料 
* 3、介紹ARMA時間序列模型 
* 4、ARIMA時間序列模型的框架與應用

讓我們開始吧

1、時間序列模型介紹

Let’s begin。本節包括平穩序列,隨機遊走,Rho係數,Dickey Fuller檢驗平穩性。如果這些知識你都不知道,不用擔心-接下來這些概念本節都會進行詳細的介紹,我敢打賭你很喜歡我的介紹的。

平穩序列

判斷一個序列是不是平穩序列有三個評判標準: 
1. 均值 ,是與時間t 無關的常數。下圖(左)滿足平穩序列的條件,下圖(右)很明顯具有時間依賴。 

  1. 方差 ,是與時間t 無關的常數。這個特性叫做方差齊性。下圖顯示了什麼是方差對齊,什麼不是方差對齊。(注意右手邊途中的不同分佈。) 

  2. 協方差 ,只與時期間隔k有關,與時間t 無關的常數。如下圖(右),可以注意到隨著時間的增加,曲線變得越來越近。因此紅色序列的協方差並不是恆定的。 

我們為什麼要關心平穩時間序列呢?

除非你的時間序列是平穩的,否則不能建立一個時間序列模型。在很多案例中時間平穩條件常常是不滿足的,所以首先要做的就是讓時間序列變得平穩,然後嘗試使用隨機模型預測這個時間序列。有很多方法來平穩資料,比如消除長期趨勢,差分化。

隨機遊走

這是時間序列最基本的概念。你可能很瞭解這個概念。但是,很多工業界的人仍然將隨機遊走看做一個平穩序列。在這一節中,我會使用一些數學工具,幫助理解這個概念。我們先看一個例子 
例子:想想一個女孩隨機的在想象一個女孩在一個巨型棋盤上面隨意移動。這裡,下一個位置只取決於上一個位置。 
 

現在想象一下,你在一個封閉的房間裡,不能看見這個女孩。但是你想要預測不同時刻這個女孩的位置。怎麼才能預測的準一點?當然隨著時間的推移你預測的越來越不準。在t=0時刻,你肯定知道這個女孩在哪裡。下一個時刻女孩移動到附件8塊方格中的一塊,這個時候,你預測到的可能性已經降為1/8。繼續往下繼續預測,現在我們將這個序列公式化:

<code class="hljs ruby has-numbering" style="display: block; padding: 0px; background: transparent; color: inherit; box-sizing: border-box; font-family: "Source Code Pro", monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal;"><span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$X</span>(t) = <span class="hljs-constant" style="box-sizing: border-box;">X</span>(t-<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>) + <span class="hljs-constant" style="box-sizing: border-box;">Er</span>(t)<span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$
</span>這裡的<span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$Er_t</span><span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$代</span>表這這個時間點隨機干擾項。這個就是女孩在每一個時間點帶來的隨機性。</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right: 1px solid rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right: 1px solid rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li></ul>

現在我們遞迴所有x時間點,最後我們將得到下面的等式:

<code class="hljs lasso has-numbering" style="display: block; padding: 0px; background: transparent; color: inherit; box-sizing: border-box; font-family: "Source Code Pro", monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal;"><span class="hljs-variable" style="color: rgb(102, 0, 102); box-sizing: border-box;">$X</span>(t) <span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">=</span> X(<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>) <span class="hljs-subst" style="color: rgb(0, 0, 0); box-sizing: border-box;">+</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">Sum</span>(Er(<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>),Er(<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2</span>),Er(<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">3</span>)<span class="hljs-attribute" style="box-sizing: border-box;">...</span><span class="hljs-built_in" style="color: rgb(102, 0, 102); box-sizing: border-box;">..</span>Er(t))$</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right: 1px solid rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right: 1px solid rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li></ul>

現在,讓我們嘗試驗證一下隨機遊走的平穩性假設: 
1. 是否均值為常數?

<code class="hljs mathematica has-numbering" style="display: block; padding: 0px; background: transparent; color: inherit; box-sizing: border-box; font-family: "Source Code Pro", monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">E</span>[X(t)] = <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">E</span>[X(<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>)] + <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">Sum</span>(<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">E</span>[Er(<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>)],<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">E</span>[Er(<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2</span>)],<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">E</span>[Er(<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">3</span>)].....<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">E</span>[Er(t)])</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right: 1px solid rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right: 1px solid rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li></ul>

我們知道由於隨機過程的隨機干擾項的期望值為0.到目前為止:E[X(t)] = E[X(0)] = 常數 
2. 是否方差為常數?

<code class="hljs php has-numbering" style="display: block; padding: 0px; background: transparent; color: inherit; box-sizing: border-box; font-family: "Source Code Pro", monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">Var</span>[X(t)] = <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">Var</span>[X(<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>)] + Sum(<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">Var</span>[Er(<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>)],<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">Var</span>[Er(<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">2</span>)],<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">Var</span>[Er(<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">3</span>)].....<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">Var</span>[Er(t)])
<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">Var</span>[X(t)] = t * <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">Var</span>(Error) = 時間相關</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right: 1px solid rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right: 1px solid rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li></ul>

因此,我們推斷,隨機遊走不是一個平穩的過程,因為它有一個時變方差。此外,如果我們檢查的協方差,我們看到協方差依賴於時間。

我們看一個更有趣的東西

我們已經知道一個隨機遊走是一個非平穩的過程。讓我們在方程中引入一個新的係數,看看我們是否能制定一個檢查平穩性的公式。 
Rho係數

<code class="hljs fix has-numbering" style="display: block; padding: 0px; background: transparent; color: inherit; box-sizing: border-box; font-family: "Source Code Pro", monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal;"><span class="hljs-attribute" style="box-sizing: border-box;">X(t) </span>=<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;"> Rho * X(t-1) + Er(t)</span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right: 1px solid rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right: 1px solid rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li></ul>

現在,我們將改變Rho看看我們可不可以讓這個序列變的平穩。這裡我們只是看,並不進行平穩性檢驗。 
讓我們從一個Rho=0的完全平穩序列開始。這裡是時間序列的圖: 

將Rho的值增加到0.5,我們將會得到如下圖: 
 
你可能會注意到,我們的週期變長了,但基本上似乎沒有一個嚴重的違反平穩性假設。現在讓我們採取更極端的情況下ρ= 0.9 
 
我們仍然看到,在一定的時間間隔後,從極端值返回到零。這一系列也不違反非平穩性明顯。現在,讓我們用ρ= 1隨機遊走看看 
 
這顯然是違反固定條件。是什麼使rho= 1變得這麼特殊的呢?,這種情況並不滿足平穩性測試?我們來找找這個數學的原因 
公式X(t) = Rho * X(t-1) + Er(t)的期望為:

<code class="hljs mathematica has-numbering" style="display: block; padding: 0px; background: transparent; color: inherit; box-sizing: border-box; font-family: "Source Code Pro", monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">E</span>[X(t)] = Rho *<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">E</span>[ X(t-<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>)]</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right: 1px solid rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right: 1px solid rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li></ul>

這個公式很有意義。下一個X(或者時間點t)被拉到Rho*上一個x的值。 
例如,如果x(t–1)= 1,E[X(T)] = 0.5(Rho= 0.5)。現在,如果從零移動到任何方向下一步想要期望為0。唯一可以讓期望變得更大的就是錯誤率。當Rho變成1呢?下一步沒有任何可能下降。

Dickey Fuller Test平穩性

這裡學習的最後一個知識點是Dickey Fuller檢驗。。在統計學裡,Dickey-Fuller檢驗是測試一個自迴歸模型是否存在單位根。這裡根據上面Rho係數有一個調整,將公式轉換為Dickey-Fuller檢驗

<code class="hljs coffeescript has-numbering" style="display: block; padding: 0px; background: transparent; color: inherit; box-sizing: border-box; font-family: "Source Code Pro", monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal;">X<span class="hljs-function" style="box-sizing: border-box;"><span class="hljs-params" style="color: rgb(102, 0, 102); box-sizing: border-box;">(t)</span> = <span class="hljs-title" style="box-sizing: border-box;">Rho</span> * <span class="hljs-title" style="box-sizing: border-box;">X</span><span class="hljs-params" style="color: rgb(102, 0, 102); box-sizing: border-box;">(t-<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>)</span> + <span class="hljs-title" style="box-sizing: border-box;">Er</span><span class="hljs-params" style="color: rgb(102, 0, 102); box-sizing: border-box;">(t)</span>
=></span>  X(t) - X(t-<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>) = (Rho - <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>) X(t - <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>) + Er(t)</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right: 1px solid rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right: 1px solid rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li></ul>

我們要測試如果Rho–1=0是否差異顯著。如果零假設不成立,我們將得到一個平穩時間序列。 
平穩性測試和將一個序列轉換為平穩性序列是時間序列模型中最重要的部分。因此需要記住本節提到的所有概念方便進入下一節。 
接下來就看看時間序列的例子。

2、使用R探索時間序列

本節我們將學習如何使用R處理時間序列。這裡我們只是探索時間序列,並不會建立時間序列模型。 
本節使用的資料是R中的內建資料:AirPassengers。這個資料集是1949-1960年每個月國際航空的乘客數量的資料。

在入資料集

下面的程式碼將幫助我們在入資料集並且能夠看到一些少量的資料集。

<code class="language-R hljs haskell has-numbering" style="display: block; padding: 0px; background: transparent; color: inherit; box-sizing: border-box; font-family: "Source Code Pro", monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal;">> <span class="hljs-typedef" style="box-sizing: border-box;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">data</span><span class="hljs-container" style="box-sizing: border-box;">(<span class="hljs-type" style="box-sizing: border-box; color: rgb(102, 0, 102);">AirPassengers</span>)</span>#在入資料</span>
 > <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">class</span>(<span class="hljs-type" style="box-sizing: border-box; color: rgb(102, 0, 102);">AirPassengers</span>)
 [<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>] <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"ts"</span>
<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#檢視AirPassengers資料型別,這裡是時間序列資料</span>
 > start(<span class="hljs-type" style="box-sizing: border-box; color: rgb(102, 0, 102);">AirPassengers</span>)
 [<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>] <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1949</span> <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>
<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#這個是Airpassengers資料開始的時間</span>
> end(<span class="hljs-type" style="box-sizing: border-box; color: rgb(102, 0, 102);">AirPassengers</span>)
 [<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>] <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1960</span> <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">12</span>
<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#這個是Airpassengers資料結束的時間</span>
> frequency(<span class="hljs-type" style="box-sizing: border-box; color: rgb(102, 0, 102);">AirPassengers</span>)
 [<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>] <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">12</span>
<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#時間序列的頻率是一年12個月</span>
 > summary(<span class="hljs-type" style="box-sizing: border-box; color: rgb(102, 0, 102);">AirPassengers</span>)
 <span class="hljs-type" style="box-sizing: border-box; color: rgb(102, 0, 102);">Min</span>. <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>st <span class="hljs-type" style="box-sizing: border-box; color: rgb(102, 0, 102);">Qu</span>. <span class="hljs-type" style="box-sizing: border-box; color: rgb(102, 0, 102);">Median</span> <span class="hljs-type" style="box-sizing: border-box; color: rgb(102, 0, 102);">Mean</span> <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">3</span>rd <span class="hljs-type" style="box-sizing: border-box; color: rgb(102, 0, 102);">Qu</span>. <span class="hljs-type" style="box-sizing: border-box; color: rgb(102, 0, 102);">Max</span>.
 <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">104.0</span> <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">180.0</span> <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">265.5</span> <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">280.3</span> <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">360.5</span> <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">622.0</span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right: 1px solid rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right: 1px solid rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li></ul>

矩陣中詳細資料

<code class="language-R hljs vala has-numbering" style="display: block; padding: 0px; background: transparent; color: inherit; box-sizing: border-box; font-family: "Source Code Pro", monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal;"><span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#The number of passengers are distributed across the spectrum</span>
> plot(AirPassengers)
<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">#繪製出時間序列</span>
>abline(reg=lm(AirPassengers~time(AirPassengers)))
<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;"># 擬合一條直線</span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right: 1px solid rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right: 1px solid rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li></ul>

<code class="language-R hljs markdown has-numbering" style="display: block; padding: 0px; background: transparent; color: inherit; box-sizing: border-box; font-family: "Source Code Pro", monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal;"><span class="hljs-blockquote" style="box-sizing: border-box;">> cycle(AirPassengers)</span>
<span class="hljs-code" style="box-sizing: border-box;">     Jan Feb Mar Apr May Jun Jul Aug Sep Oct  Nov Dec</span>
1949   1   2   3   4   5   6   7   8   9  10  11  12
1950   1   2   3   4   5   6   7   8   9  10  11  12
1951   1   2   3   4   5   6   7   8   9  10  11  12
1952   1   2   3   4   5   6   7   8   9  10  11  12
1953   1   2   3   4   5   6   7   8   9  10  11  12
1954   1   2   3   4   5   6   7   8   9  10  11  12
1955   1   2   3   4   5   6   7   8   9  10  11  12
1956   1   2   3   4   5   6   7   8   9  10  11  12
1957   1   2   3   4   5   6   7   8   9  10  11  12
1958   1   2   3   4   5   6   7   8   9  10  11  12
1959   1   2   3   4   5   6   7   8   9  10  11  12
1960   1   2   3   4   5   6   7   8   9  10  11  12
<span class="hljs-header" style="box-sizing: border-box;">#列印每年的週期</span>
<span class="hljs-blockquote" style="box-sizing: border-box;">> plot(aggregate(AirPassengers,FUN=mean))</span>
<span class="hljs-header" style="box-sizing: border-box;">#繪製</span>
<span class="hljs-blockquote" style="box-sizing: border-box;">> boxplot(AirPassengers~cycle(AirPassengers))</span>
<span class="hljs-header" style="box-sizing: border-box;">#繪製盒圖</span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right: 1px solid rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right: 1px solid rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li></ul>

重要推論

  1. 每年的趨勢顯示旅客的數量每年都在增加
  2. 七八月的均值和方差比其他月份要高很多
  3. 每個月的平均值並不相同,但是方差差異很小。因此,可以看出具有很強的週期性。,一個週期為12個月或更少。

檢視資料,試探資料是建立時間序列模型最重要的一部-如果沒有這一步,你將不知道這個序列是不是平穩序列。就像這個例子一樣,我們已經知道了很多關於這個模型的很多細節。 
接下來我們會建立一些時間序列模型以及這些模型的特徵,也會最一些預測。

3、ARMA時間序列模型

ARMA也叫自迴歸移動平均混合模型。ARMA模型經常在時間序列中使用。在ARMA模型中,AR代表自迴歸,MA代表移動平均。如果這些術語聽起來很複雜,不用擔心-下面將會用幾分鐘的時間簡單介紹這些概念。 
我們現在就會領略這些模型的特點。在開始之前,你首先要記住,AR或者MA並不是應用在非平穩序列上的。 
在實際應用中可能會得到一個非平穩序列,你首先要做的就是將這個序列變成平穩序列(通過差分化/轉換),然後選擇可以使用的時間序列模型。 
首先,本文將介紹分開介紹兩個模型(AR&MA)。接下來我們看一看這些模型的特點。

自迴歸時間序列模型

讓我們從下面的例子理解AR模型: 
現狀一個國家的GDP(x(t))依賴與去年的GDP(x(t-1)).這個假設一個國家今年的GDP總值依賴與去年的GDP總值和今年的新開的工廠和服務。但是GDP的主要依賴與去年去年的GDP。 
那麼,GDP的公式為:

<code class="hljs erlang has-numbering" style="display: block; padding: 0px; background: transparent; color: inherit; box-sizing: border-box; font-family: "Source Code Pro", monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal;"><span class="hljs-function" style="box-sizing: border-box;"><span class="hljs-title" style="box-sizing: border-box;">x</span><span class="hljs-params" style="color: rgb(102, 0, 102); box-sizing: border-box;">(t)</span> = <span class="hljs-title" style="box-sizing: border-box;">alpha</span> *  <span class="hljs-title" style="box-sizing: border-box;">x</span><span class="hljs-params" style="color: rgb(102, 0, 102); box-sizing: border-box;">(t – <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>)</span> + <span class="hljs-title" style="box-sizing: border-box;">error</span> <span class="hljs-params" style="color: rgb(102, 0, 102); box-sizing: border-box;">(t)</span>       (1)</span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right: 1px solid rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right: 1px solid rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li></ul>

這個等式就是AR公式。公式(1)表示下一個點完全依賴與前面一個點。alpha是一個係數,希望能夠找到alpha最小化錯誤率。x(t-1)同樣依賴x(t)。 
例如,x(t)代表一個城市在某一天的果汁的銷售量。在冬天,極少的供應商進果汁。突然有一天,溫度上升了,果汁的需求猛增到1000.然而過了幾天,氣溫有下降了。但是眾所周知,人們在熱天會喝果汁,這些人會有50%在冷天仍然喝果汁。在接下來的幾天,這個比例降到了25%(50%的50%),然後幾天後逐漸降到一個很小的數。下圖解釋了AR序列的慣性: 

移動平均時間序列模型

接下來另一個關於移動平均的例子。 
一個公司生成某種型別的包,這個很容易理解。作為一個競爭的市場,包的銷售量從零開始增加的。所以,有一天他做了一個實驗,設計並製作了不同的包,這種包並不會被隨時購買。因此,假設市場上總需求是1000個這種包。在某一天,這個包的需求特別高,很快庫存快要完了。這天結束了還有100個包沒賣掉。我們把這個誤差成為時間點誤差。接下來的幾天仍有幾個客戶購買這種包。下面通過一個簡單的公式來描述這個場景:

<code class="hljs erlang has-numbering" style="display: block; padding: 0px; background: transparent; color: inherit; box-sizing: border-box; font-family: "Source Code Pro", monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal;"><span class="hljs-function" style="box-sizing: border-box;"><span class="hljs-title" style="box-sizing: border-box;">x</span><span class="hljs-params" style="color: rgb(102, 0, 102); box-sizing: border-box;">(t)</span> = <span class="hljs-title" style="box-sizing: border-box;">beta</span> *  <span class="hljs-title" style="box-sizing: border-box;">error</span><span class="hljs-params" style="color: rgb(102, 0, 102); box-sizing: border-box;">(t-<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>)</span> + <span class="hljs-title" style="box-sizing: border-box;">error</span> <span class="hljs-params" style="color: rgb(102, 0, 102); box-sizing: border-box;">(t)</span></span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right: 1px solid rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right: 1px solid rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li></ul>

嘗試把這個圖畫出來,就是這個樣子的: 
 
注意到MA和AR模型的不同了沒?在MA模型中,噪聲/衝擊迅速小時。在AR模型中會受到長時間的影響。

AR模型與MA模型的不同

AR與MA模型的主要不同在於時間序列物件在不同時間點的相關性。 
MA模型用過去各個時期的隨機干擾或預測誤差的線性組合來表達當前預測值。當n>某一個值時,x(t)與x(t-n)的相關性總為0.AM模型僅通過時間序列變數的自身歷史觀測值來反映有關因素對預測目標的影響和作用,步驟模型變數相對獨立的假設條件約束,所構成的模型可以消除普通回退預測方法中由於自變數選擇、多重共線性等造成的困難。即AM模型中x(t)與x(t-1)的相關性隨著時間的推移變得越來越小。這個差別要好好利用起來。

利用ACF和PACF繪圖

一旦我們得到一個平穩時間序列。我們必須要回答兩個最重要的問題; 
Q1:這個是AR或者MA過程? 
Q2:我們需要利用的AR或者MA過程的順序是什麼?

解決這兩個問題我們要藉助兩個係數: 
時間序列x(t)滯後k階的樣本自相關係數(ACF)和滯後k期的情況下樣本偏自相關係數(PACF)。公式省略。 
AR模型的ACF和PACF: 
通過計算證明可知: 
- AR的ACF為拖尾序列,即無論滯後期k取多大,ACF的計算值均與其1到p階滯後的自相關函式有關。 
- AR的PACF為截尾序列,即當滯後期k>p時PACF=0的現象。 
 
上圖藍線顯示值與0具有顯著的差異。很顯然上面PACF圖顯示截尾於第二個滯後,這意味這是一個AR(2)過程。 
MA模型的ACF和PACF: 
- MA的ACF為截尾序列,即當滯後期k>p時PACF=0的現象。 
- AR的PACF為拖尾序列,即無論滯後期k取多大,ACF的計算值均與其1到p階滯後的自相關函式有關。 
 
很顯然,上面ACF圖截尾於第二個滯後,這以為這是一個MA(2)過程。 
目前,本文已經介紹了關於使用ACF&PACF圖識別平穩序列的型別。現在,我將介紹一個時間序列模型的整體框架。此外,還將討論時間序列模型的實際應用。

4、ARIMA時間序列模型的框架與應用

到此,本文快速介紹了時間序列模型的基礎概念、使用R探索時間序列和ARMA模型。現在我們將這些零散的東西組織起來,做一件很有趣的事情。

框架

下圖的框架展示瞭如何一步一步的“做一個時間序列分析” 
這裡寫圖片描述 
前三步我們在前文意見討論了。儘管如此,這裡還是需要簡單說明一下:

第一步:時間序列視覺化

在構建任何型別的時間序列模型之前,分析其趨勢是至關重要的。我們感興趣的細節包括序列中的各種趨勢、週期\季節性或者隨機行為。在本文的第二部分已經介紹了。

第二步:序列平穩

一旦我們知道了模式、趨勢、週期。我們就可以檢查序列是否平穩。Dicky-Fuller是一種很流行的檢驗方式。在第一部分意見介紹了這種檢驗方式。在這裡還沒有結束!如果發現序列是非平穩序列怎麼辦? 
這裡有三種比較常用的技術來讓一個時間序列平穩。 
消除趨勢:這裡我們簡單的刪除時間序列中的趨勢成分。例如,我的時間序列的方程是:

<code class="hljs erlang has-numbering" style="display: block; padding: 0px; background: transparent; color: inherit; box-sizing: border-box; font-family: "Source Code Pro", monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal;"><span class="hljs-function" style="box-sizing: border-box;"><span class="hljs-title" style="box-sizing: border-box;">x</span><span class="hljs-params" style="color: rgb(102, 0, 102); box-sizing: border-box;">(t)</span> = <span class="hljs-params" style="color: rgb(102, 0, 102); box-sizing: border-box;">(mean + trend * t)</span> + <span class="hljs-title" style="box-sizing: border-box;">error</span></span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right: 1px solid rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right: 1px solid rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li></ul>

這裡我簡單的刪除上述公式中的trend*t部分,建立x(t)=mean+error模型 
差分:這個技術常常用來消除非平穩性。這裡我們是對序列的差分的結果建立模型而不是真正的序列。例如:

<code class="hljs erlang has-numbering" style="display: block; padding: 0px; background: transparent; color: inherit; box-sizing: border-box; font-family: "Source Code Pro", monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal;"><span class="hljs-function" style="box-sizing: border-box;"><span class="hljs-title" style="box-sizing: border-box;">x</span><span class="hljs-params" style="color: rgb(102, 0, 102); box-sizing: border-box;">(t)</span> – <span class="hljs-title" style="box-sizing: border-box;">x</span><span class="hljs-params" style="color: rgb(102, 0, 102); box-sizing: border-box;">(t-<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>)</span> = ARMA <span class="hljs-params" style="color: rgb(102, 0, 102); box-sizing: border-box;">(p ,  q)</span></span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right: 1px solid rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right: 1px solid rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li></ul>

這個差分也是ARIMA的部分。現在我們有3個引數了:

<code class="hljs css has-numbering" style="display: block; padding: 0px; background: transparent; color: inherit; box-sizing: border-box; font-family: "Source Code Pro", monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal;"><span class="hljs-tag" style="color: rgb(0, 0, 0); box-sizing: border-box;">p</span><span class="hljs-pseudo" style="color: rgb(0, 0, 0); box-sizing: border-box;">:AR</span>
<span class="hljs-tag" style="color: rgb(0, 0, 0); box-sizing: border-box;">d</span><span class="hljs-pseudo" style="color: rgb(0, 0, 0); box-sizing: border-box;">:I</span>
<span class="hljs-tag" style="color: rgb(0, 0, 0); box-sizing: border-box;">q</span><span class="hljs-pseudo" style="color: rgb(0, 0, 0); box-sizing: border-box;">:MA</span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right: 1px solid rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; background-color: rgb(238, 238, 238); top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right: 1px solid rgb(221, 221, 221); list-style: none; text-align: right;"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li></ul>

季節性:季節性直接被納入ARIMA模型中。下面的應用部分我們再討論這個。

第三步:找到最優引數

引數p,q可以使用ACF和PACF圖發現。除了這種方法,如果相關係數ACF和偏相關係數PACF逐漸減小,這表明我們需要進行時間序列平穩並引入d引數。

第四步:簡歷ARIMA模型

找到了這些引數,我們現在就可以嘗試簡歷ARIMA模型了。從上一步找到的值可能只是一個近似估計的值,我們需要探索更多(p,d,q)的組合。最小的BIC和AIC的模型引數才是我們要的。我們也可以嘗試一些季節性成分。在這裡,在ACF/PACF圖中我們會注意到一些季節性的東西。

第五步:預測

到這步,我們就有了ARIMA模型,我們現在就可以做預測了。我們也可以將這種趨勢視覺化,進行交叉驗證。

時間序列模型的應用。

這裡我們用前面的例子。使用這個時間序列做預測。我們建議你在進行下一步之前,先觀察這個資料。

我們從哪裡開始呢?

下圖是這些年的乘客數的圖。在往下看之前,觀察這個圖。 
 
這裡是我的觀察: 
1. 乘客有著逐年增加的趨勢。 
2. 這看起來有季節性,每一個週期不超過12個月。 
3. 資料的方差逐年增加。 
在我們進行平穩性測試之前我們需要解決兩個問題。第一,我們需要消除方差不齊。這裡我們對這個序列做求對數。第二我們需要解決序列的趨勢性。我們通過對時序序列做差分。現在,我們來檢驗最終序列的平穩性。

<code class="language-R hljs haskell has-numbering" style="display: block; padding: 0px; background: transparent; color: inherit; box-sizing: border-box; font-family: "Source Code Pro", monospace;font-size:undef