0

我对多变量时间序列很陌生,我正在尝试制作一个具有 108 个预测变量和 1 个目标变量的 VAR 模型。在执行Johansen Cointegration Test时,出现错误

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 rows × 109 columns)。行是日期时间索引,列是预测变量/变量。

  • 几列中的数据范围为 0-1(例如:消费者价格指数)和其他数百万范围内的数据(例如:人口、GDP)。

  • 数据框中的某些列也包含负面术语(例如:就业变化)

  • 很少有列也包含零

但是当我使用使所有列静止后传递数据框时

g = g.diff().dropna().diff().dropna()

然后将差异数据帧传递给cointegration_test其给出的错误:

LinAlgError: Matrix is not positive definite

据我了解Matrix is not positive definite,与它相关的特征值是非正的。特征值仅适用于方阵,但鉴于我提供的数据是非方阵......

我怎么解决这个问题?我接下来应该看哪里?将不胜感激任何帮助。

谢谢

4

1 回答 1

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)
于 2019-12-05T03:31:55.540 回答