我无法弄清楚如何将准确度指标从小标题中的预测对象中提取出来。这是两个预测对象返回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
太棒了。我有准确性。现在,我尝试使用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
太好了,除了精度指标外,我的桌子上还有我需要的所有东西
现在,当我尝试为表'models_tbl'中的每个预测对象创建一个包含准确性的新列时,我得到NULL。
models_tbl %>%
transmute(acc = map(fcast, accuracy)) # RETURNS NULL
Returns-> tibble:2 x 1,#应该返回2行精度。
我该如何完成?理想情况下,我可以将这些准确性指标解析为许多列,以便可以通过其准确性指标轻松比较所有模型。谢谢!
答案 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
将准确性度量附加到原始表中。