目錄
00引言
在畢業實用統計模型(一)——時間序列1中介紹了時間序列的模型的基本建模思路,在畢業設計實用模型(二)——時間序列之SARIMA2中說明了ARMA、ARIMA、SARIMA三大模型的關係與參數調整。但是在實際建模中往往會遇到更加實際的需求:模型的評估、參數檢驗、預測圖的展示、模型參數的調整。對於很對不喜歡編程的人來說很是痛苦。本文將會重點從上述幾個方面講述forecast包
裏的主要的函數,並給出實例。從本文中你將會學會:
- 更加高效的的模型預測圖。
- 模型的參數檢驗
- 模型定階的函數
- 模型的評估函數
- 擬合線性的模型函數
- 相關圖繪畫,以及誤差的標註
- 輸出模型的預測誤差
注:本文部分代碼案例來自
forecast包
,大家有疑問可以自行去查找3.如果進不去可以運行下面代碼會找到。
library(forecast)
help(package = forecast)
1、accuracy函數
描述:輸入參數是模型,輸出下面的結果:
參數 | 含義 |
---|---|
ME: | 平均誤差 |
RMSE | 根均方誤差 |
MAE | 平均絕對誤差 |
MPE | 平均百分比誤差 |
MAPE | 平均絕對百分比誤差 |
MASE | 平均絕對比例誤差 |
ACF1 | 滯後1階誤差的自相關 |
函數示例:
> n = 50;p = 10
> x = rnorm(p)
> fit1 <- ar(rnorm(n))
> fit <- forecast(fit1, h = p)
> accuracy(fit)
ME RMSE MAE MPE MAPE MASE
Training set 0.1143757 1.594933 1.33946 287.3696 602.0162 1.299599
ACF1
Training set -0.1573861
> accuracy(fit,x = x)
ME RMSE MAE MPE MAPE MASE
Training set 0.1143757 1.594933 1.3394599 287.3696 602.0162 1.2995990
Test set -0.2194929 0.833041 0.6356776 132.4545 239.1639 0.6167606
ACF1
Training set -0.1573861
Test set NA
> plot(fit)
> lines(51:60,x)
最後的圖片:
2、Acf、Pacf、taperedacf、taperedpacf
這四個函數分別是自相關函數、偏自相關函數、帶有誤差的自相關函數、帶有誤差的偏自相關函數。前兩個很熟悉和內置的acf、pacf一樣,下面只給出後兩個的示例:
n = 50
set.seed(0)
x = rnorm(n, 1,3)
taperedacf(x, nsim=50)
taperedpacf(x, nsim=50)
3、arfima
可以建立長期記憶的時間序列模型。
直接給例子了哦:
> n = 50 # 生成數據
> set.seed(0)
> x = rnorm(n, 1,3)
> fit <- arfima(x) # 擬合模型
輸出模型效果:
> fit
> Call:
arfima(y = x)
Coefficients:
d
0.06385553
sigma[eps] = 2.716399
a list with components:
[1] "log.likelihood" "n" "msg" "d"
[5] "ar" "ma" "covariance.dpq" "fnormMin"
[9] "sigma" "stderror.dpq" "correlation.dpq" "h"
[13] "d.tol" "M" "hessian.dpq" "length.w"
[17] "residuals" "fitted" "call" "x"
[21] "series"
> summary(fit)
Call:
arfima(y = x)
Coefficients:
Estimate Std. Error z value Pr(>|z|)
d 6.386e-02 1.278e-06 49958 <2e-16 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
sigma[eps] = 2.716399
[d.tol = 0.0001221, M = 100, h = 1.285e-06]
Log likelihood: -120.9 ==> AIC = 245.844 [2 deg.freedom]
畫出殘差信息:
tsdisplay(residuals(fit))
4、Arima函數
函數介紹:這個函數可以擬合平穩或者非平穩的且已經知道參數的時間序列模型。也可以帶有季節因素。
n = 50
set.seed(0)
x = rnorm(n, 1,3) # 生成數據
library(ggplot2) # 載入畫圖包
x %>%
Arima(order=c(3,1,1)) %>%
forecast(h=5) %>%
autoplot
上述代碼用了管道函數,ggplot2
包。對模型從數據到預測到建模一部到位。給大家看看Arima
的參數。
function (y, order = c(0, 0, 0), seasonal = c(0, 0, 0), xreg = NULL,
include.mean = TRUE, include.drift = FALSE, include.constant,
lambda = model$lambda, biasadj = FALSE, method = c("CSS-ML",
"ML", "CSS"), model = NULL, x = y, ...)
5、arima.errors函數
該函數使用簡單,用於輸出模型預測每一期的誤差。注意和residuals
函數進行區分。
# 生成數據建模
n = 50
set.seed(0)
x = rnorm(n, 1,3)
fit <- arfima(x)
# 計算結果
> arima.errors(fit) # 預測誤差
Deprecated, use residuals.Arima(object, type='regression') instead
Time Series:
Start = 1
End = 50
Frequency = 1
[1] 4.78886285 0.02129992 4.98939779 4.81728796 2.24392430 -3.61985013
[7] -1.78570110 0.11583866 0.98269848 8.21396017 3.29078038 -1.39702775
[13] -2.44297103 0.13161528 0.10235465 -0.23453250 1.75667034 -1.67576338
[19] 2.30704990 -2.71261527 0.32719634 2.13218694 1.40000908 3.41256853
[25] 0.82867968 2.51082392 4.25730809 -1.07286152 -2.85379806 1.14017852
[31] 0.29288033 -0.62866477 -0.29993095 -0.94841494 3.18025224 4.45573526
[37] 3.97648110 -0.28853933 4.71491230 0.16196115 6.27370927 2.68223827
[43] -0.35835192 -1.49612989 -2.49971164 -2.19677174 -3.69134615 4.46961099
[49] 3.49614139 0.31801393
> residuals(fit) # 殘差
Time Series:
Start = 1
End = 50
Frequency = 1
[1] 3.71706994 -1.28784846 3.87358515 3.45503095 0.78349981 -4.98056775
[7] -2.74303846 -0.77184435 0.03669199 7.20508533 1.79698739 -2.80377609
[13] -3.54880551 -0.77827016 -0.86325716 -1.20139553 0.81773766 -2.72392791
[19] 1.43279254 -3.76501026 -0.47528735 1.24438107 0.37471968 2.37151650
[25] -0.35743144 1.41677218 3.08432283 -2.39421040 -3.91173996 0.30272726
[31] -0.68356344 -1.59285606 -1.19943417 -1.83611913 2.34677217 3.38917930
[37] 2.72730075 -1.60715574 3.61473632 -1.17228009 5.12889059 1.21871171
[43] -1.73495615 -2.66242875 -3.50034594 -3.04300026 -4.46595111 3.84607121
[49] 2.44020165 -0.85475604
6、arimaorder
函數功能:輸出函數的階數,用於時間序列的自動定階。下面用自動定階函數auto.arima
和管道函數結合輸出參數。給出示例。
n = 50
set.seed(100)
x = rnorm(n, 3, 5) + 1:50 # 生成數據
x %>% auto.arima %>% arimaorder
p d q
3 1 0
可以配合arima函數進行模型的參數的確定。
7、auto.arima
函數功能:可以使用函數進行自動定階。下面時該函數的參數。這裏會進行講解並給出具體的實例:
auto.arima(
y, # 數據
d = NA, # 原始數據差分的階數
D = NA, # 季節因素的差分階數
max.p = 5, # 遍歷達到的最大的AR模型的階數。
max.q = 5, # 遍歷達到的最大的MA模型的階數。
max.P = 2, # 季節因素遍歷達到的最大的AR模型的階數。
max.Q = 2, # 季節因素遍歷達到的最大的MA模型的階數。
max.order = 5,
max.d = 2,
max.D = 1,
start.p = 2, # 開始遍歷的AR模型的階數。
start.q = 2, # 開始遍歷的MA模型的階數。
start.P = 1,
start.Q = 1,
stationary = FALSE, #
seasonal = TRUE,
ic = c("aicc", "aic", "bic"), # 常用的選擇模型的標準
stepwise = TRUE,
nmodels = 94,
trace = FALSE,# 是否跟蹤模型的選擇
approximation = (length(x) > 150 | frequency(x) > 12),
method = NULL,
truncate = NULL,
xreg = NULL,
test = c("kpss", "adf", "pp"), # 平穩性檢驗的方式
test.args = list(),
seasonal.test = c("seas", "ocsb", "hegy", "ch"), # 季節性分析
seasonal.test.args = list(),
allowdrift = TRUE, # 可以去掉漂移項
allowmean = TRUE, # 可以去掉均值項
lambda = NULL,
biasadj = FALSE,
parallel = FALSE,
num.cores = 2,
x = y,
...
)
auto.arima
函數的參數衆多,我把上述函數的參數給了一定的備註。大家可以根據這個註釋和數據的其他的檢驗依據自己去逐一的驗證調試。最終得出一個比較滿意的模型。
下面給出部分調參的實例:
# 生成數據
n = 50
set.seed(100)
x = rnorm(n, 3, 5) + 1:50
下面畫時序圖,看看數據效果
# 畫時序圖
plot(ts(x))
# 參數調優
> auto.arima(x) # 直接建模
Series: x
ARIMA(1,1,0) with drift
Coefficients:
ar1 drift
-0.7383 0.9139
s.e. 0.0960 0.3643
sigma^2 estimated as 20.13: log likelihood=-142.45
AIC=290.9 AICc=291.43 BIC=296.58
> auto.arima(x, allowdrift = F) # 去掉模型漂移
Series: x
ARIMA(1,1,0)
Coefficients:
ar1
-0.7016
s.e. 0.1012
sigma^2 estimated as 22.23: log likelihood=-145.35
AIC=294.69 AICc=294.95 BIC=298.47
> auto.arima(x, d = 1) # 設置差分階數,爲了防止模型的過差分可以設置這個參數。
Series: x
ARIMA(1,1,0) with drift
Coefficients:
ar1 drift
-0.7383 0.9139
s.e. 0.0960 0.3643
sigma^2 estimated as 20.13: log likelihood=-142.45
AIC=290.9 AICc=291.43 BIC=296.58
> auto.arima(x, d = 1, allowdrift = F)
Series: x
ARIMA(1,1,0)
Coefficients:
ar1
-0.7016
s.e. 0.1012
sigma^2 estimated as 22.23: log likelihood=-145.35
AIC=294.69 AICc=294.95 BIC=298.47
下面展示追蹤模型的參數:
> auto.arima(x, d = 2, trace = T)
ARIMA(2,2,2) : Inf
ARIMA(0,2,0) : 377.2692
ARIMA(1,2,0) : 313.2075
ARIMA(0,2,1) : Inf
ARIMA(2,2,0) : 308.1753
ARIMA(3,2,0) : 304.7953
ARIMA(4,2,0) : 306.6614
ARIMA(3,2,1) : Inf
ARIMA(2,2,1) : Inf
ARIMA(4,2,1) : Inf
Best model: ARIMA(3,2,0)
Series: x
ARIMA(3,2,0)
Coefficients:
ar1 ar2 ar3
-1.3557 -0.8481 -0.3615
s.e. 0.1449 0.2217 0.1445
sigma^2 estimated as 28.41: log likelihood=-147.93
AIC=303.87 AICc=304.8 BIC=311.35
更改準則AICc
成AIC
繼續追蹤模型的參數:
> auto.arima(x, d = 2, ic = "aic", trace = T)
ARIMA(2,2,2) : Inf
ARIMA(0,2,0) : 377.1822
ARIMA(1,2,0) : 312.9408
ARIMA(0,2,1) : Inf
ARIMA(2,2,0) : 307.6298
ARIMA(3,2,0) : 303.865
ARIMA(4,2,0) : 305.2329
ARIMA(3,2,1) : Inf
ARIMA(2,2,1) : Inf
ARIMA(4,2,1) : Inf
Best model: ARIMA(3,2,0)
Series: x
ARIMA(3,2,0)
Coefficients:
ar1 ar2 ar3
-1.3557 -0.8481 -0.3615
s.e. 0.1449 0.2217 0.1445
sigma^2 estimated as 28.41: log likelihood=-147.93
AIC=303.87 AICc=304.8 BIC=311.35
這個函數的參數就介紹到這裏,大家用到自己繼續探索。
8、ggplot2中的時間序列相關係數
這裏把函數內置的實例給出來。
# 載入畫圖的ggplot2包
library(ggplot2)
下面的例子使用winnein
d數據。是個時間序列數據。
ggAcf(wineind)
wineind %>% taperedacf(plot=FALSE) %>% autoplot
ggCcf(mdeaths, fdeaths)
9、tslm
函數功能:用時間序列分量擬合線性模型
爲了我方便第一次見到的同學學習,先貼出模型的參數:
> tslm
function (formula, data, subset, lambda = NULL, biasadj = FALSE,
...)
formula
參數是公式、data
是數據。下面使用函數例子展示函數功能。
> y <- ts(rnorm(120,0,3) + 20*sin(2*pi*(1:120)/12), frequency=12) # 構造數據
> fit1 <- tslm(y ~ trend + season) # 趨勢+季節
> fit1
Call:
tslm(formula = y ~ trend + season)
Coefficients:
(Intercept) trend season2 season3 season4
10.20906 0.01175 7.31274 8.82928 7.04245
season5 season6 season7 season8 season9
-2.04022 -10.24111 -20.57768 -27.61414 -30.16768
season10 season11 season12
-27.56840 -21.53062 -10.35272
plot(forecast(fit1, h=20)) # 畫出模型1的預測圖
> fit2 <- tslm(y ~ season)
> fit2
Call:
tslm(formula = y ~ season)
Coefficients:
(Intercept) season2 season3 season4 season5
10.856 7.324 8.853 7.078 -1.993
season6 season7 season8 season9 season10
-10.182 -20.507 -27.532 -30.074 -27.463
season11 season12
-21.413 -10.223
plot(forecast(fit2, h=20)) # 畫出模型2的預測圖
10、CV交叉驗證
CV
函數顯示模型的CV AIC AICc BIC AdjR2
值,用上述模型直接給出例子。
> CV(fit1)
CV AIC AICc BIC AdjR2
12.851627 306.718526 310.718526 345.743411 0.945285
> CV(fit2)
CV AIC AICc BIC AdjR2
12.7985986 306.6337582 310.0677205 342.8711509 0.9449195
11、forecast
這個函數可以給出模型的預測值用於畫圖和分析。
下面給出上述模型一的預測值。
> forecast(fit1, h=20) # 往後預測20期
Point Forecast Lo 80 Hi 80 Lo 95 Hi 95
Jan 11 11.631361 6.993384 16.269339 4.501348 18.761374
Feb 11 18.955852 14.317875 23.593829 11.825839 26.085865
Mar 11 20.484149 15.846172 25.122127 13.354136 27.614162
Apr 11 18.709071 14.071094 23.347048 11.579058 25.839084
May 11 9.638164 5.000187 14.276141 2.508151 16.768177
Jun 11 1.449025 -3.188953 6.087002 -5.680989 8.579038
Jul 11 -8.875796 -13.513773 -4.237818 -16.005809 -1.745783
Aug 11 -15.900500 -20.538478 -11.262523 -23.030513 -8.770487
Sep 11 -18.442285 -23.080262 -13.804307 -25.572298 -11.312272
Oct 11 -15.831247 -20.469224 -11.193269 -22.961260 -8.701233
Nov 11 -9.781716 -14.419693 -5.143739 -16.911729 -2.651703
Dec 11 1.407943 -3.230034 6.045921 -5.722070 8.537957
Jan 12 11.772416 7.109642 16.435190 4.604282 18.940549
Feb 12 19.096906 14.434132 23.759680 11.928773 26.265039
Mar 12 20.625203 15.962429 25.287977 13.457070 27.793337
Apr 12 18.850125 14.187351 23.512899 11.681992 26.018259
May 12 9.779218 5.116444 14.441992 2.611085 16.947351
Jun 12 1.590079 -3.072695 6.252853 -5.578054 8.758212
Jul 12 -8.734741 -13.397516 -4.071967 -15.902875 -1.566608
Aug 12 -15.759446 -20.422220 -11.096672 -22.927579 -8.591313
結果說明:第一列是時間、第二列是預測值、後面4列是預測值的80%、95%的置信下限和置信下限。
12、geom_forecast
這個圖是ggplot2
的預測圖,下面貼出代碼給出效果。這個函數也需要結合ggplot2
包進行。
library(ggplot2)
autoplot(USAccDeaths) + geom_forecast() # 圖一
lungDeaths <- cbind(mdeaths, fdeaths)
autoplot(lungDeaths) + geom_forecast() # 圖二
13、總結
forecast包裏的函數衆多,上面只是介紹很少的一部分,更多函數的使用方式留着給大家探索。