r语言 - 仅从 forecast() 中提取预测值



我有一个看起来像这样的数据帧:

> head(forecasts)
$`1_1`
Point Forecast    Lo 80    Hi 80    Lo 95    Hi 95
Dec 2016       7.370299 7.335176 7.405422 7.316583 7.424015
$`1_10`
Point Forecast    Lo 80    Hi 80    Lo 95    Hi 95
Dec 2016       7.396656 7.359845 7.433467 7.340359 7.452953
$`1_2`
Point Forecast    Lo 80    Hi 80    Lo 95    Hi 95
Dec 2016       7.780033 7.752462 7.807605 7.737866 7.822201
$`1_3`
Point Forecast    Lo 80    Hi 80    Lo 95    Hi 95
Dec 2016       7.216894 7.178896 7.254892 7.158781 7.275007
$`1_4`
Point Forecast    Lo 80    Hi 80    Lo 95    Hi 95
Dec 2016       7.501195 7.465049 7.537341 7.445915 7.556475
$`1_5`
Point Forecast    Lo 80    Hi 80    Lo 95    Hi 95
Dec 2016       7.455131 7.424918 7.485345 7.408924 7.501339

我只想提取Point Forecast

str(forecasts)的调用会返回大量输出,这只是"预测"变量中 89 个列表之一的输出:

$ 9_9  :List of 10
..$ method   : chr "ARIMA(0,0,0)(0,1,0)[12] with drift"
..$ model    :List of 19
.. ..$ coef     : Named num 0.00965
.. .. ..- attr(*, "names")= chr "drift"
.. ..$ sigma2   : num 0.0047
.. ..$ var.coef : num [1, 1] 1.24e-06
.. .. ..- attr(*, "dimnames")=List of 2
.. .. .. ..$ : chr "drift"
.. .. .. ..$ : chr "drift"
.. ..$ mask     : logi TRUE
.. ..$ loglik   : num 33.4
.. ..$ aic      : num -62.7
.. ..$ arma     : int [1:7] 0 0 0 0 12 0 1
.. ..$ residuals: Time-Series [1:38] from 2014 to 2017: 0.00546 0.00583 0.006 0.00564 0.00563 ...
.. ..$ call     : language .f(y = .x[[i]], x = list(x = c(5.4677292870219, 5.85045765518954, 6.02852764863892, 5.67941181324485,  5.67526620| __truncated__ ...
.. ..$ series   : chr ".x[[i]]"
.. ..$ code     : int 0
.. ..$ n.cond   : int 0
.. ..$ nobs     : int 26
.. ..$ model    :List of 10
.. .. ..$ phi  : num(0) 
.. .. ..$ theta: num(0) 
.. .. ..$ Delta: num [1:12] 0 0 0 0 0 0 0 0 0 0 ...
.. .. ..$ Z    : num [1:13] 1 0 0 0 0 0 0 0 0 0 ...
.. .. ..$ a    : num [1:13] 0.0677 5.6916 5.7073 5.692 5.7108 ...
.. .. ..$ P    : num [1:13, 1:13] 0 0 0 0 0 0 0 0 0 0 ...
.. .. ..$ T    : num [1:13, 1:13] 0 1 0 0 0 0 0 0 0 0 ...
.. .. ..$ V    : num [1:13, 1:13] 1 0 0 0 0 0 0 0 0 0 ...
.. .. ..$ h    : num 0
.. .. ..$ Pn   : num [1:13, 1:13] 1 0 0 0 0 0 0 0 0 0 ...
.. ..$ xreg     : int [1:38, 1] 1 2 3 4 5 6 7 8 9 10 ...
.. .. ..- attr(*, "dimnames")=List of 2
.. .. .. ..$ : NULL
.. .. .. ..$ : chr "drift"
.. ..$ bic      : num -60.2
.. ..$ aicc     : num -62.2
.. ..$ x        : Time-Series [1:38] from 2014 to 2017: 5.47 5.85 6.03 5.68 5.68 ...
.. ..$ fitted   : Time-Series [1:38] from 2014 to 2017: 5.46 5.84 6.02 5.67 5.67 ...
.. ..- attr(*, "class")= chr [1:2] "ARIMA" "Arima"
..$ level    : num [1:2] 80 95
..$ mean     : Time-Series [1:1] from 2017 to 2017: 6.32
..$ lower    : Time-Series [1, 1:2] from 2017 to 2017: 6.23 6.18
.. ..- attr(*, "dimnames")=List of 2
.. .. ..$ : NULL
.. .. ..$ : chr [1:2] "80%" "95%"
..$ upper    : Time-Series [1, 1:2] from 2017 to 2017: 6.4 6.45
.. ..- attr(*, "dimnames")=List of 2
.. .. ..$ : NULL
.. .. ..$ : chr [1:2] "80%" "95%"
..$ x        : Time-Series [1:38] from 2014 to 2017: 5.47 5.85 6.03 5.68 5.68 ...
..$ series   : chr ".x[[i]]"
..$ fitted   : Time-Series [1:38] from 2014 to 2017: 5.46 5.84 6.02 5.67 5.67 ...
..$ residuals: Time-Series [1:38] from 2014 to 2017: 0.00546 0.00583 0.006 0.00564 0.00563 ...
..- attr(*, "class")= chr "forecast"

我们可以使用lapplylist中提取值

lapply(forecasts, function(x) as.numeric(x$mean, na.rm = TRUE)))

如果所有列表元素中的预测数量相同,则可以将其转换为matrixdata.frame

sapply(forecasts, `[[`, "mean")

或使用tidyverse

library(tidyverse)
forecasts %>% 
map_df(~ .x$mean %>% 
as.numeric)

最新更新