Как вычислить стандартные ошибки коэффициентов логистической регрессии

18

Я использую Python Scikit-Learn для обучения и проверки логистической регрессии.

scikit-learn возвращает коэффициенты регрессии независимых переменных, но не предоставляет стандартных ошибок коэффициентов. Мне нужны эти стандартные ошибки для вычисления статистики Вальда для каждого коэффициента и, в свою очередь, для сравнения этих коэффициентов друг с другом.

Я нашел одно описание того, как вычислить стандартные ошибки для коэффициентов логистической регрессии ( здесь ), но это несколько трудно следовать.

Если вам случится знать простое, лаконичное объяснение того, как вычислить эти стандартные ошибки, и / или можете предоставить мне их, я был бы очень признателен! Я имею в виду не конкретный код (хотя, пожалуйста, не стесняйтесь размещать любой код, который может быть полезен), а скорее алгоритмическое объяснение необходимых шагов.

Гьян Веда
источник
1
Вы запрашиваете код Python для получения стандартных ошибок, или для того, как SE вычисляются (математически / алгоритмически), чтобы вы могли сделать это самостоятельно? Если первое, то этот Q будет не по теме для CV (см. Наш справочный центр ), но может быть по теме по переполнению стека . Если последнее, это будет по теме здесь (но вы можете не получить никаких предложений кода). Пожалуйста, измените свой Q, чтобы уточнить это. Если это первое, мы можем перенести его в SO для вас ( пожалуйста, не кросс-пост, хотя ).
gung - Восстановить Монику
1
Спасибо, Гун. Я намеренно разместил здесь, потому что я ожидаю последнего, но я буду редактировать, чтобы уточнить. Я упомянул, что я работаю в Python с scikit-learn на тот случай, если кто-то, кто использует это программное обеспечение, может дать мне конкретные советы.
Гьян Веда
Привет @GyanVeda, я столкнулся с той же проблемой сейчас, каково ваше окончательное решение, пожалуйста?
Zyxue

Ответы:

12

Предоставляет ли ваше программное обеспечение матрицу ковариации параметров (или дисперсии-ковариации)? Если это так, стандартные ошибки - это квадратный корень из диагонали этой матрицы. Вы, вероятно, хотите обратиться к учебнику (или к Google для университетских лекций), чтобы узнать, как получить матрицу для линейных и обобщенных линейных моделей.Vβ

generic_user
источник
1
Я не смог ничего найти в Интернете для случая обобщенной линейной модели (может быть, я не знаю правильных поисковых терминов?). Помогите?
Кевин Х. Лин
3
Вот тот, который я нашел после нескольких минут поиска в Google. Мой совет - сначала понять, как рассчитывается дисперсия параметров в базовой линейной модели. Как только вы это получите, расширение до GLM становится проще. Тем не менее, знание того, как его рассчитать и как получить его в программном пакете, - это не одно и то же. www.sagepub.com/upm-data/21121_Chapter_15.pdf
generic_user 12.12.14
18

Стандартными ошибками коэффициентов модели являются квадратные корни из диагональных элементов ковариационной матрицы. Учтите следующее:

  • Матрица дизайна:

X = [1x1,1x1,p1x2,1x2,p1xn,1xn,p]xi,jji

(ПРИМЕЧАНИЕ: это предполагает модель с перехватом.)

  • V = [π^1(1π^1)000π^2(1π^2)000π^n(1π^n)]π^ii

Ковариационная матрица может быть записана как:

(XTVX)1

Это может быть реализовано с помощью следующего кода:

import numpy as np
from sklearn import linear_model

# Initiate logistic regression object
logit = linear_model.LogisticRegression()

# Fit model. Let X_train = matrix of predictors, y_train = matrix of variable.
# NOTE: Do not include a column for the intercept when fitting the model.
resLogit = logit.fit(X_train, y_train)

# Calculate matrix of predicted class probabilities.
# Check resLogit.classes_ to make sure that sklearn ordered your classes as expected
predProbs = resLogit.predict_proba(X_train)

# Design matrix -- add column of 1's at the beginning of your X_train matrix
X_design = np.hstack([np.ones((X_train.shape[0], 1)), X_train])

# Initiate matrix of 0's, fill diagonal with each predicted observation's variance
V = np.diagflat(np.product(predProbs, axis=1))

# Covariance matrix
# Note that the @-operater does matrix multiplication in Python 3.5+, so if you're running
# Python 3.5+, you can replace the covLogit-line below with the more readable:
# covLogit = np.linalg.inv(X_design.T @ V @ X_design)
covLogit = np.linalg.inv(np.dot(np.dot(X_design.T, V), X_design))
print("Covariance matrix: ", covLogit)

# Standard errors
print("Standard errors: ", np.sqrt(np.diag(covLogit)))

# Wald statistic (coefficient / s.e.) ^ 2
logitParams = np.insert(resLogit.coef_, 0, resLogit.intercept_)
print("Wald statistics: ", (logitParams / np.sqrt(np.diag(covLogit))) ** 2)

Все это, как говорится, statsmodelsвероятно, будет лучшим пакетом для использования, если вы хотите получить доступ к МНОГИМ «готовым» диагностикам.

j_sack
источник
2
Чтобы избежать проблем с памятью и учитывать случай единичных матриц, вы можете обновить свой код следующим образом -V = np.product(predProbs, axis=1); covLogit = np.linalg.pinv(np.dot(X_design.T * V), X_design)
stablefish
6

Если вы заинтересованы в том, чтобы делать выводы, то вам, вероятно, стоит взглянуть на statsmodels . Стандартные ошибки и общие статистические тесты доступны. Вот пример логистической регрессии .

jseabold
источник
Спасибо за рекомендацию! Я посмотрю в statsmodels. Жаль, что scikit-learn не обеспечивает такого рода вывод.
Гьян Веда
1
Да. Обычно целью инструментов машинного обучения не является предоставление инструментов для (частых) проверок гипотез. Если вы столкнетесь с ограничениями размера данных, которые плохо работают в statsmodels, но работают в scikit-learn, мне было бы интересно услышать о них на github.
Jseabold
@jseabold Тем не менее, если вы хотите получить какое-то специальное представление о важности функций в логистической регрессии, вы не можете просто считывать величины эффекта (коэффициенты), не думая об их стандартных ошибках. Таким образом, даже если вы не проводите частый тест и вам просто требуется некоторое представление о размерах эффекта и устойчивости, отсутствие дисперсии склеарна является сложной задачей.
Ely