QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 4305|回复: 1
打印 上一主题 下一主题

[个人总经验] 毕业实用模型(三)——时间序列forecast包的使用 ——————————————...

[复制链接]
字体大小: 正常 放大

326

主题

32

听众

1万

积分

  • TA的每日心情
    慵懒
    2020-7-12 09:52
  • 签到天数: 116 天

    [LV.6]常住居民II

    管理员

    群组2018教师培训(呼和浩

    群组2017-05-04 量化投资实

    群组2017“草原杯”夏令营

    群组2018美赛冲刺培训

    群组2017 田老师国赛冲刺课

    跳转到指定楼层
    1#
    发表于 2020-5-20 11:02 |只看该作者 |倒序浏览
    |招呼Ta 关注Ta
    00引言
    5 A: d5 F  O! n0 c$ M" Z& V在毕业实用统计模型(一)——时间序列1中介绍了时间序列的模型的基本建模思路,在毕业设计实用模型(二)——时间序列之SARIMA2中说明了ARMA、ARIMA、SARIMA三大模型的关系与参数调整。但是在实际建模中往往会遇到更加实际的需求:模型的评估、参数检验、预测图的展示、模型参数的调整。对于很对不喜欢编程的人来说很是痛苦。本文将会重点从上述几个方面讲述forecast包里的主要的函数,并给出实例。从本文中你将会学会:, K5 O) [, s9 D3 _9 z# J

    $ n0 u6 w% _0 }' @更加高效的的模型预测图。
    & f  W* z1 I  q& F, r模型的参数检验2 P" I9 R, h( M
    模型定阶的函数
    6 l* E9 K8 U/ m# b# Z" T4 Q模型的评估函数
    : G. g7 H; K  Y/ q9 N拟合线性的模型函数) t% Q5 C. r* y' N. m$ I& ]
    相关图绘画,以及误差的标注$ F: N5 j) C, i1 F5 |
    输出模型的预测误差+ x, B. x5 ?/ ]- N
    注:本文部分代码案例来自forecast包,大家有疑问可以自行去查找3.如果进不去可以运行下面代码会找到。
    9 w8 g& @4 T6 A3 W- ?library(forecast)
    7 p0 P# `+ j$ Z5 w7 P% H% zhelp(package = forecast)- g# [; e9 |* T* T& F- D

    + F% {8 n3 O8 o& b$ c1、accuracy函数- g, X+ q. K4 F2 a. w- ^
    描述:输入参数是模型,输出下面的结果:
    0 U( [2 I( D# f5 M$ w' [0 ^  W8 O
    1.png 8 ~* u9 v% l6 J% T
    8 [1 D) i* v4 @: m! p. i. ~# D
    函数示例:
    , s- \( r2 a8 q3 l1 ?( |  r% v4 e! ~! W
    2.png
    2 I% h3 j0 j5 ?5 t& Y$ x# A% G( S  O9 M0 v2 b; G! O- {
    最后的图片:5 I' Z: J3 f2 o& x: h8 z

    1 M: H( Q/ ~8 S" _) b/ n  j  Q  D
    4 O( H5 |# u$ i9 Y: |2、Acf、Pacf、taperedacf、taperedpacf
    * |) B$ v! e1 i4 A# y- l这四个函数分别是自相关函数、偏自相关函数、带有误差的自相关函数、带有误差的偏自相关函数。前两个很熟悉和内置的acf、pacf一样,下面只给出后两个的示例:
    6 J' e$ w. Z; `" { 3.png
    ( j( i9 S1 _) J1 z. T
    . e9 I$ s" r$ E3 A3 E' q
    . u& v% ^" {! F* {1 H3、arfima
    : F* v' L6 ~" A  {' c$ U! Y% ]4 Z可以建立长期记忆的时间序列模型。
    # }  }* d$ d6 ]1 ]. a直接给例子了哦:$ T% ?) T% x+ m! |3 u
    6 V8 }! b2 S6 ?5 Z$ Q( k
    4.png / _. i: F( z8 s& O6 E
    输出模型效果:
    . F( p6 f; b! h( x( S) N1 r+ e  h  r 5.png
    & ^% S( N" f3 ?9 q9 e: @! n6 Q
    / U7 L; Y7 w5 R" `! M& w8 t2 X0 j0 S画出残差信息:
    6 T4 o( k" U& C4 Y, h: E' l; Itsdisplay(residuals(fit))
    7 w; a# o9 K7 u, T! k' d, Y3 G8 Q; k, g, @# n$ F
    5 u4 o% E; k6 |. [
    4、Arima函数* m" l" F( W  v: B# c) `
    函数介绍:这个函数可以拟合平稳或者非平稳的且已经知道参数的时间序列模型。也可以带有季节因素。
    ' [+ B9 S  D; H: m7 B7 \5 C  w% U
    ; Z" P; E/ F7 Y; Q8 L8 _n = 50set.seed(0)x = rnorm(n, 1,3)  # 生成数据library(ggplot2)  # 载入画图包x %>%  Arima(order=c(3,1,1)) %>%  forecast(h=5) %>%  autoplot
      % ~( _) |. X$ P4 A( C2 Q( M

      ( k) n. I& M9 q" e
    上述代码用了管道函数,ggplot2包。对模型从数据到预测到建模一部到位。给大家看看Arima的参数。
    ' f1 q; Y# P+ o, T
    * v0 G; a* E& N: M7 K# Y( ^function (y, order = c(0, 0, 0), seasonal = c(0, 0, 0), xreg = NULL, 5 [) y8 O; |: W! r0 {6 x: x0 c
        include.mean = TRUE, include.drift = FALSE, include.constant, * y: g% k% p# U( P
        lambda = model$lambda, biasadj = FALSE, method = c("CSS-ML",
    ! a: d  _) y0 w- p% @, I        "ML", "CSS"), model = NULL, x = y, ...) ) U: H7 ^9 s6 l& e6 X9 c2 X
    4 i7 Z& D# C  P5 j4 J7 v
    5、arima.errors函数
    % p  o- J: D  }* C9 N1 M9 }2 O/ p8 b该函数使用简单,用于输出模型预测每一期的误差。注意和residuals函数进行区分。
    . O* _7 U/ E' z0 Q& k! f# 生成数据建模n = 50set.seed(0)x = rnorm(n, 1,3)fit <- arfima(x)
    6 E) r  N2 X; R( @# 计算结果
    & m' e! }& S$ _9 ]% d) e8 z> arima.errors(fit)  #  预测误差
    # c1 y# ]  q& K( u% _6 I% \3 ?8 s+ F8 n" FDeprecated, use residuals.Arima(object, type='regression') instead
    . V5 d; e4 K, V% ?$ cTime Series:
    / B, A9 I; ?% W" n) z) lStart = 1
    ! I4 m) {6 X3 b+ `5 s4 Y9 yEnd = 50
      M4 }( y* m$ L% H$ C" Q2 ^2 q) {Frequency = 1 & C" Q5 ^% `# X3 Q
    [1]  4.78886285  0.02129992  4.98939779  4.81728796  2.24392430 -3.619850131 {( V6 f1 ^4 s1 B" e% i5 s
    [7] -1.78570110  0.11583866  0.98269848  8.21396017  3.29078038 -1.39702775
    ' u2 {+ F( P5 j- a[13] -2.44297103  0.13161528  0.10235465 -0.23453250  1.75667034 -1.67576338! m" X2 \, k6 P: z. L
    [19]  2.30704990 -2.71261527  0.32719634  2.13218694  1.40000908  3.41256853; b$ l# n7 \" y5 z
    [25]  0.82867968  2.51082392  4.25730809 -1.07286152 -2.85379806  1.140178520 V& m4 E3 u4 q2 @0 L
    [31]  0.29288033 -0.62866477 -0.29993095 -0.94841494  3.18025224  4.45573526/ H0 W1 A# K' L5 }$ @. E3 [
    [37]  3.97648110 -0.28853933  4.71491230  0.16196115  6.27370927  2.68223827
    # a$ b: P3 f7 n; t% y* S, z[43] -0.35835192 -1.49612989 -2.49971164 -2.19677174 -3.69134615  4.46961099
    " M2 ^, F4 [/ [& \[49]  3.49614139  0.31801393
    ! \4 j: E  Y3 s3 c) {3 ]$ e% f> residuals(fit)  # 残差
    8 t6 m* }- ?0 ^5 H8 tTime Series:( ~; @4 y2 `- p# E- K5 o
    Start = 1
    6 N) }) T( `7 k+ B" {End = 50
    " J1 P) K  h3 Z( fFrequency = 1 ! \( |2 k. J& p5 T
    [1]  3.71706994 -1.28784846  3.87358515  3.45503095  0.78349981 -4.98056775% W5 Q: Y9 M4 ?1 \* z
    [7] -2.74303846 -0.77184435  0.03669199  7.20508533  1.79698739 -2.80377609
    ! `+ D, q2 h* G& g7 R6 {[13] -3.54880551 -0.77827016 -0.86325716 -1.20139553  0.81773766 -2.72392791
    # ]& ^7 f9 p# G, q[19]  1.43279254 -3.76501026 -0.47528735  1.24438107  0.37471968  2.37151650) i+ M! e% W% [# K
    [25] -0.35743144  1.41677218  3.08432283 -2.39421040 -3.91173996  0.30272726! ~" [' O7 y6 L  R. P4 K) Z. Y
    [31] -0.68356344 -1.59285606 -1.19943417 -1.83611913  2.34677217  3.38917930) ^. M& Y9 T/ h8 s2 V
    [37]  2.72730075 -1.60715574  3.61473632 -1.17228009  5.12889059  1.21871171  r  D$ E1 T5 o# }$ E, b
    [43] -1.73495615 -2.66242875 -3.50034594 -3.04300026 -4.46595111  3.84607121
    4 I1 K. A  E( u0 m& _3 m7 m; ?[49]  2.44020165 -0.85475604
    ! I3 z& ?) B, e
    , g; l: ?2 E) Y! B6、arimaorder
    : G  E) m) F( @0 l0 @1 p9 d函数功能:输出函数的阶数,用于时间序列的自动定阶。下面用自动定阶函数auto.arima和管道函数结合输出参数。给出示例。% i) G* h% \1 F* c: a
    4 X: K5 {6 X! N6 _
    n = 50set.seed(100)x = rnorm(n, 3, 5) + 1:50  # 生成数据x %>% auto.arima %>% arimaorderp d q 3 1 0
    ) R$ \' Y& \! Q可以配合arima函数进行模型的参数的确定。
    ; {8 t1 r# A1 X% C0 H* V; |: p
      ]& [7 x$ X) f6 X* G7、auto.arima
    + i3 F5 U7 I% a1 l函数功能:可以使用函数进行自动定阶。下面时该函数的参数。这里会进行讲解并给出具体的实例:9 j- t  I& k, Z3 v4 s( @
    auto.arima(
    ) h' w, r) A: A  y, # 数据
    3 [" I, Q0 I" j8 u  d = NA,  # 原始数据差分的阶数; p7 F$ f8 ?2 \$ v' P# _8 f
      D = NA, # 季节因素的差分阶数
    ! p3 e! J/ n% Q0 y, L7 W( U  max.p = 5,  # 遍历达到的最大的AR模型的阶数。
    9 z! `! k- {0 Z  max.q = 5,  # 遍历达到的最大的MA模型的阶数。5 [/ n  c( d5 B$ L) T
      max.P = 2,  # 季节因素遍历达到的最大的AR模型的阶数。8 i2 w" T% d, `+ ?5 p
      max.Q = 2,  # 季节因素遍历达到的最大的MA模型的阶数。
    / t: D6 {- Y( m( g  max.order = 5,* u4 |  C* [: O1 l
      max.d = 2,
    # X( |0 f9 t- K& y* U$ n+ ^6 d  max.D = 1,
    8 ~! M% m1 {) I8 P0 g  start.p = 2,  # 开始遍历的AR模型的阶数。0 p4 v, [" j6 t+ U: ]+ q, L
      start.q = 2,  # 开始遍历的MA模型的阶数。2 j% S+ w3 }! l( S9 V- {
      start.P = 1,; w5 B% N# A$ r' R3 M4 S/ Q
      start.Q = 1,
    2 H9 v/ j, a# m# [, ]  stationary = FALSE,  # 0 y0 Z9 D& L! ?
      seasonal = TRUE,
    5 l/ d( J2 W0 _2 B  ic = c("aicc", "aic", "bic"),  # 常用的选择模型的标准
    0 Z& Z6 I8 @  \% }2 J7 M4 q: W6 a  stepwise = TRUE,
    & q6 {: T1 Q& B  nmodels = 94,1 W1 L( M8 x4 i  i+ B
      trace = FALSE,# 是否跟踪模型的选择
    3 Y) c9 a& }3 M. T+ `  approximation = (length(x) > 150 | frequency(x) > 12),
    / Q8 ?3 N7 l; S0 `9 C  method = NULL,! ^8 i% w- I5 w
      truncate = NULL,
    ( l$ O( J. Y% X  xreg = NULL,# w& T7 m8 O1 Q5 d, r
      test = c("kpss", "adf", "pp"),  # 平稳性检验的方式2 A: i% m7 Z' P5 C- ^) U
      test.args = list(),  C5 e0 M' n6 e# l8 R
      seasonal.test = c("seas", "ocsb", "hegy", "ch"),  # 季节性分析
    - @& a$ C4 f* ~; w# A: v+ C7 @  seasonal.test.args = list(),. A0 l6 b6 V6 e8 @1 Y* f$ ~8 f
      allowdrift = TRUE,  # 可以去掉漂移项
    ( ^( I( L6 ?7 m5 V  allowmean = TRUE,  # 可以去掉均值项
    8 a* Q/ E% u5 K( I/ c  lambda = NULL," B4 Z/ N/ b- m! ^3 @' I
      biasadj = FALSE,; H  R. K' r7 x, B
      parallel = FALSE,% a: y0 ]/ U- I( H
      num.cores = 2,7 C+ k) J/ l! I4 o, M
      x = y,$ q/ C. j, S4 h7 n
      ...
    8 B) |, y# {  W. ]8 o)* [& X8 G5 v- `, |
    1 u6 H; G2 B* k& e" e0 O
    auto.arima函数的参数众多,我把上述函数的参数给了一定的备注。大家可以根据这个注释和数据的其他的检验依据自己去逐一的验证调试。最终得出一个比较满意的模型。  v7 A9 T' V/ a1 C6 r2 r
    下面给出部分调参的实例:
    + L% s& w9 }, B  T+ J2 Z# 画时序图plot(ts(x))$ b1 D; J% k: B
    . W! U( X" ?* n5 P) p9 g2 g

    % W2 Q, m$ \- _7 y8 G下面展示追踪模型的参数:7 E4 k7 }$ M- p( @' b6 {2 x
    7.png
    & v: ?; q8 V7 R( |$ M2 C
    - n) x5 Q* J3 h" @更改准则AICc成AIC继续追踪模型的参数:  _" c4 t4 u- n2 \) V% f
    8.png
    1 I/ @/ P# k, F( r3 v
    4 X1 j: [; U% X9 p这个函数的参数就介绍到这里,大家用到自己继续探索。+ _  M9 W; q5 v  L3 i
    3 Z1 P) o8 i& t$ {. ]& N2 A+ w2 O
    8、ggplot2中的时间序列相关系数
    / c5 J1 m/ b7 @这里把函数内置的实例给出来。
    " C2 C& A0 M4 T; a  Q& f+ ^$ {- h: @4 ]6 G6 X
    # 载入画图的ggplot2包
    ; [# t3 l+ [+ J! E4 d- [; Klibrary(ggplot2)
    : d8 e- [/ k7 `" F" h
    5 l. K1 ]% D! h0 E+ q9 p下面的例子使用winneind数据。是个时间序列数据。" |9 |! S6 V- B: u0 L$ k
    7 H8 G  E3 }2 h, m) o6 u
    1 ggAcf(wineind)
    # H8 M5 X8 K; v5 x- ~% h# m9 \; y3 Z6 u
    8 F7 `  e& \! V( h

    $ R' ~5 j$ t- ^9 K- W, e1 wineind %>% taperedacf(plot=FALSE) %>% autoplot
    : `8 r; j* I0 s& h6 L5 g, ]7 g. q# |0 X. F& e
    4 J$ `8 m( N6 \  ~- Z

    9 H7 ?5 ?% }3 I( F$ W0 J1 ggCcf(mdeaths, fdeaths)
    6 X- S4 b- b) ]! y: n8 @; B8 c8 l
    2 l( @: [( I3 H: @
    & }6 |# ^8 j) t
    9、tslm
    5 W. V+ `6 K7 i% X8 S0 ?+ J函数功能:用时间序列分量拟合线性模型
    / x- t" U5 W( T5 F4 j( B为了我方便第一次见到的同学学习,先贴出模型的参数:( P4 V( ^5 a* `/ E' \5 p
    5 _% ?* B7 U5 C! C2 Q# i9 Y, P0 x
    1 > tslm; P3 m5 P; p# s! m5 k( q* A- E
    2 function (formula, data, subset, lambda = NULL, biasadj = FALSE,
      P! K! F9 |) m3 B3    ...) : h3 o, E! F" F9 T* T' G

    ! l2 s+ [* O* j% Oformula参数是公式、data是数据。下面使用函数例子展示函数功能。" `8 f, N) A# K  _" i# B

    . O9 f! H6 n0 y4 u1 w( T- a1  > y <- ts(rnorm(120,0,3) + 20*sin(2*pi*(1:120)/12), frequency=12) # 构造数据" P) A: o" \6 {1 ?$ O5 W$ P
    2  > fit1 <- tslm(y ~ trend + season)  # 趋势+季节- K6 B2 s+ s3 Y; ~0 y1 @
    3  > fit19 m6 k! u) D; K* H
    4  Call:7 H; b& ~8 X$ W  H" B
    5  tslm(formula = y ~ trend + season)0 ?- T! n# a, h9 D1 ^+ R3 @
    6  Coefficients:  z& B9 T- H: C) o5 ~! D
    7  (Intercept)        trend      season2      season3      season4  
    ' v: W3 J4 S# e/ q( ^! g* I* L2 x8     10.20906      0.01175      7.31274      8.82928      7.04245  ) H2 r$ }' n% y0 a0 i! B$ U- P
    9      season5      season6      season7      season8      season9  , M2 F3 S# n* q9 N1 F+ ~
    10   -2.04022    -10.24111    -20.57768    -27.61414    -30.16768  & Y1 Y4 X' P4 F1 \1 `& r& k
    11   season10     season11     season12  
    , L* C, Q! F/ w1 b# _12  -27.56840    -21.53062    -10.35272  
    0 W3 o7 J( ~/ X. L9 g) v) B2 {- j6 W% B/ q
    1 plot(forecast(fit1, h=20))  # 画出模型1的预测图
    ) W$ V1 C( L% [) L- c0 m, z
    6 E$ z+ p) x7 A' y; ]" w4 ^! P9 k2 y$ T: k; g& f) Z- ?2 _
    1  > fit2 <- tslm(y ~ season)6 P5 p+ ?" {" e* c( h2 B
    2  > fit2
    $ \2 f: K" m$ H* z  t3  Call:
    $ ^- S$ P' t) ^/ J8 _/ s. y) J4  tslm(formula = y ~ season)
    4 i9 ~- Z  y6 K9 Y) _+ e5 R5  Coefficients:
    ) g. y' u/ J2 M3 O7 G6  (Intercept)      season2      season3      season4      season5  " @8 l% O3 ?) j$ o8 U5 B
    7     10.856        7.324        8.853        7.078       -1.993  
    : Z+ k! o2 R9 x# S' k$ M+ B8    season6      season7      season8      season9     season10  
    * r/ m9 [: E1 i3 X% f7 ]. U; e9    -10.182      -20.507      -27.532      -30.074      -27.463  
    ! S/ v5 p+ U, M10   season11     season12  
    9 i/ z) D3 z! S- J8 R11    -21.413      -10.223 ; W1 v" J& W4 N. X

    ! k* z5 ?% ^8 t2 q: E1  plot(forecast(fit2, h=20))  # 画出模型2的预测图( |+ N; l: [2 x3 j# ~! A
    $ V' d- m$ n4 q# ^- l8 k4 {) E1 N

    8 b  @! F. J* o) m" A10、CV交叉验证6 L, V, h4 Q% ^3 p, c1 |" R* o. e
    CV函数显示模型的CV AIC AICc BIC AdjR2值,用上述模型直接给出例子。$ i1 a" B' S( J* C
    , V0 M0 R$ a  m
    1  > CV(fit1)0 k" q: j' d7 E8 R+ ?. \/ `
    2          CV        AIC       AICc        BIC      AdjR2
    ' G$ V8 S3 |! L  h6 ]3   12.851627 306.718526 310.718526 345.743411   0.945285 + `4 \; U( }. w- y
    4  > CV(fit2)
    / M* {( f# D; y5           CV         AIC        AICc         BIC       AdjR2 ! ?9 w6 |! D/ v( G5 ^% s
    6   12.7985986 306.6337582 310.0677205 342.8711509   0.9449195 3 z0 W) \" {- @: |+ O
    3 W3 q: H3 J4 U% U
    11、forecast8 f! c3 Q4 {) b9 }. |- H2 ]& E
    这个函数可以给出模型的预测值用于画图和分析。9 o% ]3 {5 K3 i% k5 J! f
    下面给出上述模型一的预测值。
    . a7 U- J! ^& L, x. D1 T, ?: j6 k
    ; u7 g1 J8 V& Z- ]9 U 8.png
    # ~, T; a3 |' n( j$ t结果说明:第一列是时间、第二列是预测值、后面4列是预测值的80%、95%的置信下限和置信下限。+ w% m! i' r0 {  J4 @$ w, K. s

    * c2 g* w, S' j6 p) m1 a2 W  e# w: g12、geom_forecast
      C& R8 f( d+ l) D% c# p这个图是ggplot2的预测图,下面贴出代码给出效果。这个函数也需要结合ggplot2包进行。. ]  U. ]2 V* q/ U& s7 w

    % S3 ?0 }- q" e7 }1  library(ggplot2)
    ; N! w3 v# e9 q3 X8 l: w2  autoplot(USAccDeaths) + geom_forecast()  # 图一! |- a. V3 E, a! r0 P
    3  lungDeaths <- cbind(mdeaths, fdeaths)
    / X$ G/ _, l3 c, n9 e1 d4  autoplot(lungDeaths) + geom_forecast()  # 图二
    / v4 H+ q+ ~3 t' M
    4 M' C1 p$ T/ N; X# m" b! k
    , B) R+ I; P- c# W& ^' A" t4 q* [$ \( L
    13、总结
    3 ^9 ^9 I2 x1 q: I8 r! Eforecast包里的函数众多,上面只是介绍很少的一部分,更多函数的使用方式留着给大家探索。: V6 a9 z: d4 _, _

    9 Q2 J8 ]7 s2 x& K% _14、参考文献
      O& C) c9 _* [) Uhttps://blog.csdn.net/weixin_46111814/article/details/105348265 ↩︎
    % m; i5 G3 @: H" u, Q% c% ]0 a8 {( ^. N# W6 D8 Q
    https://blog.csdn.net/weixin_46111814/article/details/105370507 ↩︎  H& a4 `, D5 `% ]7 t* X
    ; [' T  p8 ^; d
    http://127.0.0.1:17627/library/forecast/html/00Index.html ↩︎$ a' {0 X( {  V
    ————————————————. T& T) s" M4 T) G% p
    版权声明:本文为CSDN博主「逆天者顺A」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    2 |) J9 E$ t/ p, V* w原文链接:https://blog.csdn.net/weixin_46111814/article/details/105583080  n" j0 F7 `) U7 k: @

    ! t9 p; ]6 j+ `" _+ c( L& F: q2 X1 a1 D5 U: `
    zan
    转播转播0 分享淘帖0 分享分享0 收藏收藏0 支持支持0 反对反对0 微信微信

    0

    主题

    1

    听众

    6

    积分

    升级  1.05%

  • TA的每日心情
    开心
    2020-5-21 09:14
  • 签到天数: 1 天

    [LV.1]初来乍到

    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 注册地址

    qq
    收缩
    • 电话咨询

    • 04714969085
    fastpost

    关于我们| 联系我们| 诚征英才| 对外合作| 产品服务| QQ

    手机版|Archiver| |繁體中文 手机客户端  

    蒙公网安备 15010502000194号

    Powered by Discuz! X2.5   © 2001-2013 数学建模网-数学中国 ( 蒙ICP备14002410号-3 蒙BBS备-0002号 )     论坛法律顾问:王兆丰

    GMT+8, 2026-4-15 10:02 , Processed in 0.778362 second(s), 59 queries .

    回顶部