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

在R中用tsCV()结合tslm()做时间序列交叉验证遇NA问题

问题分析与解决

你的代码返回全NA的核心原因有两个,结合tsCV的工作原理逐一拆解:

1. forecast时的newdata格式错误

tslm训练的模型依赖明确的变量名,你在训练时用了公式y ~ X,但预测时直接传入向量作为newdata——forecast.tslm无法识别这个向量对应模型中的哪个变量,导致预测值全为NA,最终交叉验证的误差也全是NA。

2. 小样本模型拟合失效

当训练集长度小于模型所需的最小样本量(这里y ~ X需要至少2个观测值才能估计截距和斜率),tslm无法输出有效参数,对应预测值也会是NA。不过这只会影响前几行结果,不会导致全部NA,所以是次要问题。

修正后的代码

y = ts(rnorm(336), frequency=12)
pred <- ts(rnorm(length(y)), start=start(y), frequency=frequency(y))

fc <- function(y, h, xreg) {
  if(NROW(xreg) < length(y) + h)
    stop("Not enough xreg data for forecasting")
  
  # 将训练用自变量转为带列名的数据框,匹配模型公式中的变量名
  train_xreg <- data.frame(X = xreg[seq_along(y)])
  fit <- tslm(y ~ X, data = train_xreg)
  
  # 预测用自变量同样转为数据框,保证变量名一致
  test_xreg <- data.frame(X = xreg[length(y) + seq(h)])
  forecast(fit, newdata = test_xreg)
}

# 运行交叉验证,默认h=1(单步预测)
result <- tsCV(y, fc, xreg=pred)
# 查看结果(前1行因样本量不足为NA,后续行有有效误差值)
head(result, 20)

关于tsCV的补充说明

tsCV的逻辑是滚动验证:

  • 从训练集长度k=1开始,逐步增加到k=length(y)-h
  • 每次用前k个观测值训练模型,预测接下来h个值
  • 计算实际值与预测值的差值作为误差,最终返回误差矩阵

如果需要多步预测,只需在调用tsCV时指定h参数(比如tsCV(y, fc, xreg=pred, h=3))。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 05:37:33