2025, Nov 26 03:04

Доступ к R2 и метрикам в pyfixest: tidy vs summary

Пошагово показываем, как в pyfixest на Python получить R2, число наблюдений и другие метрики не из tidy(), а из атрибутов модели Feols. Пример кода и ссылки.

Извлечение диагностик модели в Python обычно кажется простым — пока не попробуете сделать это в библиотеке, которая ставит на первое место статистическую точность, а не удобные сводки. Типичный пример — pyfixest: в итоговом отчёте регрессии видны все нужные числа, но далеко не все из них легко получить программно для дальнейшей обработки. Через tidy() пользователи получают аккуратные таблицы коэффициентов, однако такие базовые показатели, как R‑квадрат и число наблюдений, неочевидно вытащить напрямую из обученного объекта.

Минимальный пример, показывающий проблему

Нижеследующий рабочий процесс запускает OLS с кластеризованной инференцией и выводит стандартный summary вместе с аккуратной таблицей коэффициентов. Диагностика, видимая в напечатанном выводе, доступна в tidy() не вся.

import pyfixest as fx

fit = fx.feols(model_expr, data_slice, vcov={"CRV1": "gvkey + dyear"})
print(fit.summary())
coef_table = fit.tidy()

В напечатанном выводе есть блоки вроде Estimation: OLS, общее число Observations и нижний колонтитул с RMSE и R2, тогда как tidy() сосредоточен на коэффициентах, их стандартных ошибках и тестах.

Что на самом деле происходит

В этой схеме tidy() намеренно ограничен результатами на уровне коэффициентов. Это удобно для объединения оценок или их визуализации, но глобальные статистики качества подгонки туда не входят. В то же время summary() формирует человекочитаемый отчёт с общими метриками, однако этот текст не предназначен для структурированного извлечения.

Ключевой момент: часть диагностик доступна не через tidy(), а прямо на самом обученном объекте. В частности, значения R2 можно получить из атрибута, описанного в документации класса модели.

Решение

R2 читается напрямую из обученного объекта. Используйте атрибут, указанный разработчиками библиотеки, и обращайтесь к справочнику атрибутов объекта, чтобы увидеть другие доступные поля.

Справка: атрибуты объекта Feols перечислены здесь: Feols attributes.

import pyfixest as fx

fit = fx.feols(model_expr, data_slice, vcov={"CRV1": "gvkey + dyear"})

# Человекочитаемый вывод
print(fit.summary())

# Структурированные коэффициенты
coef_table = fit.tidy()

# Программный доступ к R‑квадрату
r2_value = fit._r2
print(r2_value)

Если нужно понять, как напечатанный summary получает и форматирует элементы вроде Observations или RMSE, изучите реализацию, которую используют summary() и tidy(). Соответствующие исходники открыты: форматирование summary() реализовано здесь: summarize.py, а tidy() определён здесь: feols_.py. Список атрибутов объекта модели — это каноничное место, где видно, что уже доступно для прямого обращения.

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

Эффективные диагностики модели — это не косметика, а основа надёжных конвейеров. Когда такие метрики, как R2, можно получать программно, их легко логировать, проверять и передавать в мониторинговые дашборды без хрупкого парсинга. Чёткое разделение между форматированными сводками, таблицами коэффициентов и атрибутами модели помогает избегать тупиков при интеграции эконометрических моделей в рабочие процессы с данными.

Выводы

Используйте tidy() для результатов на уровне коэффициентов. За глобальными статистиками качества обращайтесь напрямую к атрибутам модели, включая R2 через fit._r2, как показано выше. Если сомневаетесь, откуда берётся то или иное значение, загляните в реализации summary() и tidy() и в официальный перечень атрибутов. Добавьте небольшой фрагмент кода для извлечения диагностик в свои стартовые скрипты — это сэкономит время и уберёт двусмысленности в продакшене.