R语言SSM状态空间模型协变量预测报错求助
状态空间模型(SSM)协变量预测销售的报错解决
第一个报错原因与解决方向
Model contains time varying system matrices, cannot use argument 'n.ahead'. Use 'newdata' instead.
你的模型包含SSMregression模块,协变量energy_tr是随时间变化的序列,导致系统矩阵具有时变性。n.ahead参数仅适用于系统矩阵固定的模型(如纯趋势/季节模型),时变矩阵的预测必须通过newdata传入未来的协变量数据,这是框架的硬性要求。
第二个报错原因与修正方案
System matrices (excluding Z) contain NA or infinite values, covariance matrices contain values larger than 1e+07
你创建newdata时,重新将所有模型参数(Q、H等)设为NA,但训练好的model_ssm已经包含了估计完成的参数值。newdata不需要重新声明模型结构和待估参数,只需传入未来的协变量和占位用的NA因变量即可,否则系统会因参数缺失报错。
修正后的代码示例
1. 测试集模型性能评估
假设测试集协变量为energy_te,长度与y_test一致:
# 构造测试集newdata,复用训练模型的参数 newdata_test <- SSModel(rep(NA, length(y_test)) ~ SSMtrend(2, Q = model_ssm$Q) + SSMregression(~ energy_te, Q = model_ssm$Q[3:3, 3:3]) + SSMseasonal(period = 12, sea.type = "dummy", Q = model_ssm$Q[4:15, 4:15]), H = model_ssm$H) # 生成测试集预测结果 pred_test <- predict(model_ssm, interval = "prediction", level = 0.90, newdata = newdata_test, filtered = TRUE) # 计算评估指标(MAE、RMSE) mae <- mean(abs(y_test - pred_test$fit)) rmse <- sqrt(mean((y_test - pred_test$fit)^2))
2. 不同场景的未来销售预测
针对未来场景(如通胀下降对应的协变量序列):
scenario <- read_excel("path") energy_new <- log(scenario$energy_basecase) # 场景对应的协变量序列 # 构造场景预测的newdata,复用训练好的模型参数 newdata_scenario <- SSModel(rep(NA, length(energy_new)) ~ SSMtrend(2, Q = model_ssm$Q) + SSMregression(~ energy_new, Q = model_ssm$Q[3:3, 3:3]) + SSMseasonal(period = 12, sea.type = "dummy", Q = model_ssm$Q[4:15, 4:15]), H = model_ssm$H) # 生成场景下的销售预测 pred_scenario <- predict(model_ssm, interval = "prediction", level = 0.90, newdata = newdata_scenario, filtered = TRUE)
关键注意事项
newdata的模型结构(趋势阶数、季节周期、回归项数量)必须与训练模型完全一致,否则会出现维度不匹配错误。model_ssm$Q是训练后得到的状态协方差矩阵,按顺序对应:趋势项(前2x2)、回归项(第3行/列)、季节项(剩余12x12),提取时需注意索引正确。若不确定维度,可先用dim(model_ssm$Q)查看。
内容的提问来源于stack exchange,提问作者SannedeHaan2000
相关产品推荐
相关产品推荐

