畢業實用模型(三)——時間序列forecast包的使用

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

更改準則AICcAIC繼續追蹤模型的參數:

> 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)

下面的例子使用winneind數據。是個時間序列數據。

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包裏的函數衆多,上面只是介紹很少的一部分,更多函數的使用方式留着給大家探索。

14、參考文獻


  1. https://blog.csdn.net/weixin_46111814/article/details/105348265 ↩︎

  2. https://blog.csdn.net/weixin_46111814/article/details/105370507 ↩︎

  3. http://127.0.0.1:17627/library/forecast/html/00Index.html ↩︎

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章