运行Vector Autoregression代码遇正定数组错误,如何解决?
解决VAR模型中数组非正定的错误问题
问题重现
运行以下代码时,在var_model.select_order(max_lag)行抛出5-th leading minor of the array is not positive definite错误:
from statsmodels.tsa.vector_ar.var_model import VAR max_lag = 20 # occ_data是一个52584行×5列的dataframe var_model = VAR(occ_data) # 选择最优滞后阶数 lag_results = var_model.select_order(max_lag) selected_lag = lag_results.aic print(selected_lag)
数据样例(occ_data):
BGT North of NE 70th Total Ped South Ped North Bike North Bike South Date 2014-01-01 00:00:00 0.002665 0.000243 0.000186 -1.901329e-05 0.002255 2014-01-01 01:00:00 -5.997088 1.000224 -1.999776 -1.000000e+00 -3.997536 2014-01-01 02:00:00 0.002912 -0.999776 0.000224 -1.000000e+00 2.002464 2014-01-01 03:00:00 10.002912 0.000224 0.000224 4.260205e-09 10.002464 2014-01-01 04:00:00 0.002912 0.000224 0.000224 4.260205e-09 0.002464 ... ... ... ... ... ... 2019-12-31 19:00:00 -7.997536 -2.000000 -4.999104 1.000896e+00 -1.999328 2019-12-31 20:00:00 -3.997536 -2.000000 -0.999104 -9.991039e-01 0.000672 2019-12-31 21:00:00 1.002464 1.000000 2.000896 8.960573e-04 -1.999328 2019-12-31 22:00:00 -1.997536 -1.000000 -1.999104 8.960573e-04 1.000672 2019-12-31 23:00:00 1.002464 1.000000 0.000896 1.000896e+00 -0.999328
错误原因
该错误说明VAR模型计算时依赖的协方差矩阵不是正定矩阵,通常由以下情况导致:
- 变量间存在严重多重共线性(高度相关特征)
- 数据存在奇异值或数值精度问题
- 样本信息不足以支撑5维变量的VAR模型估计
解决方法
1. 处理多重共线性
计算变量相关系数矩阵,删除高度相关的变量:
# 计算相关系数矩阵 corr_matrix = occ_data.corr() # 打印矩阵,找出相关系数绝对值大于0.9的变量对 print(corr_matrix) # 示例:删除高度相关的Bike North列 occ_data = occ_data.drop(columns=['Bike North'])
2. 给数据添加小扰动
通过给数据添加极小噪声,强制协方差矩阵变为正定:
import numpy as np from statsmodels.tsa.vector_ar.var_model import VAR # 给数据添加极小高斯噪声 epsilon = 1e-6 occ_data_noisy = occ_data + np.random.normal(0, epsilon, occ_data.shape) # 用加噪后的数据重新构建模型 var_model_noisy = VAR(occ_data_noisy) lag_results = var_model_noisy.select_order(max_lag) selected_lag = lag_results.aic print(selected_lag)
3. 数据标准化处理
对数据进行标准化,减少数值尺度差异带来的稳定性问题:
from sklearn.preprocessing import StandardScaler import pandas as pd scaler = StandardScaler() occ_data_scaled = scaler.fit_transform(occ_data) # 转换回DataFrame并保留原索引 occ_data_scaled = pd.DataFrame(occ_data_scaled, index=occ_data.index, columns=occ_data.columns) # 重新构建模型 var_model_scaled = VAR(occ_data_scaled) lag_results = var_model_scaled.select_order(max_lag) selected_lag = lag_results.aic print(selected_lag)
4. 降低模型维度
使用PCA将5维变量压缩到更低维度,再构建VAR模型:
from sklearn.decomposition import PCA import pandas as pd pca = PCA(n_components=4) # 压缩到4维 occ_data_pca = pca.fit_transform(occ_data) occ_data_pca = pd.DataFrame(occ_data_pca, index=occ_data.index) # 重新构建模型 var_model_pca = VAR(occ_data_pca) lag_results = var_model_pca.select_order(max_lag) selected_lag = lag_results.aic print(selected_lag)
内容的提问来源于stack exchange,提问作者Max Melichov
相关产品推荐
相关产品推荐

