VAR模型训练遇LinAlgError:数组第6阶顺序主子式非正定
VAR模型训练报错
LinAlgError: 6-th leading minor of the array is not positive definite的原因分析 问题背景
我生成了名为new_new_dfs的DataFrame列表,各表为不同Coupon(利率)的债券证券(抵押贷款组合)月度差分Single Month Mortality(SMM)数据,行列数略有差异。使用以下代码为每个DataFrame训练向量自回归(VAR)模型:
for df in new_new_dfs: train = df[df.index <= max(df.index) - relativedelta(months = 3)] test = df[df.index > max(df.index) - relativedelta(months = 3)] train = train.dropna() if train.empty is False and len(train) > 10 and len(list(train.columns)) > 1: model = VAR(train) result = model.fit() result.summary()
已跳过空DataFrame,检查了行列数以确保适配VAR模型,但处理到第11个左右的DataFrame时,出现报错:LinAlgError: 6-th leading minor of the array is not positive definite。尝试打印对应的trainDataFrame排查,但无法确定问题所在,恳请分析原因。
核心原因
这个报错的本质是VAR模型拟合时依赖的协方差矩阵(或相关矩阵)不满足正定要求,具体到你的场景,可能是以下情况之一:
- 变量间严重共线性:第11个DataFrame的训练集中,至少6个变量存在高度线性相关(比如某几个SMM差分序列几乎完全同步变动)。VAR模型需要对协方差矩阵求逆,共线性会让矩阵接近奇异,导致计算失败。
- 样本量相对变量数不足:虽然设置了
len(train) > 10,但如果该DataFrame的变量数较多(比如≥6个),10个样本远不足以支撑稳定的协方差矩阵估计,容易导致矩阵非正定。 - 数据方差异常:某个或某几个变量的差分数据方差几乎为0(比如该Coupon对应的SMM长期无变动,差分后全是0或接近0),这会让协方差矩阵的对角线元素趋近于0,破坏矩阵的正定性质。
- 数值精度问题:数据的数值量级差异过大,或者计算过程中出现浮点数精度损失,导致协方差矩阵的特征值出现负数或近似0的情况,触发非正定报错。
排查与解决建议
- 针对第11个DataFrame,计算训练集的相关系数矩阵,查看是否有变量间相关系数接近±1的情况,若有则剔除高度相关的变量。
- 统计该训练集的样本量和变量数:如果变量数≥样本量,直接跳过这个模型训练,或者合并/剔除部分变量后再尝试。
- 检查每个变量的方差:若某变量方差远小于其他变量,考虑剔除该变量,或者对所有变量做标准化处理。
- 尝试在拟合前对数据做标准化/归一化,减少数值精度问题的影响;或者在
model.fit()中添加ic='aic'参数,让模型自动选择最优滞后阶数,避免高阶滞后加剧共线性问题。
内容的提问来源于stack exchange,提问作者hulio_entredas
相关产品推荐
相关产品推荐

