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

如何解决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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 06:23:11