Come calcolare gli errori standard dei coefficienti di regressione logistica


18

Sto usando lo scikit-learning di Python per allenare e testare una regressione logistica.

scikit-learn restituisce i coefficienti di regressione delle variabili indipendenti, ma non fornisce gli errori standard dei coefficienti. Ho bisogno di questi errori standard per calcolare una statistica Wald per ciascun coefficiente e, a loro volta, confrontare questi coefficienti tra loro.

Ho trovato una descrizione di come calcolare gli errori standard per i coefficienti di una regressione logistica ( qui ), ma è piuttosto difficile da seguire.

Se ti capita di conoscere una spiegazione semplice e succinta di come calcolare questi errori standard e / o puoi fornirmi uno, lo apprezzerei davvero! Non intendo un codice specifico (anche se non esitate a pubblicare qualsiasi codice che potrebbe essere utile), ma piuttosto una spiegazione algoritmica dei passaggi coinvolti.


1
Stai chiedendo il codice Python per ottenere gli errori standard o come vengono calcolati gli SE (matematicamente / algoritmicamente) in modo da poterlo fare da solo? Se il primo, questo Q sarebbe fuori tema per CV (consultare il nostro centro assistenza ), ma potrebbe essere in argomento su StackTranslate.it . In quest'ultimo caso, sarebbe in argomento qui (ma potresti non ricevere alcun suggerimento sul codice). Modifica la tua Q per chiarire questo. Se è il primo, possiamo migrarlo su SO per te (per favore non fare il cross-post, però ).
gung - Ripristina Monica

1
Grazie Gung. Ho intenzionalmente pubblicato qui perché mi aspetto quest'ultimo, ma lo modificherò per chiarire. Ho detto che sto lavorando in Python con scikit-learn nel caso in cui qualcuno che utilizza questo software possa darmi consigli specifici.
Gyan Veda,

Ciao @GyanVeda, sto affrontando lo stesso problema ora, qual è la tua soluzione finale, per favore?
zyxue,

Risposte:


12

Vβ


1
Non sono stato in grado di trovare nulla online per il caso del modello lineare generalizzato (forse non conosco i termini di ricerca corretti?). Aiuto?
Kevin H. Lin,

3
Eccone uno che ho trovato dopo alcuni minuti di ricerca su Google. Il mio consiglio è di capire innanzitutto come viene calcolata la varianza dei parametri in un modello lineare di base. Una volta ottenuto ciò, l'estensione di GLM è più semplice. Tuttavia, sapere come calcolarlo e sapere come ottenerlo in un pacchetto software non sono la stessa cosa. www.sagepub.com/upm-data/21121_Chapter_15.pdf
generic_user

18

Gli errori standard dei coefficienti del modello sono le radici quadrate delle voci diagonali della matrice di covarianza. Considera quanto segue:

  • Matrice del design:

X = [1X1,1...X1,p1X2,1...X2,p1Xn,1...Xn,p]Xio,jjio

(NOTA: questo presuppone un modello con un'intercettazione.)

  • V = [π^1(1-π^1)0...00π^2(1-π^2)...000...π^n(1-π^n)]π^ioio

La matrice di covarianza può essere scritta come:

(XTVX)-1

Questo può essere implementato con il seguente codice:

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)

Tutto ciò che verrà detto, statsmodelssarà probabilmente un pacchetto migliore da utilizzare se si desidera accedere a MOLTE diagnosi "out-of-the-box".


2
Per evitare problemi di memoria e per tenere conto del caso della matrice singolare, è possibile aggiornare il codice come segue -V = np.product(predProbs, axis=1); covLogit = np.linalg.pinv(np.dot(X_design.T * V), X_design)
steadyfish

6

Se sei interessato a fare l'inferenza, allora probabilmente vorrai dare un'occhiata a statsmodels . Sono disponibili errori standard e test statistici comuni. Ecco un esempio di regressione logistica .


Grazie per la raccomandazione! Esaminerò gli statsmodels. Peccato che scikit-learn non fornisca questo tipo di output.
Gyan Veda,

1
Si. Di solito non è l'obiettivo delle cassette degli attrezzi di tipo machine learning fornire strumenti per test di ipotesi (frequentisti). Se ti imbatti in vincoli di dimensioni dei dati che non funzionano bene in statsmodels ma funzionano in scikit-learn, sarei interessato a sentirli su Github.
jseabold

@jseabold Tuttavia, se si desidera ottenere alcune nozioni ad hoc sull'importanza delle funzionalità nella regressione logistica, non si può semplicemente leggere le dimensioni dell'effetto (i coefficienti) senza pensare ai loro errori standard. Quindi, anche se non stai facendo un test frequentista e vuoi solo qualche indicazione sulle dimensioni degli effetti e sulla robustezza, la mancanza sklearn di varianza è difficile.
ely,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.