2025, Dec 18 09:02

Как исправить ValueError в SVAR statsmodels из‑за np.nan в матрице A

Разбираем ValueError в SVAR statsmodels при np.nan в матрице A: причина в ограничениях. Покажем рабочее решение с заполнителем 'E' и пример кода оценки модели.

Оценка структурной векторной авторегрессии (SVAR) в Python обычно проходит без сложностей — пока внезапно не перестаёт. Частая преграда проявляется как ValueError со строкой: “zero-size array to reduction operation maximum which has no identity”. Если это всплывает при построении SVAR в statsmodels с пользовательской матрицей A, причина нередко кроется в том, как задана матрица ограничений.

Воспроизводимый пример: как проявляется ошибка

Минимальный пример ниже приводит к сбою на этапе fit, если в матрице A есть значения np.nan.

import pandas as pd
import numpy as np
from statsmodels.tsa.vector_ar.svar_model import SVAR
ts_data = pd.DataFrame(
    {
        'Item_1': np.random.rand(240) * 10000,
        'Item_2': np.random.rand(240) * 10000,
        'Item_3': np.random.rand(240) * 10000
    },
    index=pd.date_range(start='2019-11-16', periods=240, freq='W-SAT')
)
A_bad = np.array([
    [1, 0, 0],
    [np.nan, 1, 0],
    [np.nan, np.nan, 1]
], dtype='U')
svar_bad = SVAR(ts_data, svar_type='A', A=A_bad)
fit_bad = svar_bad.fit(maxlags=4)

Что происходит

Сбой вызывается использованием np.nan внутри матрицы A. В такой конфигурации statsmodels при подгонке выбрасывает ошибку “zero-size array to reduction operation maximum which has no identity”. На практике замена np.nan на ожидаемый маркер воспроизводимо снимает проблему.

Решение: используйте заполнитель 'E' в A

Замена np.nan на обозначение 'E' устраняет ошибку. Пример ниже повторяет настройку выше, но использует значения 'E' и тип данных object для матрицы A.

import pandas as pd
import numpy as np
from statsmodels.tsa.vector_ar.svar_model import SVAR
sample_df = pd.DataFrame(
    {
        'Series_A': np.random.rand(240) * 10000,
        'Series_B': np.random.rand(240) * 10000,
        'Series_C': np.random.rand(240) * 10000
    },
    index=pd.date_range(start='2019-11-16', periods=240, freq='W-SAT')
)
A_fixed = np.array([
    [1, 0, 0],
    ['E', 1, 0],
    ['E', 'E', 1]
], dtype=object)
svar_ok = SVAR(sample_df, svar_type='A', A=A_fixed)
fit_ok = svar_ok.fit(maxlags=4)

В такой конфигурации модель оценивается без возникновения ValueError.

Почему это важно

При построении SVAR матрица ограничений — ключ к идентификации. Казалось бы, незначительная разница в записи элементов может обернуться непонятной численной ошибкой в процессе оценки. Если видите тот же ValueError, проверьте, как закодирована матрица A — это часто экономит время. Полезно также быстро просматривать фактическое поведение кода: печать форм, типов и промежуточных значений, а ещё сохранять полный текст ошибки и traceback — в них обычно есть подсказки, выходящие за рамки заголовка исключения.

Выводы

Если подгонка SVAR падает с “zero-size array to reduction operation maximum which has no identity” при использовании np.nan в матрице A, замените эти записи на 'E' и задайте тип матрицы object, как показано выше. Эта правка воспроизводимо устраняет проблему и возвращает процесс оценки в рабочее русло. При отладке проверяйте, что на самом деле лежит в ваших переменных, и всегда сохраняйте полный вывод об ошибке — так диагностика идёт быстрее. Когда матрица ограничений задана последовательно, statsmodels выполняет оценивание SVAR как ожидается.