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

R时间序列报错:'start'不能晚于'end',求窗口end值确定方法

问题分析与解决

首先看报错'start' cannot be after 'end'的直接原因:

  • 你把训练集的起始年份写错成了1991,但AirPassengers的时间范围是1949-1960,这直接导致start远晚于end,触发错误。
  • 另外,AirPassengers是ts(时间序列)对象,它的时间索引是yearmon类型,不是Date类型,用as.Date()转换会打乱时间逻辑,这也是导致end参数异常的原因。
  • 循环里还存在变量名错误:定义的训练集是in.sample,但拟合模型时用了未定义的train.ts。

正确的end参数确定方式

对于ts类型的时间序列,要使用与原序列一致的时间格式(年+月)来指定window的start和end。具体到滚动预测的场景,每次迭代的训练集应该包含到out.sample第i个观测值的前一个时间点,也就是用time(out.sample)[i] - 1/12(因为是月度数据,1/12代表一个月)来作为end参数。

修正后的代码

library(forecast)

# 查看数据范围
AirPassengers

# 划分初始训练集和测试集
in.sample_init <- window(AirPassengers, start = c(1949, 1), end = c(1958, 12))
out.sample <- window(AirPassengers, start = c(1959, 1), end = c(1960, 12))

# 初始化结果容器
hw_forecast <- numeric(length(out.sample))
# 用yearmon类型存储时间,和原序列一致
time_fcast <- time(out.sample)

# 滚动预测循环
for (i in seq_along(out.sample)) {
  # 确定当前训练集的结束时间:测试集第i个点的前一个月
  train_end <- time(out.sample)[i] - 1/12
  # 生成当前训练集
  current_train <- window(AirPassengers, start = c(1949, 1), end = train_end)
  # 拟合HW模型
  fit <- hw(current_train, seasonal = "additive")
  # 一步超前预测
  fore1 <- forecast(fit, h = 1)
  # 存储预测值
  hw_forecast[i] <- fore1$mean
}

# 查看结果
data.frame(实际值 = out.sample, 预测值 = hw_forecast, 时间 = time_fcast)

关键调整点说明

  • 修正了训练集起始年份的笔误,从1991改为1949。
  • 用time(out.sample)[i] - 1/12来获取前一个月的时间索引,完美匹配ts对象的时间格式,避免start>end的错误。
  • 修正了变量名错误,将train.ts改为current_train(对应循环里的训练集)。
  • 用yearmon类型存储时间,保持和原序列一致,避免Date类型转换的问题。

内容的提问来源于stack exchange,提问作者ebrahimi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 05:00:11