我对多重时间序列非常陌生,我正在尝试制作一个具有108个预测变量和1个目标变量的VAR模型。在执行 Johansen协整测试时,出现错误
LinAlgError: Matrix is not positive definite
我的代码是:
def cointegration_test(df, alpha=0.05):
"""Perform Johanson's Cointegration Test and Report Summary"""
out = coint_johansen(df,-1,5)
d = {'0.90':0, '0.95':1, '0.99':2}
traces = out.lr1
cvts = out.cvt[:, d[str(1-alpha)]]
def adjust(val, length= 6): return str(val).ljust(length)
# Summary
print('Name :: Test Stat > C(95%) => Signif \n', '--'*20)
for col, trace, cvt in zip(df.columns, traces, cvts):
print(adjust(col), ':: ', adjust(round(trace,2), 9), ">", adjust(cvt, 8), ' => ' , trace > cvt)
cointegration_test(g)
其中 g 是我的时间序列数据框,形状为(48行×109列)。行是日期时间索引,列是预测变量/变量。
几列中的数据从0-1(例如:消费者价格指数)到其他数百万(例如:人口,GDP)。
数据框中的列也包含负数(例如:就业变化)
很少有列中也包含零
但是当我使用
使所有列 stationary 固定后传递数据框时g = g.diff().dropna().diff().dropna()
,然后将差异数据帧传递给cointegration_test
,其错误值为:
LinAlgError: Matrix is not positive definite
据我所知Matrix is not positive definite
表示与之相关的本征值是非正的。本征值仅适用于方阵,但鉴于我要提供的数据是非本征,正方形...
如何解决此问题?我下一步应该去哪里?不胜感激。
谢谢
答案 0 :(得分:1)
如前所述,矩阵必须是nxn维。因此,您基本上需要的是:
最后,您可以尝试使用Python下一个代码实现,它是上面链接中功能的改编:
def to_positive_definitive(M):
M = np.matrix(M)
M = (M + M.T) * 0.5
k = 1
I = np.eye(M.shape[0])
w, v = np.linalg.eig(M)
min_eig = v.min()
M += (-min_eig * k * k + np.spacing(min_eig)) * I
return M
def validate_positive_definitive(M):
try:
np.linalg.cholesky(M)
except np.linalg.LinAlgError:
M = to_positive_definitive(M)
#Print the eigenvalues of the Matrix
print(np.linalg.eigvalsh(p))
return M
M = validate_positive_definitive(M)
print(M)