Comment calculer les erreurs types des coefficients d'une régression logistique

18

J'utilise scikit-learn de Python pour former et tester une régression logistique.

scikit-learn renvoie les coefficients de régression des variables indépendantes, mais il ne fournit pas les erreurs standard des coefficients. J'ai besoin de ces erreurs standard pour calculer une statistique de Wald pour chaque coefficient et, à son tour, comparer ces coefficients les uns aux autres.

J'ai trouvé une description de la façon de calculer les erreurs standard pour les coefficients d'une régression logistique ( ici ), mais elle est quelque peu difficile à suivre.

Si vous connaissez une explication simple et succincte de la façon de calculer ces erreurs standard et / ou pouvez m'en fournir une, j'apprécierais vraiment! Je ne parle pas d'un code spécifique (bien que n'hésitez pas à publier tout code qui pourrait être utile), mais plutôt une explication algorithmique des étapes impliquées.

Gyan Veda
la source
1
Demandez-vous du code Python pour obtenir les erreurs standard ou comment les SE sont calculés (mathématiquement / algorithmiquement) pour que vous puissiez le faire vous-même? Si le premier, ce Q serait hors sujet pour CV (voir notre centre d'aide ), mais peut être sur le sujet sur Stack Overflow . Si c'est le cas, ce serait sur le sujet ici (mais vous pourriez ne pas avoir de suggestions de code). Veuillez modifier votre Q pour clarifier cela. Si c'est le premier, nous pouvons le migrer vers SO pour vous ( veuillez ne pas faire de cross-post, cependant ).
gung - Réintégrer Monica
1
Merci, Gung. J'ai volontairement posté ici parce que j'attends ce dernier, mais je vais éditer pour clarifier. J'ai mentionné que je travaillais en Python avec scikit-learn au cas où quelqu'un qui utilise ce logiciel pourrait me donner des conseils spécifiques.
Gyan Veda
Salut @GyanVeda, je fais face au même problème maintenant, quelle est votre solution finale, s'il vous plaît?
zyxue

Réponses:

12

Votre logiciel vous donne-t-il une matrice de covariance des paramètres (ou variance-covariance)? Si c'est le cas, les erreurs standard sont la racine carrée de la diagonale de cette matrice. Vous voudrez probablement consulter un manuel (ou google pour les notes de cours universitaires) pour savoir comment obtenir la matrice pour les modèles linéaires et linéaires généralisés.Vβ

utilisateur_générique
la source
1
Je n'ai rien trouvé en ligne pour le cas du modèle linéaire généralisé (peut-être que je ne connais pas les bons termes de recherche?). Aidez-moi?
Kevin H. Lin,
3
En voici un que j'ai trouvé après quelques minutes de recherche sur Google. Mon conseil est de comprendre d'abord comment la variance des paramètres est calculée dans un modèle linéaire de base. Une fois que vous obtenez cela, l'extension aux GLM est plus facile. Tout de même, savoir comment le calculer et savoir comment l'obtenir dans un progiciel ne sont pas la même chose. www.sagepub.com/upm-data/21121_Chapter_15.pdf
generic_user
18

Les erreurs standard des coefficients du modèle sont les racines carrées des entrées diagonales de la matrice de covariance. Considérer ce qui suit:

  • Matrice de conception:

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

(REMARQUE: cela suppose un modèle avec une interception.)

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

La matrice de covariance peut s'écrire:

(XTVX)1

Cela peut être implémenté avec le code suivant:

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)

Tout cela étant dit, ce statsmodelssera probablement un meilleur package à utiliser si vous voulez accéder à BEAUCOUP de diagnostics "prêts à l'emploi".

j_sack
la source
2
Pour éviter les problèmes de mémoire et pour tenir compte du cas de matrice singulière, vous pouvez mettre à jour votre code comme suit -V = np.product(predProbs, axis=1); covLogit = np.linalg.pinv(np.dot(X_design.T * V), X_design)
regularfish
6

Si vous êtes intéressé à faire de l'inférence, alors vous voudrez probablement jeter un œil aux modèles de statistiques . Des erreurs standard et des tests statistiques communs sont disponibles. Voici un exemple de régression logistique .

jseabold
la source
Merci pour la recommandation! J'examinerai les modèles de statistiques. Dommage que scikit-learn ne fournisse pas ce type de sortie.
Gyan Veda
1
Ouais. Ce n'est généralement pas l'objectif des boîtes à outils de type apprentissage automatique de fournir des outils pour les tests d'hypothèses (fréquentistes). Si vous rencontrez des contraintes de taille de données qui ne fonctionnent pas bien dans les modèles de statistiques mais fonctionnent dans scikit-learn, je serais intéressé d'en entendre parler sur github.
jseabold
@jseabold Cependant, si vous souhaitez obtenir une notion ad hoc de l'importance des fonctionnalités dans la régression logistique, vous ne pouvez pas simplement lire les tailles d'effet (les coefficients) sans penser à leurs erreurs standard. Donc, même si vous ne faites pas de test fréquentiste et que vous voulez juste une indication de la taille et de la robustesse des effets, l'absence de sortie de variance sklearn est difficile.
ely