forecast包与手动转换计算RMSE结果差异过大的问题排查
为什么两种RMSE计算结果差这么多?
这个问题的核心是时间序列的顺序错位,咱们一步步拆解原因和解决方法:
1. 最关键的问题:实际值和预测值的时间点没对齐
当你把ts对象转成数值向量时,两者的顺序完全不匹配:
- 你用
tail(ausbeer,20)提取的实际值,顺序是:2005Q1 → 2005Q2 → 2006Q1 → 2006Q2 → ... - 而
forecast(fit, h=20)$mean的预测值,顺序是:2005Q2 → 2006Q1 → 2006Q2 → 2006Q3 → ...
你可以对比输出结果:预测值的第一个元素对应2005Q2的实际值,但手动计算时你把它和2005Q1的实际值配对了——所有数据都错位了一位,这直接导致RMSE飙升到51.98。
2. Box-Cox变换的自动处理(这部分没问题)
你在auto.arima里指定了lambda=0,这会对训练数据做对数变换建模,但不用慌:forecast()函数会自动对预测结果做反变换(指数变换),所以forecast(fit, h=20)$mean已经是原始尺度的预测值,accuracy()函数也是基于反变换后的结果计算RMSE的,这部分没有问题。
修正后的手动计算代码
要解决这个问题,你需要确保实际值和预测值的时间点完全对齐,最好用window()函数精准提取测试集:
# 提取和预测时间点完全匹配的测试集(从2005Q2开始,共20个季度) test_set <- window(ausbeer, start=c(2005,2)) test_actuals <- as.numeric(test_set) test_preds <- as.numeric(forecast(fit, h=20)$mean) # 现在计算RMSE就会和accuracy()的结果一致 Metrics::rmse(test_actuals, test_preds)
运行这段代码后,手动计算的RMSE应该会和accuracy()输出的8.581624完全一致。
内容的提问来源于stack exchange,提问作者William Chiu
相关产品推荐
相关产品推荐

