如何在Statsmodels中使用自定义误差进行SARIMAX模拟?
解决SARIMAX自定义误差模拟多路径的问题
问题根源
SARIMAX的simulate方法对measurement_shocks和state_shocks的维度要求与ETSModel不同:当指定repetitions时,冲击数组的形状需要是(repetitions, nsimulations),而非你当前的(20,1000)(即(nsimulations, repetitions))。同时,若要完全控制误差来源,需显式固定state_shocks为0,避免状态更新的随机干扰。
解决方案步骤
- 调整自定义误差的维度:将你的(20,1000)误差数组转置为(1000,20),匹配
repetitions×nsimulations的要求。 - 固定状态冲击为0:设置
state_shocks=0,确保状态更新过程无随机误差,仅使用自定义的测量误差生成路径。 - 调用simulate方法:传入调整后的参数,即可生成1000条使用自定义误差的模拟路径。
修改后的代码示例
from statsmodels.tsa.statespace.sarimax import SARIMAX import numpy as np # 假设你已拟合好model,且自定义误差数组为custom_errors(形状(20,1000)) custom_errors = np.random.normal(0, 1, (20, 1000)) # 示例误差数组 # 转置误差数组为(repetitions, nsimulations) adjusted_errors = custom_errors.T # 形状变为(1000,20) # 获取初始状态 initial = model.predicted_state[:, -1] # 执行模拟:固定state_shocks为0,传入调整后的测量误差 simulation = model.simulate( nsimulations=20, anchor='end', repetitions=1000, initial_state=initial, measurement_shocks=adjusted_errors, state_shocks=0 )
结果验证
模拟结果的每条路径(simulation[:, :, i]对应第i条路径)应等于模型的预测均值(model.get_forecast(steps=20).predicted_mean)加上对应的自定义误差(custom_errors[:, i]),因为状态更新无随机干扰,仅测量环节加入了你指定的误差。
内容的提问来源于stack exchange,提问作者SuperFluo
相关产品推荐
相关产品推荐

