Python中SVAR模型拟合报错:形状不匹配问题排查
SVAR模型构建报错排查与正确实现方案
报错原因
你遇到的shape mismatch错误核心是SVAR输入对象错误:你传入的svarinput是协方差矩阵,但statsmodels的SVAR类要求输入是已拟合的VAR模型对象(即VAR.fit()的返回结果),而非直接传入协方差矩阵。这导致模型无法获取时序数据、滞后阶数等必要信息,进而引发维度不匹配问题。
正确构建流程
由于你的变量存在协整关系(已通过Johansen检验确认),有两种合规的结构模型构建路径:
路径1:基于差分平稳序列构建SVAR
先对非平稳变量做差分得到平稳序列,再拟合VAR后构建SVAR:
import numpy as np import statsmodels.api as sm from statsmodels.tsa.api import VAR, SVAR # 假设diff_data是原始数据差分后的平稳数据集 var_model = VAR(diff_data) var_fit = var_model.fit(maxlags=1, ic='aic') # 对应你选定的滞后阶数1 # 定义A型约束矩阵(与你原设定一致) A = np.array([ [1, 0, 0, 0, 0, 0], # Housing Index [0, 1, 0, 0, 0, 0], # Policy Rate [0, 1, 1, 0, 0, 0], # Mortgage Rates [0, 0, 0, 1, 0, 0], # Inflation [0, 0, 0, 0, 1, 0], # Household Debt [0, 0, 0, 0, 0, 1] # Covered Bonds ]) # 构建并拟合SVAR svar_model = SVAR(var_fit, svar_type='A', A=A) svar_results = svar_model.fit()
路径2:构建结构误差修正模型(SVECM,更适合协整变量)
当变量存在协整关系时,SVECM是更严谨的选择,直接基于已拟合的VECM构建:
from statsmodels.tsa.vector_ar.vecm import VECM, SVECM # 假设original_data是原始非平稳数据集,coint_rank为Johansen检验得到的协整秩 vecm_model = VECM(original_data, k_ar_diff=1, coint_rank=你的协整秩) vecm_fit = vecm_model.fit() # 定义约束矩阵 A = np.array([ [1, 0, 0, 0, 0, 0], [0, 1, 0, 0, 0, 0], [0, 1, 1, 0, 0, 0], [0, 0, 0, 1, 0, 0], [0, 0, 0, 0, 1, 0], [0, 0, 0, 0, 0, 1] ]) # 构建并拟合SVECM svecm_model = SVECM(vecm_fit, svar_type='A', A=A) svecm_results = svecm_model.fit()
结果可视化方法
脉冲响应函数(IRF)
# 生成10期脉冲响应 irf = svar_results.irf(10) # 绘制所有变量的脉冲响应图 irf.plot(orth=False) # orth=False使用结构冲击,True为正交化冲击 # 单独绘制住房指数对担保债券冲击的响应 irf.plot(impulse=5, response=0) # impulse=5对应担保债券,response=0对应住房指数
预测误差方差分解(FEVD)
# 生成10期方差分解 fevd = svar_results.fevd(10) # 绘制方差分解图 fevd.plot() # 查看住房指数的方差分解详情 print(fevd.decomp[:, :, 0]) # 维度:期数 × 冲击变量 × 被解释变量(住房指数)
关键注意事项
- 约束矩阵必须符合经济理论:你的当前约束中,抵押贷款利率受政策利率影响是合理的,但所有约束都需要理论支撑,避免随意设定。
- 协整秩必须匹配:使用SVECM时,协整秩需与Johansen检验结果一致,否则模型结果失真。
- 平稳性处理:原始变量非平稳且存在协整时,不可直接用原始数据拟合VAR,必须用VECM或差分后的平稳序列。
内容的提问来源于stack exchange,提问作者Hassan Dia
相关产品推荐
相关产品推荐

