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