在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
相关产品推荐
相关产品推荐

