Python statsmodels库MarkovAutoregression初始化报错及正确用法咨询
报错原因
initialize_known、initialize为MarkovAutoregression类的实例方法,仅可通过该类的实例对象调用,直接使用类名调用会触发缺少self参数的报错。initialize_known方法的probabilities参数要求传入长度等于状态数k_regimes的一维数组,代表初始时刻属于各个状态的概率,你传入的2×2数组为转移概率矩阵,不符合参数要求。
正确使用步骤
情况1:仅设置初始状态归属概率
如果只是要指定初始时刻属于各个状态的概率,按以下顺序编写代码:
# 1. 准备输入数据、实例化模型 residuals = bcox(ARCH['residuals']) SWARCH_model = MarkovAutoregression( residuals, k_regimes=2, order=0, switching_ar=True, switching_variance=True, switching_exog=False ) # 2. 用模型实例调用初始化方法,传入初始状态概率(示例为初始时刻80%概率属于状态0,20%属于状态1) init_state_prob = np.array([0.8, 0.2]) SWARCH_model.initialize_known(probabilities=init_state_prob, tol=1e-08) # 3. 拟合模型 SWARCH = SWARCH_model.fit()
情况2:同时自定义初始转移矩阵、AR系数、方差等全部参数
如果你预先通过HMM拟合得到了完整的初始参数(包括转移矩阵、各状态的方差、AR系数等),需要在调用fit方法时通过start_params参数传入,示例如下:
# 示例:2状态、order=0、切换方差和AR的场景,start_params结构参考 # 参数顺序:转移概率参数 → 各状态均值 → 各状态AR系数 → 各状态方差 init_trans_mat = np.array([[0.8, 0.2], [0.2, 0.8]]) # 转移矩阵转成statsmodels要求的非冗余参数形式:2状态下为[log(P00/P01), log(P11/P10)] trans_params = np.log(init_trans_mat.diagonal() / init_trans_mat[:, ::-1].diagonal()) init_mean = np.array([0, 0]) # 两个状态的均值 init_ar_params = np.array([0.1, 0.3]) # 两个状态的AR系数 init_var = np.array([0.5, 1.2]) # 两个状态的方差 # 拼接完整初始参数 start_params = np.concatenate([trans_params, init_mean, init_ar_params, init_var]) # 实例化模型后拟合时传入初始参数 SWARCH_model = MarkovAutoregression( bcox(ARCH['residuals']), k_regimes=2, order=0, switching_ar=True, switching_variance=True, switching_exog=False ) SWARCH = SWARCH_model.fit(start_params=start_params)
补充说明
initialize方法是用来设置初始状态概率的通用方法,支持的初始化策略包括'steady-state'(稳态概率)、'diffuse'(漫反射初始化)等,调用方式和initialize_known一致,都是先实例化模型再调用:
# 示例:用稳态概率作为初始概率 SWARCH_model.initialize('steady-state')
内容的提问来源于stack exchange,提问作者Angelo Manna
相关产品推荐
相关产品推荐

