如何解决R中forecast()函数无法识别xts对象日期索引的问题?
问题
使用xts格式的时间序列数据(索引为UTC日期),用autoplot()绘制原始数据时x轴显示正常日期,但用Arima()建模后使用forecast()生成的预测结果,再用autoplot()绘制时x轴显示虚拟索引而非实际日期。相关代码如下:
rm(list=ls()) library(ggplot2) library(tseries) library(xts) library(forecast) set.seed(2023) sample_ts = as.data.frame(rnorm(69)) sample_ts$dates = seq(from = as.Date("2017/1/1"), to = as.Date("2022/9/1"), by = "month") sample_ts = xts(sample_ts$`rnorm(69)`, order.by = sample_ts$dates) # autplot生成x轴为日期的正确图表 autoplot(sample_ts) # 示例拟合Arima(3,0,1)模型 ARIMA_sample = Arima( sample_ts, order = c(3, 0, 1), include.drift = T) forecast = forecast(ARIMA_sample, h=24) # autplot使用虚拟索引作为x轴 autoplot(forecast) +autolayer(forecast, showgap = F) # 查看数据结构 str(ARIMA_sample$x) str(forecast$x)
原始数据图:x轴为2017年1月至2022年9月的月份日期,y轴为随机数值,曲线随时间波动。
预测图:x轴显示为1到93的虚拟索引,而非后续的月份日期,无法直观看到预测的时间区间。
解决方法
问题根源在于forecast()处理xts对象时,会丢失原始的日期索引信息,将其转换为普通的时间序列对象(ts类型)。可通过以下两种方式修复:
方法1:手动为预测结果添加日期索引
提取原始数据的最后一个日期,生成后续h步的日期序列,再将预测结果转换为xts对象绘图:
# 生成预测期的日期序列 last_date = index(sample_ts)[length(sample_ts)] forecast_dates = seq(last_date, by = "month", length.out = 24 + 1)[-1] # 跳过最后一个原始日期 # 将预测结果转换为xts对象 forecast_xts = xts( data.frame( mean = forecast$mean, lower = forecast$lower[,2], upper = forecast$upper[,2] ), order.by = forecast_dates ) # 绘制包含原始数据和预测结果的图表 autoplot(sample_ts) + autolayer(forecast_xts$mean, series = "预测值") + autolayer(forecast_xts$lower, series = "95%下限", linetype = "dashed") + autolayer(forecast_xts$upper, series = "95%上限", linetype = "dashed") + labs(x = "日期", y = "数值", title = "时间序列预测") + theme_minimal()
方法2:使用tsibble格式替代xts
forecast包对tsibble类型的时间序列支持更好,可自动保留日期索引:
library(tsibble) # 将xts转换为tsibble sample_tsibble = as_tsibble(sample_ts, rename_index = "date") # 拟合Arima模型 ARIMA_sample = Arima( sample_tsibble, order = c(3, 0, 1), include.drift = T ) # 生成预测并绘图 forecast = forecast(ARIMA_sample, h=24) autoplot(forecast) + autolayer(forecast, showgap = F)
这种方法无需手动处理日期,autoplot()会自动显示正确的日期x轴。
内容的提问来源于stack exchange,提问作者ruben zwaan
相关产品推荐
相关产品推荐

