如何通过statsmodels状态空间模型获取样本内外状态估计?
用statsmodels状态空间模型获取样本内外状态估计的方法
核心思路
基于训练集拟合得到的模型参数,将模型扩展到全样本数据(训练+测试),通过卡尔曼滤波或平滑方法获取样本内外的状态估计,无需重新拟合模型。
具体方法与代码示例
假设已完成训练集拟合,得到res_spx(MLEResults类型对象),训练集数据为y_train,测试集为y_test,全样本数据y_full = pd.concat([y_train, y_test])。若模型包含外生变量,需同步准备全样本外生变量exog_full。
方法1:获取全样本滤波/预测状态(不利用测试集观测修正样本内)
使用get_prediction方法覆盖全样本范围,样本内输出滤波状态(仅用当前及之前观测),样本外输出预测状态(基于训练集末尾状态向前推算):
# 指定全样本范围,可传入索引位置或时间标签(若数据带时间索引) pred_full = res_spx.get_prediction(start=0, end=len(y_full)-1) # 若用时间索引:pred_full = res_spx.get_prediction(start=y_train.index[0], end=y_full.index[-1]) # 提取状态估计结果 state_full_pred = pred_full.predicted_state
方法2:获取全样本滤波状态(用测试集观测逐步更新)
通过extend方法将测试集数据追加到模型,重新运行卡尔曼滤波,样本外每一步都会用新观测更新状态:
# 扩展模型的内生变量(若有外生变量,同步追加:res_spx.model.extend(exog=exog_test)) res_spx.model = res_spx.model.extend(endog=y_test) # 运行滤波得到全样本结果 filter_results = res_spx.filter() # 提取滤波后的状态:样本内为原训练集滤波结果,样本外为逐步更新后的状态 state_full_filter = filter_results.filtered_state
方法3:获取全样本平滑状态(利用所有观测修正所有状态)
如果需要事后最优的状态估计(用全样本观测包括测试集回溯修正所有状态),使用smooth方法:
# 更新模型的内生变量为全样本数据(若有外生变量,赋值为res_spx.model.exog = exog_full) res_spx.model.endog = y_full # 运行平滑算法 smooth_results = res_spx.smooth() # 提取平滑后的状态,包含样本内和样本外的事后最优估计 state_full_smooth = smooth_results.smoothed_state
关键说明
- 滤波状态:仅使用当前及之前的观测计算,适合实时状态估计场景;
- 预测状态:不使用测试集观测,仅基于训练集末尾状态推算,适合纯预测场景;
- 平滑状态:使用全部观测(包括测试集)回溯修正所有状态,适合事后分析场景;
- 若模型包含外生变量,需确保扩展后的外生变量维度与全样本内生变量完全匹配。
内容的提问来源于stack exchange,提问作者vincent6
相关产品推荐
相关产品推荐

