数学建模社区-数学中国

标题: 毕业实用模型(三)——时间序列forecast包的使用 ——————————————... [打印本页]

作者: zhangtt123    时间: 2020-5-20 11:02
标题: 毕业实用模型(三)——时间序列forecast包的使用 ——————————————...
00引言% j8 S9 a! a) E1 s2 g3 a
在毕业实用统计模型(一)——时间序列1中介绍了时间序列的模型的基本建模思路,在毕业设计实用模型(二)——时间序列之SARIMA2中说明了ARMA、ARIMA、SARIMA三大模型的关系与参数调整。但是在实际建模中往往会遇到更加实际的需求:模型的评估、参数检验、预测图的展示、模型参数的调整。对于很对不喜欢编程的人来说很是痛苦。本文将会重点从上述几个方面讲述forecast包里的主要的函数,并给出实例。从本文中你将会学会:$ @. X$ E+ C; Z$ J" L

- @$ A+ o: @/ G5 }% R. v& f更加高效的的模型预测图。  ~4 N8 ?5 u3 c- }
模型的参数检验
. i3 U/ {- A. `2 v4 q1 `模型定阶的函数  O) N2 R2 t7 Q* ?% u+ H2 L
模型的评估函数
) z4 c. {: j! I4 `" M) ]& t# X拟合线性的模型函数
  ]9 d; T, C% F; M$ d+ A相关图绘画,以及误差的标注1 B$ j: A- G8 z4 V* [
输出模型的预测误差
* i: ]- }' f4 _! h8 Z6 s注:本文部分代码案例来自forecast包,大家有疑问可以自行去查找3.如果进不去可以运行下面代码会找到。$ e. E2 m6 ?; k( J" ~9 g( j
library(forecast)" |0 u3 Y9 ?& L/ n# |
help(package = forecast)' m& o- R9 V% f' O) W& m
# U4 N" N( u9 s: a- P
1、accuracy函数
5 X' o, @, \6 b! R  t" c( j描述:输入参数是模型,输出下面的结果:+ [  H& M' d0 C! ^2 @) K
% v+ @) b# q/ H
1.png
; |5 F# z$ W+ x, D+ H: f: h1 V; K! T+ {* ~; _5 D$ f
函数示例:6 p$ i: y+ _; g/ k5 O( R
$ W- \" X' c, c
2.png
+ R( W/ _+ }4 [4 t
: d  B0 U0 h) H7 \( j! J最后的图片:
7 [& X6 _2 n/ q' r0 L7 {; {
  v8 |; D6 \5 b7 C2 V' d; T1 a$ W! }2 p
2、Acf、Pacf、taperedacf、taperedpacf/ v5 Y1 {  z& L+ k3 H
这四个函数分别是自相关函数、偏自相关函数、带有误差的自相关函数、带有误差的偏自相关函数。前两个很熟悉和内置的acf、pacf一样,下面只给出后两个的示例:
+ A. f9 e: ^  e0 j8 Y; D+ Q. d) ` 3.png % p; e9 E- V; A" T& d
& \2 P5 Q: Y- i( F; O
; d/ e+ R. d6 E: T
3、arfima3 L* x/ k% A' f+ w( h" l
可以建立长期记忆的时间序列模型。- _$ o% ^* g, U/ B3 Q: b
直接给例子了哦:
3 h* M. J' \* s4 _
8 Q/ T3 x+ S- O  c2 ?2 c9 }% n 4.png ; v9 X9 u5 \% p) H( y* ~7 Y
输出模型效果:8 T* `% Q9 K. _5 \  [
5.png & T$ }3 |. K. S: e& f- G

; m0 S! h1 \5 e5 ]- p* c$ \$ G( {: R画出残差信息:
3 T* _: O4 ?/ q6 Y* ]( Vtsdisplay(residuals(fit))4 F! [' ~% K- |  x& P% W4 C  g1 U
# `3 r4 x8 {( q# j* b/ `
; o# n& N: ?/ q$ `. j* p+ w
4、Arima函数/ c6 ^( p" `& [& [9 j5 Y
函数介绍:这个函数可以拟合平稳或者非平稳的且已经知道参数的时间序列模型。也可以带有季节因素。
/ C5 ^0 d- {! [
0 r* Z: `. e( y  \n = 50set.seed(0)x = rnorm(n, 1,3)  # 生成数据library(ggplot2)  # 载入画图包x %>%  Arima(order=c(3,1,1)) %>%  forecast(h=5) %>%  autoplot上述代码用了管道函数,ggplot2包。对模型从数据到预测到建模一部到位。给大家看看Arima的参数。* r6 u" F+ D' @

& n% X' a  B; Y8 a; x: c7 hfunction (y, order = c(0, 0, 0), seasonal = c(0, 0, 0), xreg = NULL,
$ E6 B* `/ E3 q    include.mean = TRUE, include.drift = FALSE, include.constant,
; D4 d' c  T, o2 W" g# f+ s' \/ z    lambda = model$lambda, biasadj = FALSE, method = c("CSS-ML",
1 P" d$ G- ?4 v) i& z        "ML", "CSS"), model = NULL, x = y, ...) + t/ t1 k9 @' e% N/ W7 d" j

$ e7 j% C( H5 w2 k. [' C( b5 z5、arima.errors函数& |1 e/ q" d. \( ^, f# d5 A0 Y
该函数使用简单,用于输出模型预测每一期的误差。注意和residuals函数进行区分。( |2 S7 |6 u: x/ @3 x9 }! N- K
# 生成数据建模n = 50set.seed(0)x = rnorm(n, 1,3)fit <- arfima(x)
! S' }1 D1 c; ]/ B# 计算结果5 M+ i& t- C! A- W: |% W
> arima.errors(fit)  #  预测误差
: |; O7 d" r, h! t: [$ l8 a% ^4 aDeprecated, use residuals.Arima(object, type='regression') instead
: b: @3 S$ r, Z- C+ _/ OTime Series:; a5 V% U! a3 u1 t8 J$ R
Start = 1 ) U- w) [; J) c6 V! l8 o
End = 50
9 ?# Q( F, j+ c& P( MFrequency = 1 1 }* e3 J/ G) N+ z& M# [) t
[1]  4.78886285  0.02129992  4.98939779  4.81728796  2.24392430 -3.61985013
, n6 t* [8 @( g [7] -1.78570110  0.11583866  0.98269848  8.21396017  3.29078038 -1.39702775
7 z$ F  A( x3 ]- {5 R$ }[13] -2.44297103  0.13161528  0.10235465 -0.23453250  1.75667034 -1.675763381 K. z* T6 x. ^" k
[19]  2.30704990 -2.71261527  0.32719634  2.13218694  1.40000908  3.41256853
4 _2 F# o2 W  \4 l[25]  0.82867968  2.51082392  4.25730809 -1.07286152 -2.85379806  1.14017852
) H6 y  d' H" C" d# ~3 T[31]  0.29288033 -0.62866477 -0.29993095 -0.94841494  3.18025224  4.455735262 A5 f% Z: s; S' j, l' h
[37]  3.97648110 -0.28853933  4.71491230  0.16196115  6.27370927  2.68223827
8 v- @( p  v4 Z* J. e% ][43] -0.35835192 -1.49612989 -2.49971164 -2.19677174 -3.69134615  4.46961099
3 ?4 k5 h8 i/ v- D9 ~[49]  3.49614139  0.31801393
: h5 U, o. }( s& a! K> residuals(fit)  # 残差% D) j4 u5 o% u0 E' e' f' H# {
Time Series:; ^! Y4 K# m4 U# R. Y: ?( S
Start = 1 / c" ]; |9 X7 C' ^$ [8 W0 r4 ^/ L
End = 50
# ^2 ~7 e! g& {. Q4 BFrequency = 1 & @: g# \9 W! G& ~/ c
[1]  3.71706994 -1.28784846  3.87358515  3.45503095  0.78349981 -4.98056775$ l% P) R0 n  W7 s/ @( v8 `
[7] -2.74303846 -0.77184435  0.03669199  7.20508533  1.79698739 -2.80377609
( W: n  G' f9 E3 @: }[13] -3.54880551 -0.77827016 -0.86325716 -1.20139553  0.81773766 -2.723927918 b) ^* s7 Z" |; D$ L2 f0 p
[19]  1.43279254 -3.76501026 -0.47528735  1.24438107  0.37471968  2.371516503 `  c9 F8 n) z5 A1 `3 I; H- O# J  {
[25] -0.35743144  1.41677218  3.08432283 -2.39421040 -3.91173996  0.30272726! s; y* S# C$ p' f; @6 C
[31] -0.68356344 -1.59285606 -1.19943417 -1.83611913  2.34677217  3.389179306 T* I0 R# g; |
[37]  2.72730075 -1.60715574  3.61473632 -1.17228009  5.12889059  1.218711714 {6 ]3 n9 o& a, t
[43] -1.73495615 -2.66242875 -3.50034594 -3.04300026 -4.46595111  3.84607121
0 W" a+ k0 n8 Z" |[49]  2.44020165 -0.85475604
/ ~* l  _" b) z" V; q$ K
) ]+ [/ y4 o+ B1 j' {$ f# A6、arimaorder0 Y0 V; i( d& y5 {  E) C
函数功能:输出函数的阶数,用于时间序列的自动定阶。下面用自动定阶函数auto.arima和管道函数结合输出参数。给出示例。- d0 H1 [- ~3 u8 }

4 S2 `: P0 C" G) \n = 50set.seed(100)x = rnorm(n, 3, 5) + 1:50  # 生成数据x %>% auto.arima %>% arimaorderp d q 3 1 0
2 G/ {& A9 Y# f/ @4 s7 n3 X可以配合arima函数进行模型的参数的确定。
0 k0 k1 w" O5 o$ ?# M* W. O2 E7 G3 P. h) T' Q" i
7、auto.arima
. o+ A" h0 k- {6 `* k5 r函数功能:可以使用函数进行自动定阶。下面时该函数的参数。这里会进行讲解并给出具体的实例:  k7 `5 ^; y" y5 `% t! B. |& y* G/ {
auto.arima(
+ S5 W* k0 b. P) O  y, # 数据
2 Y: [" b1 K5 N9 Y; n& h0 N  d = NA,  # 原始数据差分的阶数
; H. G2 z) Z/ |$ y! P- s  D = NA, # 季节因素的差分阶数9 [& `. p1 M; D( j& q
  max.p = 5,  # 遍历达到的最大的AR模型的阶数。8 c7 ?7 g' @3 q1 _. `+ o
  max.q = 5,  # 遍历达到的最大的MA模型的阶数。' g! T' C6 I4 d: B9 G
  max.P = 2,  # 季节因素遍历达到的最大的AR模型的阶数。' q7 K( N: e: v" f1 r7 P# }
  max.Q = 2,  # 季节因素遍历达到的最大的MA模型的阶数。. ?. Z+ y' X% j' X8 A7 D
  max.order = 5,0 d/ s; r$ K/ _6 N
  max.d = 2,
  F! p  v% V6 S0 N) x  max.D = 1,3 P6 c8 {% j3 ~$ U9 q1 W
  start.p = 2,  # 开始遍历的AR模型的阶数。; I  Y+ r, d- x8 a
  start.q = 2,  # 开始遍历的MA模型的阶数。; y  h% @; Z3 F5 H- V
  start.P = 1,  [) d) I& Z1 W; Q  a& h
  start.Q = 1,
; z' ~. ]3 R# ?) v* Z( B% R  stationary = FALSE,  # & a0 A- R- k; \  @
  seasonal = TRUE,
& A& {4 E0 q$ r  ic = c("aicc", "aic", "bic"),  # 常用的选择模型的标准
3 i3 T7 J# [" x  stepwise = TRUE,7 g, A% C/ f3 n$ g6 q8 g
  nmodels = 94,
/ b, Y. [$ Q6 w8 a1 G' D1 a  trace = FALSE,# 是否跟踪模型的选择  B, ^2 x. c% u  K
  approximation = (length(x) > 150 | frequency(x) > 12),4 {/ D: x+ z. P3 p3 q
  method = NULL,
. B3 V4 x( i+ q; R  truncate = NULL,
9 p3 U0 x& v7 L6 g  xreg = NULL,( @* q9 P7 m! D# i" |5 {+ R
  test = c("kpss", "adf", "pp"),  # 平稳性检验的方式
) m- e  Z/ F& V% p3 u  test.args = list(),, H; e: c; \+ R% |. G, X5 e
  seasonal.test = c("seas", "ocsb", "hegy", "ch"),  # 季节性分析" d6 h/ K: R; ]8 r0 L) f
  seasonal.test.args = list(),
" H+ Z7 V/ Z* }; q8 y0 ?  allowdrift = TRUE,  # 可以去掉漂移项
8 N, h5 G8 p: a' }- k1 s  allowmean = TRUE,  # 可以去掉均值项! g7 S+ Q2 I& m
  lambda = NULL,
9 d1 }" V: i0 q2 c8 l  biasadj = FALSE,
! j0 X# ^) ^. a7 i$ c  parallel = FALSE,
. [! {9 \- M1 s0 z' U5 n* s, r  num.cores = 2,
3 U$ E7 L( l/ n: o6 ]- F4 r  x = y,
9 v6 Q4 O5 |' c: F+ k/ ]. M/ Q  ...
/ D$ P( y( ?% v9 c), b' T! E, }5 j2 m

/ b/ P$ i) s1 n/ ?5 B7 T% ~auto.arima函数的参数众多,我把上述函数的参数给了一定的备注。大家可以根据这个注释和数据的其他的检验依据自己去逐一的验证调试。最终得出一个比较满意的模型。2 r, i) w) ^3 W( @
下面给出部分调参的实例:
$ K4 h: `. n" i; v* ?/ a* Y# 画时序图plot(ts(x))
0 D- d2 N1 L: }5 q* Y: U3 M# p
' {# j) Z- ^8 a* V4 z2 I+ V8 _6 v  l" a) ~$ m
下面展示追踪模型的参数:
( b# @0 c( b. Q" B 7.png
$ a1 _2 v9 n& G) ?) j4 [
! P; P% W/ [. a$ N更改准则AICc成AIC继续追踪模型的参数:4 D6 c" W9 i8 o6 e2 \
8.png $ s, [# X& \' H. ?; b

) m( j3 A! L* f) ]$ l! f* i. z这个函数的参数就介绍到这里,大家用到自己继续探索。( Y1 @, a+ _$ {6 x- c, X; e
3 Q% |' W% ~( C; ?# |2 o
8、ggplot2中的时间序列相关系数
! z1 [; z: l: h/ G这里把函数内置的实例给出来。
7 d9 c( b1 W, A# \% n5 S
: v' P+ o+ Y1 |& Q% d" l2 o# 载入画图的ggplot2包
/ N- b) N2 G! f" g3 {4 x2 M) Xlibrary(ggplot2)
! U- [/ P9 `3 I$ V6 z3 u: H. P7 E7 _7 M; Z9 L
下面的例子使用winneind数据。是个时间序列数据。+ b) D0 J* Q0 n( k
  r$ B6 P) y, [$ m
1 ggAcf(wineind)! y& b% {# B$ I$ @$ `

# ~, j8 ~8 q( Z$ x- M  A4 ~+ V4 o! h% g0 p; k
& ~+ Q( c* O6 x# e
1 wineind %>% taperedacf(plot=FALSE) %>% autoplot& U; ~& Q' s4 F. O" T8 D) M1 S5 X
7 z* l* `6 ]; Q9 t+ ~* ~) I4 \! h
2 w4 C$ y. s" n+ H
5 C& E  g. L  t( E, m, ?. D3 P3 w! Q
1 ggCcf(mdeaths, fdeaths)
; X1 I0 e& c; @4 m) x+ S3 B5 X( w8 ?! W7 m9 ]$ n, x6 M  t

! u' U$ l: H) l( v2 ?
: l# T5 D1 _2 K& }" `9、tslm" |+ O1 C( v- F; Z
函数功能:用时间序列分量拟合线性模型8 g* L8 x9 ]" j+ O) b8 y' O; ^
为了我方便第一次见到的同学学习,先贴出模型的参数:
9 t( W4 k' j& r# p' N. l$ j
. L7 `6 t' z  _5 F$ [9 s) c1 > tslm
( u: ^. I% y: E/ H2 ?. ~# b2 function (formula, data, subset, lambda = NULL, biasadj = FALSE,
* _! E. `/ R+ u6 @3    ...) % z5 G6 n% Y* g: X7 w
( e6 i' d/ K8 x1 B  Z
formula参数是公式、data是数据。下面使用函数例子展示函数功能。
7 ~! Z' g: k8 ^, P+ Y, r' `" ?) D* @9 z5 h
1  > y <- ts(rnorm(120,0,3) + 20*sin(2*pi*(1:120)/12), frequency=12) # 构造数据, N4 v& A- J& B3 I3 j$ Z, `& r" O
2  > fit1 <- tslm(y ~ trend + season)  # 趋势+季节
& W' |& p4 _# i3 G4 G, `3  > fit1" A- \8 m% W5 D+ R8 h: `# D0 [7 C0 U
4  Call:
# Y& f+ F- B2 U' u8 o  |5  tslm(formula = y ~ trend + season)) s7 R; K' z  b" u6 |/ i3 u8 q2 o
6  Coefficients:' R2 L- W& P2 z7 \* L
7  (Intercept)        trend      season2      season3      season4  
. `' z) ^- a  }+ [8     10.20906      0.01175      7.31274      8.82928      7.04245  
  K+ u! ~% _% u: a! _  d  i2 I" l9      season5      season6      season7      season8      season9  ; b6 _: y+ ?. G7 x% X
10   -2.04022    -10.24111    -20.57768    -27.61414    -30.16768  
3 p3 P, n* ^5 z6 C11   season10     season11     season12  
4 ^8 l/ T, P! y. O; z12  -27.56840    -21.53062    -10.35272  3 H6 u; S: _' O( n% O# b

2 e( ~, |/ D8 Z. U1 plot(forecast(fit1, h=20))  # 画出模型1的预测图8 ?5 V$ o. w- J9 D$ y
  J- V- y9 O3 o1 k0 E5 t
. z  a) e. x* x+ p* P8 [
1  > fit2 <- tslm(y ~ season)9 H; p0 K0 n3 V
2  > fit2
! m; i" w$ \! l4 `; O3  Call:
( x: o% A7 p& ]% f4  tslm(formula = y ~ season)
9 o( _2 u) ^! b5  Coefficients:/ a5 Q: q% T& L. o
6  (Intercept)      season2      season3      season4      season5  
8 L5 \7 F6 `. T. u4 }7     10.856        7.324        8.853        7.078       -1.993  ; U. F' W( X! @+ ?. v. y: ~4 Y5 H
8    season6      season7      season8      season9     season10  
1 h( ~' V! q, r1 C: a9    -10.182      -20.507      -27.532      -30.074      -27.463  ) S0 ^8 Q- `8 S  F" L
10   season11     season12  + I1 ~$ s) H. d" B
11    -21.413      -10.223
+ t9 a  S0 {, S: a. K
8 C/ ^7 Q3 x2 G8 q3 J- D1  plot(forecast(fit2, h=20))  # 画出模型2的预测图
: h; Q. Q6 o9 }. x) S; y- o9 ?4 ^9 t
: a1 T1 c3 d4 \9 J3 d6 G- q4 S# x( m5 ~* T) W+ j
10、CV交叉验证
4 A  K$ N+ D, y) h# lCV函数显示模型的CV AIC AICc BIC AdjR2值,用上述模型直接给出例子。
7 Z1 q6 b6 L4 H0 ]2 _" R. M5 k' u0 Y" J4 {! k, R
1  > CV(fit1)7 S1 s/ D: W( Q* m
2          CV        AIC       AICc        BIC      AdjR2 : y6 s. p* S; l3 M+ D- {3 C
3   12.851627 306.718526 310.718526 345.743411   0.945285
! t8 p7 w/ {" k# g4  > CV(fit2)
6 H6 O6 g$ o  P" C0 g5           CV         AIC        AICc         BIC       AdjR2
% a! K2 A& k& f. V  I6   12.7985986 306.6337582 310.0677205 342.8711509   0.9449195 0 y+ n8 i' U6 _

6 C* k9 S! N2 `6 C- n' C11、forecast
; o  Q* D4 t5 M+ D6 U这个函数可以给出模型的预测值用于画图和分析。: U! m3 |3 ^2 x. |. x# r: Y! ]5 i7 \
下面给出上述模型一的预测值。5 r  }2 v& G2 v- R$ {* r) q

4 f+ s: o1 _8 m1 q! X& C" } 8.png
$ C) p+ C- x# \$ V! C5 o, f结果说明:第一列是时间、第二列是预测值、后面4列是预测值的80%、95%的置信下限和置信下限。
5 X' E- f  F6 u  Y0 M( s3 h7 e
12、geom_forecast
* Y6 e& V1 ^; @2 N这个图是ggplot2的预测图,下面贴出代码给出效果。这个函数也需要结合ggplot2包进行。
( A" L  y9 ]- A4 h: T8 W2 ^& P* Q9 f" w+ m: [8 i) N
1  library(ggplot2)) ~, D5 j0 _) W/ X$ g5 X0 P
2  autoplot(USAccDeaths) + geom_forecast()  # 图一
6 L$ }5 a" A2 H0 \& @( `$ [* o3  lungDeaths <- cbind(mdeaths, fdeaths); M* H( F& T% z* e5 v! w# ~
4  autoplot(lungDeaths) + geom_forecast()  # 图二
& L- Q& v1 S7 s& S5 i$ _: t; ?. E& p' M7 I

1 w, R+ b4 }( E% F' u( u6 E
4 _' m* ~& I% S. Q+ a13、总结0 r& ^2 N5 [$ J; C: ]: m5 v  v
forecast包里的函数众多,上面只是介绍很少的一部分,更多函数的使用方式留着给大家探索。" w% B+ w7 h7 u9 T7 @% Y

( G& v9 m3 a/ h* v- }5 p14、参考文献
4 q. M$ o% C9 Ohttps://blog.csdn.net/weixin_46111814/article/details/105348265 ↩︎
; v0 I, h6 {  w- }3 T4 y/ f$ w
" x7 \1 Z5 {* Z% J" z- V4 |3 Bhttps://blog.csdn.net/weixin_46111814/article/details/105370507 ↩︎: K$ D; t% d, p, v7 c

! f/ z* n7 h; @9 E' h: Q6 k- `http://127.0.0.1:17627/library/forecast/html/00Index.html ↩︎
, |  x8 L* ^- @# i, \) y! V————————————————* N0 P7 z+ B9 w2 t) D* |: Y
版权声明:本文为CSDN博主「逆天者顺A」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
& n% `9 ^2 H1 d; S, [原文链接:https://blog.csdn.net/weixin_46111814/article/details/105583080
  e' O: @7 T* m1 T" L/ M' }* G' x3 y6 t
7 n0 y3 B. f& Q, \: f. F
# n4 w: V7 P9 Y0 H* ~+ q& f
作者: 星辰的微光    时间: 2020-5-20 15:43
点个赞,感谢分享8 k1 f1 C* ^3 v% Y0 ?! @  f  y' g





欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) Powered by Discuz! X2.5