关于预测精度计算中ACF1返回NA值的技术咨询
关于forecast包中测试集ACF1返回NA的原因及解决方法
原因确认
你观察到测试集ACF1返回NA的推测方向是对的,核心原因如下:
- ACF1的计算前提:滞后1期自相关需要至少2个连续的同类型残差样本,而你当前得到的测试集误差是多步预测误差——用训练好的模型一次性预测未来6步,这些误差分别对应1步、2步……6步的预测偏差,并非同一预测步长的残差序列,计算它们的自相关性没有统计意义。
- 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
相关产品推荐
相关产品推荐

