在R中如何从带傅里叶季节性的TSLM模型生成正确预测结果
错误原因
你的问题来自两个核心问题:
- 模型自变量传入不全:你的TSLM模型包含
trend和傅里叶项两类自变量,但构造newdata时仅传入了傅里叶项,缺失未来10期对应的trend取值。forecast函数找不到trend的新值时,会默认调用训练期的55组自变量数据,因此返回55个训练集拟合值而非预测值,同时报出行数不匹配的警告。 - 无需额外调整傅里叶项列名:
fourier()函数生成的周期项默认列名与TSLM模型训练时生成的自变量列名一致,只要和trend变量同步传入即可正常匹配。
正确实现代码
# 模型拟合(原有代码可正常使用) decompose_df <- tslm(fish_ts ~ trend + fourier(fish_ts, K=26)) # 构造未来10期的预测自变量集合 h <- 10 # 生成未来10期的傅里叶项 future_fourier <- fourier(fish_ts, K=26, h=h) # 生成未来10期对应的trend取值(训练集共55个样本,未来trend从56到65) future_trend <- seq(length(fish_ts)+1, length(fish_ts)+h) # 拼接为完整的newdata newdata <- cbind(data.frame(trend = future_trend), future_fourier) # 生成预测结果,输出为10个预测值 fish_fcst <- forecast(decompose_df, newdata = newdata)
额外注意事项
你的样本量仅55个(仅覆盖1.06个52周周期),选择K=26等价于使用全量季节哑变量拟合,存在较高过拟合风险,小样本场景下建议改用AICc准则筛选K值,可有效降低过拟合概率。
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

