Cómo calcular los errores estándar de los coeficientes de una regresión logística

18

Estoy usando Pyikon-scikit-learn para entrenar y probar una regresión logística.

scikit-learn devuelve los coeficientes de regresión de las variables independientes, pero no proporciona los errores estándar de los coeficientes. Necesito estos errores estándar para calcular una estadística de Wald para cada coeficiente y, a su vez, comparar estos coeficientes entre sí.

He encontrado una descripción de cómo calcular los errores estándar para los coeficientes de una regresión logística ( aquí ), pero es algo difícil de seguir.

Si conoce una explicación simple y sucinta de cómo calcular estos errores estándar y / o puede proporcionarme uno, ¡realmente lo agradecería! No me refiero a un código específico (aunque no dude en publicar cualquier código que pueda ser útil), sino más bien una explicación algorítmica de los pasos involucrados.

Gyan Veda
fuente
1
¿Está solicitando el código Python para obtener los errores estándar, o cómo se calculan los SE (matemáticamente / algorítmicamente) para que pueda hacerlo usted mismo? Si es lo primero, esta Q estaría fuera de tema para CV (consulte nuestro centro de ayuda ), pero puede estar sobre tema en Stack Overflow . Si es lo último, sería sobre el tema aquí (pero es posible que no obtenga ninguna sugerencia de código). Edite su Q para aclarar esto. Si es lo primero, podemos migrarlo a SO por usted ( sin embargo, no publique mensajes cruzados ).
gung - Restablece a Monica
1
Gracias Gung Publiqué aquí a propósito porque estoy esperando lo último, pero lo editaré para aclararlo. Mencioné que estoy trabajando en Python con scikit-learn en caso de que alguien que use este software pueda darme consejos específicos.
Gyan Veda
Hola @GyanVeda, estoy enfrentando el mismo problema ahora, ¿cuál es tu solución final, por favor?
zyxue

Respuestas:

12

¿Su software le proporciona una matriz de covarianza de parámetros (o varianza-covarianza)? Si es así, los errores estándar son la raíz cuadrada de la diagonal de esa matriz. Probablemente desee consultar un libro de texto (o google para notas de conferencias universitarias) sobre cómo obtener la matriz para modelos lineales y lineales generalizados.Vβ

genérico_usuario
fuente
1
No he podido encontrar nada en línea para el caso del modelo lineal generalizado (¿tal vez no conozco los términos de búsqueda correctos?). ¿Ayuda?
Kevin H. Lin
3
Aquí hay uno que encontré después de unos minutos de googlear. Mi consejo es que primero comprenda cómo se calcula la varianza del parámetro en un modelo lineal básico. Una vez que obtienes eso, la extensión a GLM es más fácil. De todos modos, saber cómo calcularlo y saber cómo obtenerlo en un paquete de software no es lo mismo. www.sagepub.com/upm-data/21121_Chapter_15.pdf
generic_user
18

Los errores estándar de los coeficientes del modelo son las raíces cuadradas de las entradas diagonales de la matriz de covarianza. Considera lo siguiente:

  • Matriz de diseño:

, dondexi,jes el valor dejEl predictor de lasobservacionesi.X = [1X1,1...X1,pag1X2,1...X2,pag1Xnorte,1...Xnorte,pag]Xyo,jjyo

(NOTA: Esto supone un modelo con una intersección).

  • , donde π irepresenta la probabilidad pronosticada de pertenencia a la clase para la observacióni.V = [π^1(1-π^1)0 0...0 00 0π^2(1-π^2)...0 00 00 0...π^norte(1-π^norte)]π^yoyo

La matriz de covarianza se puede escribir como:

(XTVX)-1

Esto se puede implementar con el siguiente código:

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)

Dicho todo esto, statsmodelsprobablemente será un mejor paquete para usar si desea acceder a MUCHOS diagnósticos "listos para usar".

j_sack
fuente
2
Para evitar problemas de memoria y tener en cuenta el caso de matriz singular, puede actualizar su código de la siguiente manera -V = np.product(predProbs, axis=1); covLogit = np.linalg.pinv(np.dot(X_design.T * V), X_design)
steadyfish
6

Si estás interesado en hacer inferencia, entonces probablemente quieras echar un vistazo a los modelos de estadísticas . Los errores estándar y las pruebas estadísticas comunes están disponibles. Aquí hay un ejemplo de regresión logística .

jseabold
fuente
¡Gracias por la recomendación! Examinaré los modelos de estadísticas. Lástima que scikit-learn no proporcione este tipo de salida.
Gyan Veda
1
Si. Por lo general, no es el objetivo de las cajas de herramientas de tipo aprendizaje automático proporcionar herramientas para pruebas de hipótesis (frecuentes). Si se encuentra con restricciones de tamaño de datos que no funcionan bien en los modelos de estadísticas pero sí funcionan en scikit-learn, me interesaría saber de ellos en github.
jseabold
@jseabold Sin embargo, si desea obtener una noción ad hoc de la importancia de la característica en la regresión logística, no puede simplemente leer los tamaños del efecto (los coeficientes) sin pensar en sus errores estándar. Por lo tanto, incluso si no está haciendo una prueba frecuente, y solo desea una indicación de los tamaños del efecto y la robustez, la falta de variación de salida de sklearn es un desafío.
ely