前情需知
指數預測模型
指數模型是用來預測時序未來值的最常用模型。這類模型相對比較簡單,但是實踐證明它們的短期預測能力較好。不同指數模型建模時選用的因子可能不同。比如
- 單指數模型(simple/single exponential model)擬合的是只有常數水平項和時間點i處隨機項的時間序列,這時認為時間序列不存在趨勢項和季節效應;
- 雙指數模型(double exponential model;也叫Holt指數平滑,Holt exponential smoothing)擬合的是有水平項和趨勢項的時序;
- 三指數模型(triple exponential model;也叫Holt-Winters指數平滑,Holt-Winters exponential smoothing)擬合的是有水平項、趨勢項以及季節效應的時序。
R中自帶的HoltWinters()函數或者forecast包中的ets()函數可以擬合指數模型。ets()函數的備選參數更多,因此更實用。本節中我們只討論ets()函數。
概述
ets()函數如下:
ets(ts, model="ZZZ")
model="ZZZ",依次含義為錯誤類型、趨勢類型、季節類型。 "A"=additive, "M"=multiplicative and "Z"=automatically
其中ts是要分析的時序,限定模型的字母有三個。第一個字母代表誤差項,第二個字母代表趨勢項,第三個字母則代表季節項。可選的字母包括:相加模型(A)、相乘模型(M)、無(N)、自動選擇(Z)。表15-3中列出了常用的模型。
用於擬合三種指數模型的函數:
類 型 | 參 數 | 函 數 |
---|---|---|
單指數 | 水平項 | ets(ts, model="ANN")/ses(ts) |
雙指數 | 水平項、斜率 | ets(ts, model="AAN")/holt(ts) |
三指數 | 水平項、斜率、季節項 | ets(ts, model="AAA")/hw(ts) |
ses()、holt()、和hw()函數都是ets()函數的便捷包裝(convenience wrapper),函數中有事先默認設定的參數值。
首先我們討論最基礎的指數模型,也即單指數平滑。在此之前,請先確保你的電腦已安裝forecast包(install.packages("forecast"))。
單指數平滑
單指數平滑根據現有的時序值的加權平均對未來值做短期預測,其中權數選擇的宗旨是使得距離現在越遠的觀測值對平均數的影響越小。
單指數平滑模型假定時序中的觀測值可被表示為:
在時間點Yt+1的預測值(一步向前預測,1-step ahead forecast)可寫作
其中 並且0≤α≤1。權數ci的總和為1,則一步向前預測可看作當前值和全部歷史值的加權平均。式中α參數控制權數下降的速度,α越接近於1,則近期觀測值的權重越大;反之,α越接近於0,則歷史觀測值的權重越大。為最優化某種擬合標准,α的實際值一般由計算機選擇,常見的擬合標准是真實值和預測值之間的殘差平方和。下文將給出一個具體例子。
nhtemp時序中有康涅狄格州紐黑文市從1912年到1971年每一年的平均華氏溫度。圖15-8給出了時序的折線圖。
圖15-8 康涅狄格州紐黑文地區的年平均氣溫,以及ets()函數擬合的單指數模型所得到的一步向前預測
從圖15-8可以看到,時序中不存在某種明顯的趨勢,而且無法從年度數據看出季節性因素,因此我們可以先選擇擬合一個單指數模型。代碼清單15-4中給出了用ses()函數做一步向前預測的代碼。
單指數平滑
> library(forecast)
> fit <- ets(nhtemp, model="ANN")
> fit
> forecast(fit, 1)
> plot(forecast(fit, 1), xlab="Year",
ylab=expression(paste("Temperature (", degree*F,")",)),
main="New Haven Annual Mean Temperature")
> accuracy(fit)
ets(mode="ANN")語句對時序數據擬合單指數模型,其中A表示可加誤差,NN表示時序中不存在趨勢項和季節項。α值比較小(α=0.18)說明預測時同時考慮了離現在較近和較遠的觀測值,這樣的α值可以最優化模型在給定數據集上的擬合效果。
forecast()函數用於預測時序未來的k步,其形式為forecast(fit, k)。這一數據集中一步向前預測的結果是51.9°F,其95%的置信區間為49.7°F到54.1°F➋。圖15-8中給出了時序值、預測值以及80%和95%的置信區間➌。
forecast包同時提供了accuracy()函數,展示了時序預測中最主流的幾個准確性度量。表15-4中給出了這幾個度量的描述。et代表第t個觀測值的誤差項(隨機項),即 。
表15-4 預測准確性度量
度量標准 | 簡 寫 |
---|---|
平均誤差 | ME |
平均殘差平方和的平方根 | RMSE |
平均絕對誤差 | MAE |
平均百分比誤差 | MPE |
平均絕對百分誤差 | MAPE |
平均絕對標准化誤差 | MASE |
一般來說,平均誤差和平均百分比誤差用處不大,因為正向和負向的誤差會抵消掉。RMSE給出了平均誤差平方和的平方根,本例中即1.13°F。平均絕對百分誤差給出了誤差在真實值中的占比,它沒有單位,因此可以用於比較不同時序間的預測准確性;但它同時假定測量尺度中存在一個真實為零的點(比如每天的游客數量),但華氏溫度中並沒有一個真實為零(即不存在分子運動動能)的點,因此這里不能用這個統計量。平均絕對標准化誤差是最新的一種准確度測量,通常用於比較不同尺度的時序間的預測准確性。這幾種預測准確性度量中,並不存在某種最優度量,不過RMSE相對最有名、最常用。
單指數平滑假定時序中缺少趨勢項和季節項,下節介紹的指數模型則可兼容這些情況。
Holt指數平滑和Holt-Winters指數平滑
Holt指數平滑可以對有水平項和趨勢項(斜率)的時序進行擬合。
有水平項、斜率以及季節項的指數模型
> library(forecast)
> fit <- ets(log(AirPassengers), model="AAA")
> fit
>accuracy(fit)
> pred <- forecast(fit, 5)
> pred
> plot(pred, main="Forecast for Air Travel",
ylab="Log(AirPassengers)", xlab="Time")
> predmean <- exp(predmean)
> predlower <- exp(predlower)
> predupper <- exp(predupper)
> p <- cbind(predmean, predlower, pred$upper)
> dimnames(p)[[2]] <- c("mean", "Lo 80", "Lo 95", "Hi 80", "Hi 95")
> p
給出了三個光滑參數,即水平項0.82、趨勢項0.0004、季節項0.012。趨勢項的參數小意味着近期觀測值的斜率不需要更新。
forecast()函數預測了接下來五個月的乘客量,此時的預測基於對數變換后的數值,因此我們通過冪變換得到預測的結果。矩陣pred$mean包含了點估計值,矩陣pred$lower和pred$upper中分別包含了80%和95%置信區間的下界以及上界。exp()函數返回了基於原始尺度的預測值,cbind()用於整合所有結果。
ets()函數和自動預測
ets()函數還可以用來擬合有可乘項的指數模型,加入抑制因子(dampening component),以及進行自動預測。本節將詳細討論ets()函數的這些功能。
在前面的小節中,我們對時序數據做對數變換后擬合出了可加指數模型。類似地,我們也可以通過ets(AirPassengers, model="MAM")
函數或hw(AirPassengers, seasonal="multiplicative")
函數對原始數據擬合可乘模型。此時,我們仍假定趨勢項可加,但季節項和誤差項可乘。當采用可乘模型時,准確度統計量和預測值都基於原始尺度。這也是它的一個明顯優勢。
ets()函數也可以用來擬合抑制項。時序預測一般假定序列的長期趨勢是一直向上的(如房價市場),而一個抑制項則使得趨勢項在一段時間內靠近一條水平漸近線。在很多問題中,一個有抑制項的模型往往更符合實際情況。
最后,我們也可以通過ets()函數自動選取對原始數據擬合優度最高的模型。
自動選取最優模型的步驟,使用ets()進行自動指數預測
> library(forecast)
> fit <- ets(JohnsonJohnson)
> fit
> plot(forecast(fit), main="Johnson & Johnson Forecasts",
ylab="Quarterly Earnings (Dollars)", xlab="Time", flty=2)
這里我們並沒有指定模型,因此軟件自動搜索了一系列模型,並在其中找到最小化擬合標准(默認為對數似然)的模型。所選中的模型同時有可乘趨勢項、季節項和隨機誤差項。圖15-10給出了其折線圖以及下八個季度(默認)的預測。flty參數指定了圖中預測值折線的類型(虛線)。