使用Michael Foley时序教程绘制ETS模型预测图时purrr::map_dbl报错
解决purrr::map_dbl()返回长度0的报错问题
问题原因
你运行代码时触发的map_dbl()报错,是因为fable包版本更新后,forecast()返回的结果结构发生了变化——原来的代码试图从Exports列里提取sigma值,但现在这个路径已经不存在了,导致pluck()返回空值,map_dbl()要求每个元素返回长度为1的结果,空值(长度0)就触发了错误。
两种解决办法
办法1:从模型对象中正确提取sigma
直接从训练好的mdl_ses模型里提取sigma值,而不是从预测结果的列中查找:
mdl_ses_fc <- mdl_ses %>% forecast(h = 5) %>% mutate(sigma = mdl_ses$fit[[1]]$sigma, ci_025 = qnorm(.025, .mean, sigma), ci_975 = qnorm(.975, .mean, sigma))
办法2:用fable自带函数生成置信区间(更推荐)
fable内置了hilo()函数,专门用于生成预测的置信区间,无需手动计算,代码更简洁且不易出错:
mdl_ses_fc <- mdl_ses %>% forecast(h = 5) %>% hilo(level = 95) %>% unpack_hilo("95%")
执行后会自动生成lower_95%和upper_95%两列,对应95%置信区间的上下限。
完整可运行代码
library(tidyverse) library(lubridate) library(patchwork) # arranging plots library(glue) library(tsibble) library(feasts) # feature extraction and statistics library(fable) # forecasting library(tsibbledata) tsibbledata::global_economy %>% filter(Country == "Algeria") %>% ggplot(aes(x = Year, y = Exports)) + geom_line() + theme_light() + labs(title = "Algerian exports (% of GDP) show no trend or seasonality.") mdl_ses <- tsibbledata::global_economy %>% filter(Country == "Algeria") %>% model(ETS(Exports ~ error("A") + trend("N") + season("N"))) mdl_ses %>% report() gg_tsresiduals(mdl_ses) # 使用办法2的修正代码 mdl_ses_fc <- mdl_ses %>% forecast(h = 5) %>% hilo(level = 95) %>% unpack_hilo("95%")
内容的提问来源于stack exchange,提问作者Filby
相关产品推荐
相关产品推荐

