如何从寓言 R 预测模型中取消嵌套样本

How to unnest samples from a fable R forecast model

我正在尝试从使用 fable 生成的预测模型中获取样本。这是我试过的

library(fable)
library(tsibble)
library(tsibbledata)
library(dplyr)
library(tidyr)

# Forecasting with an ETS(M,Ad,A) model to Australian beer production
beer_fc <- aus_production %>%
  model(ets = ETS(log(Beer) ~ error("M") + trend("Ad") + season("A"))) %>%
  forecast(h = "3 years", bootstrap=TRUE, times = 5)

beer_fc %>% unnest(c(Beer))

我得到的错误是:

Error: Input must be list of vectors

数据结构如下str(beer_fc$Beer[1]):

> str(beer_fc$Beer[1])
dist [1:1] 
$ :List of 3
 ..$ dist     :List of 1
 .. ..$ x: num [1:5] 6.09 6.02 6.06 6 5.95
 .. ..- attr(*, "class")= chr [1:2] "dist_sample" "dist_default"
 ..$ transform:function (.x)  
 .. ..- attr(*, "class")= chr "transformation"
 .. ..- attr(*, "inverse")=function (.x)  
 ..$ inverse  :function (.x)  
 ..- attr(*, "class")= chr [1:2] "dist_transformed" "dist_default"
@ vars: chr "Beer"

如果我们想将 'dist' 值提取为 'long' 格式,循环遍历 list 列 'Beer',提取值,将其分配回 'Beer' 然后 unnest

library(purrr)
library(tidyr)
library(dplyr)
beer_fc$Beer <- map(beer_fc$Beer, ~ .x[[1]]$x)
beer_fc %>%
       unnest(c(Beer))

-输出

# A tibble: 60 x 4
#   .model Quarter  Beer .mean
#   <chr>    <qtr> <dbl> <dbl>
# 1 ets    2010 Q3  6.02  402.
# 2 ets    2010 Q3  5.99  402.
# 3 ets    2010 Q3  6.05  402.
# 4 ets    2010 Q3  5.92  402.
# 5 ets    2010 Q3  5.99  402.
# 6 ets    2010 Q4  6.15  470.
# 7 ets    2010 Q4  6.15  470.
# 8 ets    2010 Q4  6.17  470.
# 9 ets    2010 Q4  6.17  470.
#10 ets    2010 Q4  6.12  470.
# … with 50 more rows

您可以使用 pluck 获取要从任何级别提取的值,然后 unnest

library(tidyverse)

beer_fc %>%
  mutate(value = map(Beer, purrr::pluck, 'dist', 'x')) %>%
  unnest(value)

# A tibble: 60 x 5
#   .model Quarter         Beer .mean value
#   <chr>    <qtr>       <dist> <dbl> <dbl>
# 1 ets    2010 Q3 t(sample[5])  402.  6.00
# 2 ets    2010 Q3 t(sample[5])  402.  6.02
# 3 ets    2010 Q3 t(sample[5])  402.  5.99
# 4 ets    2010 Q3 t(sample[5])  402.  6.05
# 5 ets    2010 Q3 t(sample[5])  402.  5.92
# 6 ets    2010 Q4 t(sample[5])  483.  6.21
# 7 ets    2010 Q4 t(sample[5])  483.  6.16
# 8 ets    2010 Q4 t(sample[5])  483.  6.14
# 9 ets    2010 Q4 t(sample[5])  483.  6.22
#10 ets    2010 Q4 t(sample[5])  483.  6.16
# … with 50 more rows