Запуск теста коинтеграции coint_johansen дает: LinAlgError: Матрица не является положительно определенной

Я довольно плохо знаком с многовариантными временными рядами, я пытаюсь создать модель VAR со 108 предикторами и 1 целевой переменной. При выполнении теста коинтеграции Йохансена я получаю сообщение об ошибке

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(например, индекс потребительских цен) и другие в диапазоне миллионов (например, население, ВВП).

  • В кадре данных есть столбцы, которые также содержат отрицательные термины (например: Изменение в занятости)

  • Немногие столбцы также содержат ноль в них

Но когда я передаю датафрейм после того, как все колонки становятся постоянными,

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

а затем передать разностный кадр данных cointegration_test это дает ошибку как:

LinAlgError: Matrix is not positive definite

Насколько мое понимание идет Matrix is not positive definite означает, что собственные значения, связанные с ним, не являются положительными. И собственные значения возможны только для квадратной матрицы, но учитывая, что данные, которые я передаю, не являются квадратными...

Как я могу решить эту проблему? Где мне искать дальше? Буду признателен за любую помощь.

Спасибо

0 ответов

Как вы упомянули, матрица должна быть размерной nxn. Итак, что вам в основном нужно:

  1. Размерная матрица NxN.
  2. Проверьте, положительный ли результат.
  3. В случае сбоя пункта 2 вы можете преобразовать его в Positive Definitive, полезная ссылка: 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)
Другие вопросы по тегам