运行coint_johansen协整测试可得出:LinAlgError:矩阵不是正定的

时间:2019-07-26 18:58:30

标签: python pandas time-series forecasting vector-auto-regression

我对多重时间序列非常陌生,我正在尝试制作一个具有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表示与之相关的本征值是非正的。本征值仅适用于方阵,但鉴于我要提供的数据是非本征,正方形...

如何解决此问题?我下一步应该去哪里?不胜感激。

谢谢

1 个答案:

答案 0 :(得分:1)

如前所述,矩阵必须是nxn维。因此,您基本上需要的是:

  1. NxN维矩阵。
  2. 测试是否为正定性。
  3. 如果第2点失败,则可以将其转换为正定值,有用的链接为https://github.com/Cysu/open-reid/commit/61f9c4a4da95d0afc3634180eee3b65e38c54a14

最后,您可以尝试使用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)