You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 00:37:26