Statsmodels动态因子模型混频数据即时预测无更新问题问询
Statsmodels DynamicFactor 混频数据即时预测无更新问题排查
问题背景
使用statsmodels的DynamicFactor模型分析混频数据:包含2个月度变量(x1、x2)和1个季度变量(y),y仅在3、6、9、12月有观测值,其余月份为NaN。操作流程如下:
- 先用截至11月的数据估计模型,得到12月y的即时预测值
- 加入12月的x1、x2数据(y仍为NaN)后,重新预测12月的y,结果与之前完全一致
- 按逻辑,月度变量的更新应该会影响潜在因子的估计,进而改变y的即时预测,但实际未发生变化,需要排查是statsmodels的混频处理局限还是代码逻辑疏漏
可复现代码
import numpy as np import pandas as pd import statsmodels.api as sm from statsmodels.tsa.statespace.dynamic_factor import DynamicFactor # 构造模拟混频数据 dates = pd.date_range(start='2020-01-01', end='2023-12-01', freq='MS') n = len(dates) # 生成月度变量x1、x2 x1 = np.random.normal(0, 1, n).cumsum() + np.random.normal(0, 0.5, n) x2 = np.random.normal(0, 1, n).cumsum() + np.random.normal(0, 0.5, n) # 生成季度变量y:仅季度末有值,其余为NaN y = np.full(n, np.nan) quarterly_idx = [i for i, dt in enumerate(dates) if dt.month in [3,6,9,12]] y[quarterly_idx] = (x1[quarterly_idx] + x2[quarterly_idx])/2 + np.random.normal(0, 0.3, len(quarterly_idx)) df = pd.DataFrame({'x1':x1, 'x2':x2, 'y':y}, index=dates) # 1. 基于截至11月的数据拟合模型并预测12月y df_nov = df.loc[:'2023-11-01'] model_nov = DynamicFactor(df_nov, k_factors=1, factor_order=1, error_order=1) results_nov = model_nov.fit(maxiter=1000, disp=False) pred_nov = results_nov.get_prediction(start='2023-12-01', end='2023-12-01') y_pred_nov = pred_nov.predicted_mean['y'].iloc[0] print(f"截至11月模型的12月y预测值:{y_pred_nov:.4f}") # 2. 加入12月月度数据后重新拟合模型并预测 df_dec = df.loc[:'2023-12-01'] model_dec = DynamicFactor(df_dec, k_factors=1, factor_order=1, error_order=1) results_dec = model_dec.fit(maxiter=1000, disp=False) pred_dec = results_dec.get_prediction(start='2023-12-01', end='2023-12-01') y_pred_dec = pred_dec.predicted_mean['y'].iloc[0] print(f"加入12月数据后模型的12月y预测值:{y_pred_dec:.4f}") # 3. 尝试用已有模型参数更新滤波(不重新拟合) results_updated = results_nov.append(df_dec.loc['2023-12-01']) pred_updated = results_updated.get_prediction(start='2023-12-01', end='2023-12-01') y_pred_updated = pred_updated.predicted_mean['y'].iloc[0] print(f"更新滤波后的12月y预测值:{y_pred_updated:.4f}")
原因分析与解决建议
1. 代码逻辑的常见疏漏
- 模型拟合的初始化问题:重新拟合模型时,如果没有指定合理的初始参数,可能导致模型收敛到与之前完全一致的参数,进而预测结果不变。建议在第二次拟合时,将第一次的结果作为初始参数传入:
model_dec.fit(start_params=results_nov.params, maxiter=1000, disp=False) append()方法的误用:results.append()方法主要用于扩展样本外预测,而非更新样本内的滤波状态。当加入12月的观测数据时,需要手动执行卡尔曼滤波的更新步骤,而不是直接调用append()
2. Statsmodels DynamicFactor的混频处理局限
- 该模型默认将所有变量视为同频(这里是月度),缺失值仅被当作“未观测到的点”,而非“该变量在该频率下无定义”。对于季度变量y,12月的NaN会被模型判定为观测缺失,而非该变量的季度观测点,导致模型在计算y的预测时,可能没有将同期x1/x2的信息纳入条件预测
- 测量方程的默认设定中,y的预测仅依赖于因子的滞后状态,而非更新后的同期因子状态。即使x1/x2更新了因子的估计,y的预测逻辑可能没有同步调用最新的因子值
3. 验证与修复步骤
- 检查潜在因子的更新情况:对比两次模型的滤波后因子值,确认12月的因子是否因x1/x2的数据而变化。如果因子没有变化,说明卡尔曼滤波未正确使用新观测更新状态:
# 查看截至11月模型的最后一个因子估计 factor_nov = results_nov.filtered_state[0, -1] # 查看加入12月数据后的因子估计 factor_dec = results_dec.filtered_state[0, -1] print(f"11月末因子估计值:{factor_nov:.4f},12月因子估计值:{factor_dec:.4f}") - 手动计算y的即时预测:基于更新后的因子值,利用测量方程的载荷参数手动计算y的预测,验证是否与模型输出一致:
loading_y = results_dec.params['loading.y.factor1'] y_pred_manual = loading_y * factor_dec print(f"手动计算的12月y预测值:{y_pred_manual:.4f}") - 自定义混频状态空间模型:如果默认的
DynamicFactor无法满足需求,可以基于statsmodels.tsa.statespace.mlemodel.MLEModel自定义模型,明确设定季度变量的观测频率,确保月度变量的信息能传递到季度变量的预测中
内容的提问来源于stack exchange,提问作者Juan Ruiz Sánchez
相关产品推荐
相关产品推荐

