【預備操作】
以下方法請先安裝和加載forecast/fpp包
install.packages("forecast") install.packages("fpp") library('forecast') library('fpp')
以下方法被筆者實用在自己論文實驗中,相關論文發表在ICTAI 2013
Detecting Impolite Crawler by using Time Series Analysis.
Zhiqian Chen, Wenya Feng
25th International Conference on Tools and Artificial Intelligence
移動平均分解法
用經典的移動平均分解時序為季節性,趨勢和不規則部分,使用加法或乘法季節部分。
(Decompose a time series into seasonal, trend and irregular components using moving averages. Deals with additive or multiplicative seasonal component.)
1 births <- scan("http://robjhyndman.com/tsdldata/data/nybirths.dat")
2 birthstimeseries <- ts(births, frequency=12, start=c(1946,1))
注意這里的frequency要和最小單周期長度匹配效果才好(待學習)
3 如需查看可以 birthstimeseries 或 plot.ts(birthstimeseries)
4 birthstimeseriescomponents <- decompose(birthstimeseries)
估計出的季節性、趨勢的和不規則部分現在被存儲在變量birthstimeseriescomponents$seasonal, birthstimeseriescomponents$trend 和 birthstimeseriescomponents$random
6 plot(birthstimeseriescomponents)
以下是去掉季節性的時序
7 birthstimeseriesseasonallyadjusted <- birthstimeseries - birthstimeseriescomponents$seasonal
8 plot(birthstimeseriesseasonallyadjusted)
或
7 birthstimeseriesadj <- seasadj(birthstimeseries)
8 plot(birthstimeseriesadj)
局部加權回歸法
STL分解基於Loess,即局部加權回歸散點平滑法,是1990年由密歇根大學的R. B. Cleveland教授以及AT&T Bell實驗室的W. S. Cleveland等人提出來的一種對時間序列進行分解的方法。STL分解將時間序列分解成季節項、趨勢項及殘余項。
1 births <- scan("http://robjhyndman.com/tsdldata/data/nybirths.dat")
2 birthstimeseries <- ts(births, frequency=12, start=c(1946,1))
3 如需查看可以 birthstimeseries 或 plot.ts(birthstimeseries)
4 birthstimeseriescomponents <- stl(birthstimeseries,s.window="periodic")
5 plot(birthstimeseriescomponents)

6 birthstimeseriescomponents <- forecast(birthstimeseriescomponents)
7 plot(birthstimeseriescomponents)

筆者嘗試用STL預測手頭的一個時序數據(第一列是實際觀察值(a),第二列是預測值(b),第三列是1-(b-a)/a的百分比格式數據),總體偏大5%-10%,還是不錯的:
| 55701279 | 58251140 | 95.42% |
| 64829888 | 71947199 | 89.02% |
| 65720870 | 72256152 | 90.06% |
| 65596679 | 69039714 | 94.75% |
| 64781972 | 70811590 | 90.69% |
| 60384601 | 62627480 | 96.29% |
| 54116447 | 56363455 | 95.85% |
指數平滑法(HoltWinters)
如果你的時間序列可以被描述為一個增長或降低趨勢的、沒有季節性的相加模型,你可以使用霍爾特指數平滑法對其進行短期預測。Holt指數平滑法估計當前時間點的水平和斜率。其平滑化是由兩個參數控制的,alpha,用於估計當前時間點的水平,beta,用於估計當前時間點趨勢部分的斜率。正如簡單指數平滑法一樣,alpha和beta參數都介於0到1之間,並且當參數越接近0,大多數近期的觀測則將占據預測更小的權重。
1 skirts <- scan("http://robjhyndman.com/tsdldata/roberts/skirts.dat",skip=5)
2 skirtsseries <- ts(skirts,start=c(1866))
3 plot.ts(skirtsseries)
4 skirtsseriesforecasts <- HoltWinters(skirtsseries, gamma=FALSE)
樣本內預測,意義?
5 plot(skirtsseriesforecasts)
6 skirtsseriesforecasts2 <- forecast.HoltWinters(skirtsseriesforecasts, h=19)
7 plot.forecast(skirtsseriesforecasts2)

和簡單指數平滑法一樣,我們瞧瞧樣本內預測誤差是否在延遲1-20階時是非零自相關的,以此來檢驗模型是否還
可以被優化。如裙邊數據中,我們可以創建一個相關圖,進行Ljung-Box檢驗
1 acf(skirtsseriesforecasts2$residuals, lag.max=20) 2 Box.test(skirtsseriesforecasts2$residuals, lag=20, type="Ljung-Box")
一般取20階,而且統計量Q的P值>0.05則不能拒絕隨機時序假設(就說無自相關性的隨機了,時序無信息。概率越大越確定?),反之則使非白噪聲序列。純隨機性檢驗,P值小於5%,序列為非白噪聲
在拿不准情況下可以做正太直方圖
自回歸整合移動平均(ARIMA)
指數平滑法對於預測來說是非常有幫助的,而且它對時間序列上面連續的值之間相關性沒有要求。但是,如果你想使用指數平滑法計算出預測區間,那么預測誤差必須是不相關的,而且必須是服從零均值、方差不變的正態分布。 即使指數平滑法對時間序列連續數值之間相關性沒有要求,在某種情況下,我們可以通過考慮數據之間的相關性來創建更好的預測模型。自回歸移動平均模型(ARIMA)包含一個確定(explicit)的統計模型用於處理時間序列的不規則部分,它也允許不規則部分可以自相關。
1 volcanodust <- scan("http://robjhyndman.com/tsdldata/annual/dvi.dat", skip=1)
2 volcanodustseries <- ts(volcanodust,start=c(1500))
3 plot.ts(volcanodustseries)
4 auto.arima(volcanodust)
根據給出來的參數在下一步選擇建模參數order(q,d,p)
5 volcanodustseriesarima <- arima(volcanodustseries, order=c(2,0,0))
6 volcanodustseriesforecasts <- forecast.Arima(volcanodustseriesarima, h=31)
7 plot.forecast(volcanodustseriesforecasts)

參考文獻:
本文主要參考, http://a-little-book-of-r-for-time-series.readthedocs.org/en/latest/src/timeseries.html
某sina網友對STL方法的理解,http://blog.sina.com.cn/s/blog_5ffd41cf01012i5e.html
STL方法發源論文, http://cs.wellesley.edu/~cs315/Papers/stl%20statistical%20model.pdf
fpp使用理論和具體方法, http://otexts.com/fpp/
robjhyndman教授網站, http://robjhyndman.com/?s=seasadj
robjhyndman教授的課件, http://maths-people.anu.edu.au/~johnm/courses/r/ASC2008/pdf/Rtimeseries-ohp.pdf
