R语言中用For循环向向量追加auto.arima预测值的问题
解决R中auto.arima滚动预测的索引错误问题
问题原因
你遇到的incorrect number of dimensions错误主要来自两个点:
- R语言的索引从1开始,而非0,原代码中
0+(i*24)会生成无效的起始索引,导致切片逻辑错误。 - 时间序列对象切片时若索引异常,可能返回多维结构,触发维度不匹配的报错。
修正后的代码
结合你提供的示例数据,以下是可正常运行的滚动预测代码:
library(forecast) # 加载示例时间序列数据 dfts <- structure(c(28.78, 28.45, 27.9, 27.52, 27.54, 26.55, 25.83, 25.07, 25.65, 26.15, 26.77, 27.4, 28.08, 28.69, 29.37, 29.97, 30.46, 30.39, 30.06, 29.38, 27.65, 27.33, 25.88, 24.81, 12.07, 13.13, 19.07, 21.12, 24.29, 26.27, 27.74, 28.39, 29.37, 29.95, 29.91, 29.96, 29.94, 29.94, 30.18, 30.96, 31.2, 30.98, 30.35, 29.27, 28.17, 28.02, 27.69, 24.39, 18.93, 9.98, 1.53, 0.14, 0.85, 9.92, 24.48, 26.68, 28.12, 28.58, 28.16, 28.78, 28.31, 28.44, 28.96, 29.86, 30.15, 30.07, 29.54, 29.11, 27.91, 27.03, 25.7, 22.04, 21.73, 15.95, 16.23, 6.45, 3.83, 4.03, 4.04, 19.07, 17.49, 24.18, 24.94, 25.11, 24.94, 24.95, 25.25, 26.33, 27.36, 28.88, 29.58, 29.42, 27.71, 27.4, 27.37, 25.77, 26.65, 27.13, 27.11, 27.42), tsp = c(1, 5.125, 24), class = "ts") fc <- c() # 滚动窗口训练预测 for (i in 0:7) { # 计算训练数据的起止索引(遵循R从1开始的规则) train_start <- 1 + i*24 train_end <- 168 + i*24 # 防止索引超出数据范围,提前终止循环 if (train_end > length(dfts)) { warning("训练窗口超出数据长度,终止循环") break } # 提取训练数据,确保为一维结构 train_data <- dfts[train_start:train_end] modArima <- auto.arima(train_data) # 预测并转换为向量,避免维度问题 forecast_result <- forecast(modArima, h=24) forecast_values <- as.vector(forecast_result$mean) fc <- append(fc, forecast_values) } # 查看最终预测向量长度 length(fc)
关键修改说明
- 修正索引逻辑:将起始索引从
0+(i*24)改为1+i*24,符合R的索引规则。 - 添加范围检查:增加索引越界判断,避免因滑动窗口超出数据长度导致的报错。
- 确保一维结构:用
as.vector()转换预测结果,防止时间序列对象的多维特性引发维度错误。 - 避免变量冲突:将变量名
forecast改为forecast_result,防止与forecast包的函数名冲突。
内容的提问来源于stack exchange,提问作者user20050294
相关产品推荐
相关产品推荐

