使用fpp2进行预测:时间序列结果转日期的技术问询
解决fpp2预测后丢失原始日期列的问题
这个问题在使用传统ts对象处理带具体日期的时间序列时很常见——因为ts本身并不存储原始的日期字符串,只保留了基于年份和频率的时间索引。这里有两种靠谱的解决方法,看你更倾向哪种:
方法1:用tsibble保留完整日期信息(推荐)
tsibble是专门为时间序列设计的 tidy 数据结构,能完美兼容fpp2的所有预测工具,同时全程保留你的原始日期列。步骤如下:
- 安装并加载
tsibble包 - 将原始数据转换为
tsibble,指定date为时间索引 - 拟合模型并生成预测,结果会自动包含日期信息
# 加载所需包 library(fpp2) library(tsibble) # 你的原始周度数据 wks <- tibble( date = as.Date(c("2016-01-04", "2016-01-11", "2016-01-18")), wk = 1:3, y = c(2500, 2530, 2600) ) # 转换为tsibble(确保时间序列是规则的,若有缺失日期可自动补全) wks_tsbl <- wks %>% as_tsibble(index = date, regular = TRUE) %>% fill_gaps() # 拟合ETS模型并预测未来4周 fit <- wks_tsbl %>% model(ETS(y)) fc <- fit %>% forecast(h = 4) # 查看预测结果,日期列完整保留 print(fc)
方法2:手动给预测结果补全日期列
如果你习惯继续使用ts对象,可以在预测后手动生成对应日期,再和原始数据合并:
library(fpp2) library(tibble) library(dplyr) # 原始数据 wks <- tibble( date = as.Date(c("2016-01-04", "2016-01-11", "2016-01-18")), wk = 1:3, y = c(2500, 2530, 2600) ) # 转换为ts对象 wks_ts <- ts(wks$y, start = 2016, freq = 52) # 拟合模型并生成预测 fit <- ets(wks_ts) fc <- forecast(fit, h = 4) # 生成预测对应的日期:从原始最后一个日期开始,每周递增7天 last_date <- max(wks$date) fc_dates <- seq(last_date + 7, by = "week", length.out = length(fc$mean)) # 把预测结果整理成带日期的数据框 fc_df <- tibble( date = fc_dates, wk = max(wks$wk) + 1:length(fc$mean), y_pred = fc$mean, lower_80 = fc$lower[, "80%"], upper_80 = fc$upper[, "80%"] ) # 合并原始数据和预测数据(可选) combined_data <- bind_rows( wks %>% select(date, wk, value = y), fc_df %>% select(date, wk, value = y_pred) ) print(combined_data)
问题根源说明
当你用ts(wks$y, start = 2016, freq = 52)转换数据时,生成的ts对象本质是一个带时间属性的数值向量——它只记录了起始年份(2016)、每年的周期数(52周),完全丢失了原始的date列信息。因此后续预测结果也只会延续这个“年份+周数”的索引,无法自动关联回具体日期。
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

