R语言小时级交通流短时间序列简单指数平滑建模及预测问题
解决SES处理小时级交通流时间序列的问题
针对你遇到的报错、时间格式识别以及替代方法需求,我整理了一步步的解决方案:
一、修复forecast步长冲突报错
你碰到的Error in forecast.forecast(fit_Model_SES, h = 653),核心原因是ses()拟合时未提前指定预测步长,后续调用forecast()时参数冲突。其实ses()是ets()的简化版(对应ETS(A,N,N)无趋势无季节模型),用ets()处理会更灵活稳定:
# 用ets()显式指定ANN模型(对应简单指数平滑) fit_ets <- ets(training_data, model = "ANN") # 直接指定预测步长为测试集长度 forecast_SES <- forecast(fit_ets, h = 653)
这样就不会再出现步长相关的报错了。
二、解决小时级时间格式丢失/识别错误问题
1. 避免ts对象丢失小时信息
如果一定要用ts对象,不能直接传入时间字符串,需要把时间转换为年+小数的数值格式:
# 将起始时间转成年份+小数的形式(比如2017-07-17 00:00对应≈2017.537) start_decimal <- as.numeric(as.POSIXct("2017-07-17 00:00:00")) / (3600*24*365) + 1970 # 小时级数据frequency设为8760(一年的小时数),保留时间精度 ses_ts <- ts(SES_Data$Traffic_Flow, frequency = 8760, start = start_decimal)
2. 用xts实现和ARIMA一致的绘图效果
更推荐继续用xts对象,只需给预测结果手动绑定测试集的时间索引,就能让绘图时间轴和ARIMA对齐:
# 拟合模型 fit_ets <- ets(training_data, model = "ANN") forecast_SES <- forecast(fit_ets, h = 653) # 给预测结果的各部分绑定测试集的时间索引 forecast_SES$mean <- xts(forecast_SES$mean, order.by = index(test_data)) forecast_SES$lower <- xts(forecast_SES$lower, order.by = index(test_data)) forecast_SES$upper <- xts(forecast_SES$upper, order.by = index(test_data)) # 现在绘图就能和ARIMA的时间格式完全匹配了 plot(forecast_SES, main = "SES交通流预测", xlab = "时间", ylab = "交通流量") lines(test_data, col = "red") # 叠加测试集真实值方便对比
三、可与ARIMA对比的短时间序列预测方法
既然是无趋势无季节的短序列,以下几种方法适合做对比基准:
- 朴素预测法(Naive):直接用训练集最后一个观测值作为所有预测值,是最简单的基准模型,用
forecast::naive()实现 - 简单移动平均(SMA):取最近k个观测值的平均值做预测,用
forecast::sma()实现 - Theta模型:专门针对短时间序列设计,对平稳数据表现稳定,用
forecast::thetaf()实现 - Prophet:Facebook的时间序列模型,自带完善的时间格式处理,即使平稳数据也能快速拟合,适合跨模型对比
四、额外小技巧
如果你的ARIMA模型是用forecast::auto.arima()拟合的,可把两个模型的预测图放在同一张画布对比:
# 假设已得到ARIMA预测结果forecast_ARIMA par(mfrow = c(2,1)) plot(forecast_ARIMA, main = "ARIMA交通流预测", col = "green") plot(forecast_SES, main = "SES交通流预测", col = "blue")
内容的提问来源于stack exchange,提问作者Reta
相关产品推荐
相关产品推荐

