R purr:将精度映射到预测对象和返回精度

时间:2018-07-26 23:07:44

标签: r

我无法弄清楚如何将准确度指标从小标题中的预测对象中提取出来。这是两个预测​​对象返回precision()的简单示例:

# create 2 forecast objects
stl.fcast <- AirPassengers %>% stl(s.window="periodic") %>% forecast(h = 12)
ets.fcast <- AirPassengers %>% ets() %>% forecast(h = 12)

# now get the accuracy
accuracy(stl.fcast) # returns accuracy metrics on stl.fcast
accuracy(ets.fcast) # returns accuracy metrics on ets.fcast

enter image description here

太棒了。我有准确性。现在,我尝试使用purr / dplyr方法执行相同的操作,以遍历多个模型并将结果存储在小标题中。

models_list <- list(
  ets = list(y = AirPassengers), 
  stl = list(x = AirPassengers, t.window=NULL, s.window="periodic", robust=TRUE))

models_tbl <- enframe(models_list, name = "f", value = "params") %>% 
  mutate(fit = invoke_map(f, params)) %>% 
  mutate(fcast = map(fit, forecast, h = 12))

models_tbl # print tibble

太好了,除了精度指标外,我的桌子上还有我需要的所有东西

enter image description here

现在,当我尝试为表'models_tbl'中的每个预测对象创建一个包含准确性的新列时,我得到NULL。

models_tbl %>% 
transmute(acc = map(fcast, accuracy)) # RETURNS NULL

Returns-> tibble:2 x 1,#应该返回2行精度。

我该如何完成?理想情况下,我可以将这些准确性指标解析为许多列,以便可以通过其准确性指标轻松比较所有模型。谢谢!

1 个答案:

答案 0 :(得分:2)

由于accuracy为小标题中的每一行返回一个7列的矩阵,因此使用mutate(或transmute)语句将这些列附加到小标题可能很棘手。如果您希望将包含准确性指标的7列添加到小标题中,则可以执行以下操作:

library(magrittr)
models_tbl %$% 
  map(fcast, accuracy) %>% 
  plyr::ldply() %>% 
  cbind(models_tbl, .) %>% 
  as.tibble

# A tibble: 2 x 11
# f       params     fit       fcast           ME    RMSE  MAE    MPE   MAPE  MASE   ACF1
# <chr>   <list>     <list>    <list>          <dbl> <dbl> <dbl>  <dbl> <dbl> <dbl>  <dbl>
# 1 ets   <list [1]> <S3: ets> <S3: forecast>  1.57   10.7  7.79  0.436  2.86 0.243 0.0395
# 2 stl   <list [4]> <S3: stl> <S3: forecast> -0.577  21.6 14.4  -0.395  5.18 0.451 0.226 

上面使用的%$%运算符通过管道传递变量的子对象。因此models_tbl %$% map(fcast, accuracy)map(models_tbl$fcast, accuracy)相同。同样,table(mtcars$gear, mtcars$carb)mtcars %$% table(gear, carb)等,

plyr::ldply()连接(rbind)列表中的所有数据框或矩阵。由于map返回矩阵列表,因此需要ldply来组合所有矩阵。

最后,cbind将准确性度量附加到原始表中。