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

关于预测精度计算中ACF1返回NA值的技术咨询

关于forecast包中测试集ACF1返回NA的原因及解决方法

原因确认

你观察到测试集ACF1返回NA的推测方向是对的,核心原因如下:

  1. ACF1的计算前提:滞后1期自相关需要至少2个连续的同类型残差样本,而你当前得到的测试集误差是多步预测误差——用训练好的模型一次性预测未来6步,这些误差分别对应1步、2步……6步的预测偏差,并非同一预测步长的残差序列,计算它们的自相关性没有统计意义。
  2. forecast包的逻辑:accuracy()函数中,训练集的ACF1是模型拟合产生的一步残差(每个训练观测的实际值减拟合值)的滞后1自相关,用于验证模型是否捕捉了数据的自相关性;但对于测试集的多步预测误差,函数默认不计算无意义的ACF1,因此返回NA。

解决方法

如果需要计算测试集的有效ACF1,需要获取一步滚动预测的残差(每次用已有数据预测下一个观测,滚动更新训练集),再计算该残差序列的ACF1。以下是两种实现方式:

方法1:手动滚动一步预测

require(forecast)

riders <- read.csv('average-monthly-ridership.csv', header = TRUE)
colnames(riders)[colnames(riders) == 'average.monthly.bus.ridership.in.100'] <- 'Riders'
riders <- ts(riders$Riders, start = c(2010,1), frequency = 12) 

h <- 6  # 测试集长度
test_errors <- numeric(h)

# 滚动训练并预测每一步
for(i in 1:h){
  # 取到当前步之前的所有数据作为训练集
  train_data <- head(riders, n = length(riders) - h + i - 1)
  fit <- auto.arima(train_data, seasonal = FALSE)
  # 预测下一步并计算误差
  test_errors[i] <- riders[length(riders) - h + i] - forecast(fit, h=1)$mean[1]
}

# 计算测试集一步残差的ACF1
acf1_test <- cor(test_errors[-1], test_errors[-length(test_errors)])
cat("测试集一步残差ACF1:", acf1_test, "\n")

方法2:使用tsCV函数(更简洁)

require(forecast)

riders <- read.csv('average-monthly-ridership.csv', header = TRUE)
colnames(riders)[colnames(riders) == 'average.monthly.bus.ridership.in.100'] <- 'Riders'
riders <- ts(riders$Riders, start = c(2010,1), frequency = 12) 

# 使用tsCV计算一步预测误差
# h=1表示只做一步预测
e <- tsCV(riders, function(x, h) forecast(auto.arima(x, seasonal=FALSE), h=1)$mean, h=1)

# 提取最后6个测试集的一步误差并去除NA
test_e <- na.omit(tail(e, n=6))

# 计算ACF1(确保样本量≥2)
if(length(test_e) >= 2){
  acf1_test <- cor(test_e[-1], test_e[-length(test_e)])
  cat("测试集一步残差ACF1:", acf1_test, "\n")
} else {
  cat("样本量不足,无法计算ACF1\n")
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 18:05:22