在线时间 661 小时 最后登录 2023-8-1 注册时间 2017-5-2 听众数 32 收听数 1 能力 10 分 体力 55571 点 威望 51 点 阅读权限 255 积分 17623 相册 0 日志 0 记录 0 帖子 447 主题 326 精华 1 分享 0 好友 79
TA的每日心情 慵懒 2020-7-12 09:52
签到天数: 116 天
[LV.6]常住居民II
管理员
群组 : 2018教师培训(呼和浩
群组 : 2017-05-04 量化投资实
群组 : 2017“草原杯”夏令营
群组 : 2018美赛冲刺培训
群组 : 2017 田老师国赛冲刺课
00引言
( h( A1 G* u9 k/ [ 在毕业实用统计模型(一)——时间序列1中介绍了时间序列的模型的基本建模思路,在毕业设计实用模型(二)——时间序列之SARIMA2中说明了ARMA、ARIMA、SARIMA三大模型的关系与参数调整。但是在实际建模中往往会遇到更加实际的需求:模型的评估、参数检验、预测图的展示、模型参数的调整。对于很对不喜欢编程的人来说很是痛苦。本文将会重点从上述几个方面讲述forecast包里的主要的函数,并给出实例。从本文中你将会学会:
5 z1 F( Q7 f) ?5 s) k0 O' J6 { * S' |6 ?! j% W3 W c# Y
更加高效的的模型预测图。
! J6 s7 K$ ~! P3 u7 y# R% c 模型的参数检验
# f5 f; O5 }# S8 ^3 V g, g 模型定阶的函数
# N& w# e7 @% }: W& Y 模型的评估函数
0 |& x: H9 {' E 拟合线性的模型函数0 M: G, z8 s) C" W$ E
相关图绘画,以及误差的标注9 `/ E0 C3 T# P% Z X8 h
输出模型的预测误差
, x/ I6 l$ T' B 注:本文部分代码案例来自forecast包,大家有疑问可以自行去查找3.如果进不去可以运行下面代码会找到。
# q' q8 g/ U9 p: x5 G9 ^# b- m library(forecast)
% m" I% Q8 N* `1 a( H& S help(package = forecast): w0 L+ z g+ R7 b v# g
$ Y, U: J9 |: G* c& a7 F% L5 a% _, f 1、accuracy函数
9 ~* G4 |% k0 Y `& b' _ 描述:输入参数是模型,输出下面的结果:
; B5 H C7 e$ y2 H$ d / P8 I( ?% T+ e, R. t# J
' x8 n8 ~- a' h. c: X. b
/ E: Q2 G; w2 R- v* ` 函数示例:5 r& P& G' y5 O/ Y- z
3 e+ x6 A) g% j( b
( A; h3 @7 H! d* b, Y
) [3 z& W6 `3 _" \. ~% Z 最后的图片:' r8 M( T" M$ v9 t
" ~. r; E4 e$ X% \3 v0 ~
$ o6 F6 u, w* T9 b" {6 n6 C 2、Acf、Pacf、taperedacf、taperedpacf# H* E/ {1 W- Y
这四个函数分别是自相关函数、偏自相关函数、带有误差的自相关函数、带有误差的偏自相关函数。前两个很熟悉和内置的acf、pacf一样,下面只给出后两个的示例:
9 @: K. c) u: f O
, e" ^# D [2 K( w
. U: F: M. I( ^ : p6 `- g( a5 t/ o% t% w3 P2 y, C
3、arfima; V9 c$ H2 V# n4 I. l- c/ ^: L
可以建立长期记忆的时间序列模型。
- m) p4 v5 g" A$ a R 直接给例子了哦:5 G2 C: a8 v1 A% b* X& R2 x
2 b$ J4 O4 g6 y- y. j5 y
7 S3 C7 k2 a' M6 B2 Q, x0 f4 e
输出模型效果:
, ^( z: N8 t+ E* B9 }" E
9 U$ @0 o- x: P D* s4 } 8 r5 u9 H, q8 m% R D& n
画出残差信息:! _" s8 r$ a6 F! S0 |9 E
tsdisplay(residuals(fit)) * i) C# J, P- P5 m+ y
" ]) V# x* n- Q/ K $ E% B% C- r, O' U
4、Arima函数
5 y) p3 Q' S$ @* }( N7 r1 v7 c2 i 函数介绍:这个函数可以拟合平稳或者非平稳的且已经知道参数的时间序列模型。也可以带有季节因素。
% C$ P8 V0 R. \; P% n
4 {' I% v! C4 O- C n = 50set.seed(0)x = rnorm(n, 1,3) # 生成数据library(ggplot2) # 载入画图包x %>% Arima(order=c(3,1,1)) %>% forecast(h=5) %>% autoplot4 v1 x% i, n9 c
5 O6 z$ y0 `) I2 ~& K
上述代码用了管道函数,ggplot2包。对模型从数据到预测到建模一部到位。给大家看看Arima的参数。
- L( E* ^0 G4 t! d$ E' T
3 l8 M9 d0 V- D: t7 r: H8 ? function (y, order = c(0, 0, 0), seasonal = c(0, 0, 0), xreg = NULL, 4 F- [% U4 v3 q' s% I
include.mean = TRUE, include.drift = FALSE, include.constant,
j( ]) ]. @! E3 I1 h$ ?3 ] lambda = model$lambda, biasadj = FALSE, method = c("CSS-ML", , N7 o) `$ L& D' i6 ~7 J9 g
"ML", "CSS"), model = NULL, x = y, ...)
. e7 s. k+ V8 D3 b, n 9 y$ Y. l( E3 O+ G" j0 ]) c
5、arima.errors函数
; t( X c* j7 A$ \7 d 该函数使用简单,用于输出模型预测每一期的误差。注意和residuals函数进行区分。
$ L6 a5 Q3 q% q5 G # 生成数据建模n = 50set.seed(0)x = rnorm(n, 1,3)fit <- arfima(x) ! h- T4 Q! U' S; m" u+ @
# 计算结果
- C+ f" M0 U7 s" T6 m > arima.errors(fit) # 预测误差
( I2 Q& I2 P Q" u& h; } Deprecated, use residuals.Arima(object, type='regression') instead
8 a% w: W5 V% X: O7 _ Time Series: b8 |* X/ `- _3 Y+ P( l: q
Start = 1
- j: g8 [0 F$ F End = 50 . @1 t" @. x+ T: ]' s6 @
Frequency = 1 $ J' p% t" P- J' N
[1] 4.78886285 0.02129992 4.98939779 4.81728796 2.24392430 -3.61985013
) p( H: R( i4 Y4 { [7] -1.78570110 0.11583866 0.98269848 8.21396017 3.29078038 -1.39702775
; C, F( F$ o( i4 c5 p [13] -2.44297103 0.13161528 0.10235465 -0.23453250 1.75667034 -1.67576338
# B, W* V! d, M1 H* e [19] 2.30704990 -2.71261527 0.32719634 2.13218694 1.40000908 3.41256853
; {+ i. x1 n! \9 {( x' E [25] 0.82867968 2.51082392 4.25730809 -1.07286152 -2.85379806 1.14017852
( Z5 S9 I5 @% }$ K2 E [31] 0.29288033 -0.62866477 -0.29993095 -0.94841494 3.18025224 4.455735268 l E( u1 z# f( S/ Z- X R
[37] 3.97648110 -0.28853933 4.71491230 0.16196115 6.27370927 2.68223827; _4 g! k) Q+ J: N
[43] -0.35835192 -1.49612989 -2.49971164 -2.19677174 -3.69134615 4.46961099
' P9 |, C" q/ T1 W" ^' N: B# `/ y [49] 3.49614139 0.31801393/ L5 B$ Z1 P x
> residuals(fit) # 残差
5 a0 a2 T3 @, t1 B7 ? Time Series:4 M4 ^$ M4 M( o" A3 n8 c
Start = 1 ( k( z1 G) e( l3 W" [$ a0 j
End = 50
2 ?' |4 k' m! a! |/ w Frequency = 1
0 T l) X$ V+ G [1] 3.71706994 -1.28784846 3.87358515 3.45503095 0.78349981 -4.98056775( T. x0 t. ~2 v9 t. U3 ?) c
[7] -2.74303846 -0.77184435 0.03669199 7.20508533 1.79698739 -2.80377609- X6 ~7 ~. ]" |- U- \
[13] -3.54880551 -0.77827016 -0.86325716 -1.20139553 0.81773766 -2.723927914 C7 U" V; `) m
[19] 1.43279254 -3.76501026 -0.47528735 1.24438107 0.37471968 2.37151650
3 O9 K1 _: ~0 d [25] -0.35743144 1.41677218 3.08432283 -2.39421040 -3.91173996 0.30272726
3 A& p! J9 }3 I [31] -0.68356344 -1.59285606 -1.19943417 -1.83611913 2.34677217 3.38917930
$ n6 X0 e" b# i; ^) Z( I/ g) {# i [37] 2.72730075 -1.60715574 3.61473632 -1.17228009 5.12889059 1.218711711 p( I. ]1 M. |# A7 [
[43] -1.73495615 -2.66242875 -3.50034594 -3.04300026 -4.46595111 3.84607121
* J) a2 P# {0 ~( _2 J( q2 I1 ^0 a, V [49] 2.44020165 -0.85475604
) q+ B1 P+ k8 U8 j. F4 q / E# a" Y, l/ j' i
6、arimaorder9 [- V- C4 x2 E
函数功能:输出函数的阶数,用于时间序列的自动定阶。下面用自动定阶函数auto.arima和管道函数结合输出参数。给出示例。* m' t2 e( E. I) U, h% E
% o! q9 R4 B5 S. m! Q/ N* \# |+ a
n = 50set.seed(100)x = rnorm(n, 3, 5) + 1:50 # 生成数据x %>% auto.arima %>% arimaorderp d q 3 1 0
3 _1 d% g$ T7 f# ?6 ~/ V% F 可以配合arima函数进行模型的参数的确定。
# Y6 i! D6 C) D [: G s, J
# L% n6 P1 \9 N J9 H- J7 i! o 7、auto.arima7 Q$ n& P% U. ?/ P
函数功能:可以使用函数进行自动定阶。下面时该函数的参数。这里会进行讲解并给出具体的实例:
+ V/ n6 e! e0 G3 F auto.arima() _* T: p6 |4 E) T5 b
y, # 数据
5 x4 n8 D' ?- q d = NA, # 原始数据差分的阶数1 e0 z3 h b2 Z, e: }1 s3 M6 n4 {
D = NA, # 季节因素的差分阶数0 V8 _, T6 F. x( B* t% ^" Q
max.p = 5, # 遍历达到的最大的AR模型的阶数。2 w. d4 C f" h5 N) @
max.q = 5, # 遍历达到的最大的MA模型的阶数。 G8 Z& J7 @9 D1 u, Y; [
max.P = 2, # 季节因素遍历达到的最大的AR模型的阶数。6 Q5 D9 {1 r! u; r! y
max.Q = 2, # 季节因素遍历达到的最大的MA模型的阶数。
& O' j& K: a3 H8 k max.order = 5,5 g# j. w( B5 |" O) l7 Y, E" |
max.d = 2,6 C9 |, o' G. K# q3 [$ f$ }7 i
max.D = 1,
$ @) z R C, `" Y start.p = 2, # 开始遍历的AR模型的阶数。) \3 c; M* j. E/ c' L9 M) `8 Y; P
start.q = 2, # 开始遍历的MA模型的阶数。1 U' ~. T4 O, e0 Y( C) H
start.P = 1,
: l6 X: k4 L) r2 a' s start.Q = 1,
. I' Q5 t$ y7 V* f7 U' M1 J stationary = FALSE, # + Y( I& w9 G, z5 v0 ~
seasonal = TRUE,
4 h( V# H F0 R ic = c("aicc", "aic", "bic"), # 常用的选择模型的标准9 z; K4 w& E+ r
stepwise = TRUE,
/ M+ F- j: x; M( E6 c nmodels = 94,
& A k x/ {' C3 e8 O trace = FALSE,# 是否跟踪模型的选择
# J' ?9 W* w4 T1 A% f& ]/ t5 c7 L approximation = (length(x) > 150 | frequency(x) > 12),
$ _2 ?: W& M5 ~8 B& C method = NULL,
. L5 }3 a; }2 r7 Z/ @ truncate = NULL,# D3 l/ _0 _$ b% D
xreg = NULL,
7 A1 j% I* P, M# ^+ } test = c("kpss", "adf", "pp"), # 平稳性检验的方式+ b& T& ~! u9 P8 \6 U/ c8 M
test.args = list(),
) {% Z7 H9 e4 c& l8 V3 B seasonal.test = c("seas", "ocsb", "hegy", "ch"), # 季节性分析
/ c+ h0 a; N2 t: V( O seasonal.test.args = list(),0 S1 V2 U+ O* q1 p3 v& B
allowdrift = TRUE, # 可以去掉漂移项
7 [* N' N5 c ] allowmean = TRUE, # 可以去掉均值项
3 h: R, m- {9 i3 o) n Q lambda = NULL,
) ^( u5 s5 `6 v biasadj = FALSE,
3 K3 H, P( |6 ?9 ^/ q' J- [ parallel = FALSE,7 z @9 ~2 @9 c V4 S& t# s
num.cores = 2,( j' ]6 j, ]4 L; H* n& v
x = y,
4 X6 H7 m0 k% `- r ...
* G8 T; g+ T2 p3 P )
6 N G( V3 X! i# @# t p- t + f8 X. i: q9 o) V/ H
auto.arima函数的参数众多,我把上述函数的参数给了一定的备注。大家可以根据这个注释和数据的其他的检验依据自己去逐一的验证调试。最终得出一个比较满意的模型。0 ]; b: U& {6 d& J: ?: A: F
下面给出部分调参的实例:" \" Q7 p" S1 q( X3 U
# 画时序图plot(ts(x)) ) l2 w# C( k+ p
0 M) H( J7 q' {5 V {
" }6 ] s3 Y* W+ C' p* O* c
下面展示追踪模型的参数:) ~* X; d2 ~5 W& H7 y
# H2 Y" q4 }4 W) I( `4 q! C* g
/ s! @5 L. a I5 W5 { 更改准则AICc成AIC继续追踪模型的参数:
9 p2 M$ Y/ F x5 u* j$ ?& }* Q2 o4 h
! I1 f/ ^! V& o6 z* X$ ?- O: Q* B9 k 3 s W3 C- e! S; _, P' G
这个函数的参数就介绍到这里,大家用到自己继续探索。4 Z6 A9 }5 R1 J( N9 \6 p3 a9 H
* I9 J8 l4 T$ F 8、ggplot2中的时间序列相关系数
$ T/ K2 z5 n+ q n- W0 Q4 S/ Q 这里把函数内置的实例给出来。8 s. a9 p" y% ^; {0 g
2 I6 e% }+ M% Q6 S8 R* s # 载入画图的ggplot2包/ A" M: Y' Y5 m7 H0 m# [, o
library(ggplot2)2 ^1 ]! u" e; [8 N4 J
`- o$ V" A4 s: @$ y8 R
下面的例子使用winneind数据。是个时间序列数据。8 @$ x* b2 W% o4 O, z
9 f9 e# g2 e6 C) u 1 ggAcf(wineind)
3 q* \/ d$ Z8 ]2 ]# d! Y 3 D: L5 Y2 ]2 r0 c' V1 K
' N4 G& r, z& ~/ J- ~ 0 X0 E; X$ m! B2 I6 F/ r
1 wineind %>% taperedacf(plot=FALSE) %>% autoplot
% M! j; ]5 Q J. G, A& W
5 z E% g8 ?. D" f& w9 l
; W) w4 r8 D: P) Z3 o5 ~& q
1 I4 M9 \+ `$ \+ C 1 ggCcf(mdeaths, fdeaths); u' G. } e9 m- U; i' C
( |' w+ ~; ]- M8 }7 g5 _' H7 g0 x# m8 w " x+ H: | `( w$ k
8 g" c4 k) h( ?
9、tslm
' O. p% _4 m3 V; @1 ` 函数功能:用时间序列分量拟合线性模型$ \# A0 N# R0 c y1 \8 v( e9 C
为了我方便第一次见到的同学学习,先贴出模型的参数:
; u4 W) U6 u2 p4 ~3 e
$ X, C- r t+ o# u4 x& Z- X2 A' o 1 > tslm
; B$ _' Q, [: ?9 R 2 function (formula, data, subset, lambda = NULL, biasadj = FALSE,
! y- Y1 Q) l3 {3 V1 F) n% N+ y5 N& h 3 ...)
/ B, d9 O6 v+ O, K# b2 P; V
3 a6 _8 a/ O u n: U formula参数是公式、data是数据。下面使用函数例子展示函数功能。: I8 u7 I. L/ h# x C
4 z) F7 e \+ y4 O. a 1 > y <- ts(rnorm(120,0,3) + 20*sin(2*pi*(1:120)/12), frequency=12) # 构造数据. R; z* |6 D( x6 V7 \6 T' C
2 > fit1 <- tslm(y ~ trend + season) # 趋势+季节
* h8 G8 O8 d: w# Z8 t5 h 3 > fit13 l$ p* X/ V. N6 U; u1 z
4 Call:
; }$ F7 e: J& g1 x 5 tslm(formula = y ~ trend + season)& i6 d% [2 q; O7 h; j
6 Coefficients:( H' t! Y' X" s* q8 W. E6 ^! ^
7 (Intercept) trend season2 season3 season4 ) r$ P+ ^" N4 M) X& Q( T" u- _
8 10.20906 0.01175 7.31274 8.82928 7.04245
# A8 a) n! `+ s O9 S3 @ 9 season5 season6 season7 season8 season9
7 h: p0 h% A0 X6 B 10 -2.04022 -10.24111 -20.57768 -27.61414 -30.16768
L6 Q; [2 g# O V5 Q! \5 x9 z" T 11 season10 season11 season12 1 g3 u# S( o- T1 r, m
12 -27.56840 -21.53062 -10.35272 4 b' k5 A2 S, c: \* C
2 p) u3 U' q- w/ t, p8 a
1 plot(forecast(fit1, h=20)) # 画出模型1的预测图: s4 f! _ y4 ?, Q
* ^. _2 B+ S( f6 g2 ~$ V( q3 b
) W# ]" v0 ]2 Y# D 1 > fit2 <- tslm(y ~ season)
& J( i6 S( K1 o7 T; } 2 > fit2
+ t6 S" |3 Q0 H: N 3 Call:! G0 P0 y" ?+ m' ]3 @) b8 R* k
4 tslm(formula = y ~ season)& s" h' V6 i' v5 P" ?8 `
5 Coefficients:0 `# S$ |& P: v5 b! U( \6 M3 R
6 (Intercept) season2 season3 season4 season5
7 M8 a! _" w* A: i! z 7 10.856 7.324 8.853 7.078 -1.993
: M3 ~4 G7 ]. A9 [ g( _: i 8 season6 season7 season8 season9 season10 ( v0 r9 } S0 v0 |% L/ t
9 -10.182 -20.507 -27.532 -30.074 -27.463 : q2 W4 R, J0 M8 d e
10 season11 season12 ~. X) T8 L7 i
11 -21.413 -10.223 0 [4 n2 S" Z! D' n& ]0 ?
* D8 C& z. `' ]* A) \/ f 1 plot(forecast(fit2, h=20)) # 画出模型2的预测图9 y1 [( _) v; R
6 i% Z; q$ E' |( Q
3 N# [1 O) m2 K7 w3 d* p
10、CV交叉验证
# ^7 q% Y" x: Q0 O: Y6 |, `+ b CV函数显示模型的CV AIC AICc BIC AdjR2值,用上述模型直接给出例子。8 T6 ?1 K9 H$ L$ f0 j0 j
+ Q" A* t# f& t; d! R
1 > CV(fit1)( C1 S$ m. C7 `2 u- ?* ]4 G
2 CV AIC AICc BIC AdjR2
: N- q! k* H! P5 a2 A& _7 b 3 12.851627 306.718526 310.718526 345.743411 0.945285
8 `+ Z z" R0 z) B) f3 L2 n 4 > CV(fit2)6 t h( K- n9 J0 A5 ~7 V7 q( M p
5 CV AIC AICc BIC AdjR2
* b% f4 f2 s7 Z8 J' s& c6 c8 T 6 12.7985986 306.6337582 310.0677205 342.8711509 0.9449195 7 G+ W5 R% J) b& {) @- V: }
/ b/ ^- v' N% i; I) m9 h 11、forecast4 p2 x. \, C. {- M
这个函数可以给出模型的预测值用于画图和分析。
) \" N& T* f" g$ w% \: L5 {# l 下面给出上述模型一的预测值。# J s' ~! r! s
) X! `9 j$ i5 R1 h5 F" }+ m! ~) d
5 m( b+ d4 a8 }% x$ _
结果说明:第一列是时间、第二列是预测值、后面4列是预测值的80%、95%的置信下限和置信下限。
8 ^) j" P0 Y5 W+ r! j4 I( q
* e+ i* @0 N. ^7 T, i$ g 12、geom_forecast: m# y9 A! l" C! @; \
这个图是ggplot2的预测图,下面贴出代码给出效果。这个函数也需要结合ggplot2包进行。
/ @. j) l& q( t5 Q9 c" z % v5 i6 D$ y5 u9 z# h/ u
1 library(ggplot2)9 k) c/ e' O, S5 {
2 autoplot(USAccDeaths) + geom_forecast() # 图一
9 Y5 c( x; m! @ 3 lungDeaths <- cbind(mdeaths, fdeaths)
! N$ ?- z" V3 X, K, K 4 autoplot(lungDeaths) + geom_forecast() # 图二( B) }6 w, G- Z4 r2 W. T- }
+ G8 ~. d5 o* {' A: P' _
; q/ w0 ]8 V$ w- K: _* T K' S* n
! ]& U. `" D3 W) e 13、总结
9 e9 a* u- h2 `' {( U1 _ forecast包里的函数众多,上面只是介绍很少的一部分,更多函数的使用方式留着给大家探索。# d2 y4 H* a& E" P) Q
7 ^# h# P- d( e( |) h' a' [# e
14、参考文献
/ H! w0 p7 E, u. {2 x6 O, u7 z https://blog.csdn.net/weixin_46111814/article/details/105348265 ↩︎4 X' t6 O5 P+ h; m$ D u
j& q4 c9 H# c5 ~( T https://blog.csdn.net/weixin_46111814/article/details/105370507 ↩︎ w; f; ~& x, _$ [/ N5 U5 x! n; `2 u
# r5 u- K" \6 r! o" K1 {5 T7 f http://127.0.0.1:17627/library/forecast/html/00Index.html ↩︎: T0 C) t. H( c q1 ~8 V! ~3 N# |9 |
————————————————- `3 O7 A h/ E$ G+ p
版权声明:本文为CSDN博主「逆天者顺A」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
" O% i' L4 z. N. F+ y- ] 原文链接:https://blog.csdn.net/weixin_46111814/article/details/1055830803 X4 R. o* @ Z
) r# y! x2 \4 H
# B' S8 r6 y) v4 N& w+ W
zan