You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 16:57:35