時間序列的R語言實現_Part2
這部分是用指數平滑法做的時間序列的R語言實現,建議先看看指數平滑演算法。
用指數平滑做預測
簡單指數平滑(Simple Exponential Smoothing)
對可用加性模型描述的,非週期性的時間序列資料,可用簡單指數平滑來做短期的預測。指數平滑是根據平滑常熟α來做的,α取值在0-1的區間上,α越小越接近0,就表示做預測時對近期觀測所取的比重較大。
說明:指數平滑演算法的原理就是利用歷史觀測資料對未來做預測,α的取值決定著對近期和遠期觀測資料所取的權重。詳細的可以去了解該演算法。
下面是倫敦1813年到1912年的降雨量英尺數的時間序列資料:
由圖可以看出,資料隨時間的隨機波動幅度是大致不變的,所以可以說該時間序列是穩定的。在
說明:HoltWinters有三個類似的引數,alpha,beta,gamma,這三個引數跟上面講到的簡單指數平滑的取值範圍一樣在0-1之間。可以簡單理解alpha是平滑指數,beta是趨勢指數,gamma是季節指數。rainseries時間序列沒有明顯上升或下降的趨勢,也沒有季節性的變化,所以這裡這兩個引數取false。
結果alpha很接近0,說明預測中對近期觀測資料取值權重較大。結果儲存在rainseriesforecasts這個list變數中,預測結果儲存在這個
在圖中將原始時間序列和新的時間序列對照看:
黑色線是原始資料,紅色線是預測資料。檢驗結果的準確度,可以用SSE(誤差項平方和)的值來判斷。SSE也是list變數rainseriesforecasts中的一個元素。檢視SSE的值如下:
這個預測結果原始資料對比誤差項平方和是1828.855。
上面例子中,HoltWinters()方法預設的預測僅覆蓋有原始資料的那個時間段,也就是1813年到1912年的降水量的時間序列。用R中的forecast包中的forecast.HoltWinters()方法可以來做這個預測。首先安裝forecast
上面forecast.HoltWinters()的兩個引數,第一個是上一步rainseriesforecasts用預設的HoltWinters()得到的結果,第二個h是你想要預測的期數,為8,所以得到的預測結果是從1912年往後推的8年即1913-1920。預測結果有5列資料,第一列Forecast是預測值,第二列第三列是80%的置信區間的下限和上限,第四列第五列是95%置信區間的下限和上限。這個預測結果用圖表展示出來如下:
藍線是從1913年到1920年的預測值,顏色較深的部分是預測值80%的置信區間,顏色較淡的藍色是預測值95%的置信區間。對未來資料進行的預測,因為沒有同期觀測資料,所以沒辦法用前面講到的SSE來檢測預測誤差。
這個例子中樣本的預測誤差存在forecast.HoltWinters()方法返回的list變數中的residuals(殘差)元素中。如果做預測模型不可改良,那預測誤差和連續預測結果不相關。也就是說如果預測誤差和預測結果間存在相關性,那所用的簡單指數平滑模型可以用其他預測方法優化。
R中提供了acf()方法可以檢視樣本預測誤差的相關性圖。若要定義我們想要檢視的最大滯後期數,可以定義acf()方法中的lag.max引數。
例如,計算滯後期在1-20時的樣本預測誤差的相關性,如下操作:
從上面的相關性圖可以看出來,在滯後期為3時的自相關結果接近意義界限。
說明:
acf()的說明,自相關公式:
k是在acf方法中定義的lag.max的值,倫敦降雨量預測的例子中,k的取值就是1-20的範圍內。兩條藍色的虛線是意義界限,acf值在這個界限之間,可以認為相關性接近0,可以忽略,如果超出這個範圍就需要另外的判斷了。這個是我自己的理解,僅供參考。如果有問題,歡迎指正!
測試在1-20的延遲期中,是否有意義的非零相關值,我們可以用Ljung-Boxt測試。在R中,用Box.test()的方法。Box.test()方法中的lag引數用來定義我們想要檢視的最大延遲期。用上面倫敦降雨量的預測誤差,作如下操作:
Ljung-Box測試的統計值是17.4,p值是0.6,所以樣本預測誤差的非零相關的可能很小。再次確認預測模型不可再改進,檢視預測誤差是不是以均值0和不變方差按正態分佈。
要檢視預測誤差是否有不變方差,可以被預測誤差的結果做一個時序圖:
從上圖可以看出,儘管1820-1830年這前十年的波動幅度相比1840-1850期間的波動幅度要小一些,預測誤差的方差在時間上還是大致穩定的。
檢視預測誤差是否按0正態分佈,可以檢視預測誤差的直方圖和以0和相同標準誤差呈正態分佈的曲線圖,兩者對比檢視。還是同一個例子,需要自己寫一個R的方法plotForecastErrors()來實現可實現:
上面是plotForecastErrors()方法程式碼,行末$符號表示不換行,#開始的行表示是註釋。下面使用這個方法:
圖上能看出來,預測誤差基本上是以0為中心,大致正態分佈的,與正態分佈曲線相比可能有些向右偏,但右偏量相對小。所以,可以說預測誤差是以0為中心呈正態分佈的。
Ljung-Box測試的結果表明預測誤差的非零自相關的結果很少,它的分佈也滿足以0為中心呈正態分佈。至此,我們可以下結論,簡單指數平滑方法足夠用來做倫敦降雨量的預測模型,也不需要進一步的改進了。並且,80%和95%的預測區間也是基於上述結論得到,可以說是有效的。
霍特雙引數指數平滑(Holt’s Exponential Smoothing)
霍特指數平滑法,包含兩個引數α和β。α平滑常數,β是趨勢常數。跟HoltWinters方法的引數一樣,這兩個引數的取值範圍也在0-1間。所以對滿足加性模型,存在增加趨勢或者遞減趨勢的非季節性的資料,可以選擇用霍特指數平滑法來做短期的預測。
霍特指數平滑法能預估在當前時間點的水平和趨勢。下面是一個非季節性的存在增減趨勢的時間序列例子。從1866年到1911年每年女性裙子邊緣直徑的資料:
可以看出女性裙子邊緣直徑從1866年600左右增大到了1880年的1050,在這之後又降到了1911年的520。
還是用R中的HoltWinters()方法,這裡我們需要用到alpha和beta兩個引數,所以只需要設定gamma=FALSE就行。給女性裙子邊緣直徑的變化這個時間序列做預測模型過程如下:
alpha和beta的值分別為0.838和1,都很大,說明時間序列水平和趨勢部分的預測值,對近期觀測資料所取的權重較大。這個結果從該時間序列隨時間的水平和趨勢變化都很大,就能很直觀看出來。改時間序列預測的誤差項平方和SSE結果是16954.18。
檢視預測結果時間序列圖:
上圖可以看出,除了預測結果有很小的滯後外,預測值時間序列和實際值序列很接近。
也可以自己設定初始的水平值和趨勢值,HoltWinters()方法中的l.start和b.start這兩個引數用來設定初始值。初始水平值一般取第一個時間點的值,初始趨勢值則常取第二個值與第一個值的差值。這個例子中,分別是608和9(617-608)。
嘗試設定l.start和b.start的值,再對女性裙子邊緣直徑時間序列做預測,結果如下,與之前的結果有了一些不同。
前面是同期的預測,同樣可以用forecast包中的forecast.HoltWinters()方法對未來做預測。女性裙子邊緣直徑資料是從1866年到1911年的,對此我們可以做從1911年之後的預測。如若想要1912年到1930這19期的預測資料,如下操作:
與之前用HoltWinters()方法做預測結果一樣,藍線是預測值,深色區域是預測結果的80%置信區間,淺色部分是95%的置信區間。
重複前面用相關性函式來看看是否需要優化模型的過程。
在滯後期為5時,預測誤差的自相關結果超過了意義界限,所以,這裡我們需要進一步的檢測。檢視Box-Ljung測試的結果,可以看看到,p值為0.4749,這個值很小,樣本的預測誤差在1-20的滯後期內,存在非零自相關的可能很小。
對簡單指數平滑,還需要檢視預測誤差是不是存在不變方差,並以0為中心呈正態分佈。類似的過程,使用之前的plotForecastErrors()方法。
從上面兩個圖,能看出,預測誤差的方差隨時間的變化可以認為是大致穩定的,預測誤差也基本滿足正態分佈。所以,結論是,用霍特雙指數平滑模型對從1866年到1911年每年女性裙子邊緣直徑的時間序列做預測是合適的,預測結果經過檢驗也是有效的。
霍特季節性指數平滑(Holt-Winters Exponential Smoothing)
如果時間序列滿足增量模型,存在升降趨勢,並且是季節性的資料。這時,可用霍特季節性指數平滑法來做短期預測。
霍特季節性指數平滑法,包含三個引數α、β和γ。α平滑常數,β是趨勢常數,γ是季節常數。三個引數的取值範圍都是0-1。在R中的實現,還是使用HoltWinters()方法,這一次,它的三個類似引數,我們都需要用到。
使用的時間序列資料是前面取對數後的昆士蘭沙灘旅遊勝地的某一紀念品店的銷售資料。
alpha,beta和gamma的值,分別是0.4134、0、0.956。alpha的值比較小,表明該時間序列的某一時間點的水平預測值,是基於近期觀測值和遠期觀測值。beta為0,表明時間序列趨勢部分值不隨時間變化而改變的,也就是所有時間點上,趨勢的預測值都是初始值。gamma為0.956,這說明季節性部分的預測值,對近期觀測值所取得權重很大。
檢視預測結果,如下:
從圖上,可以看出,霍特季節性指數平滑方法在做這個時間序列的季節性預測時很成功,預測結果與原始資料的11月銷售高峰很貼切。
接下來,對未來做預測,還是用forecast包。
下面對預測結果做檢驗,看預測模型是否需要改進。同樣的方法計算相關性和做Ljung-Box檢驗。過程及結果如下:
樣本的預測誤差的自相關結果,在1-20的滯後期中,沒有超出意義界限。並且Ljung-Box的p值小,說明在1-20的滯後期中,存在非零自相關的可能性很小。
然後檢驗預測誤差是有不變方差,以0為中心呈正態分佈。過程結果如下:
可看出,預測誤差的方差可認為是隨時間穩定的,其分佈也符合正態分佈。所以這個例子中,使用霍特季節性指數平滑所做的預測結果是有效的。