Ottenere valori previsti (Y = 1 o 0) da un adattamento del modello di regressione logistica


50

Diciamo che ho un oggetto di classe glm(corrispondente a un modello di regressione logistica) e vorrei trasformare le probabilità previste fornite predict.glmutilizzando l'argomento type="response"in risposte binarie, ovvero o . Qual è il modo più rapido e canonico per farlo in R?Y=1Y=0

Mentre, ancora una volta, ne sono a conoscenza predict.glm, non so dove esista esattamente il valore di cutoff - e immagino che questo sia il mio principale ostacolo qui.P(Yi=1|X^i)

Risposte:


77

Una volta che hai le probabilità previste, spetta a te quale soglia desideri utilizzare. Puoi scegliere la soglia per ottimizzare la sensibilità, la specificità o qualsiasi altra misura la più importante nel contesto dell'applicazione (alcune informazioni aggiuntive sarebbero utili qui per una risposta più specifica). Potresti voler esaminare le curve ROC e altre misure relative alla classificazione ottimale.

Modifica: per chiarire un po 'questa risposta, ho intenzione di fare un esempio. La vera risposta è che il taglio ottimale dipende da quali proprietà del classificatore sono importanti nel contesto dell'applicazione. Sia il vero valore per l'osservazione e sia la classe prevista. Alcune misure comuni di prestazione sonoYiiY^i

(1) Sensibilità: - la proporzione di '1 che sono correttamente identificati come tali.P(Y^i=1|Yi=1)

(2) Specificità: - la proporzione di '0 che sono correttamente identificati come taliP(Y^i=0|Yi=0)

(3) Tasso di classificazione (corretto): - la proporzione di previsioni corrette.P(Yi=Y^i)

(1) è anche chiamato True Positive Rate, (2) è anche chiamato True Negative Rate.

Ad esempio, se il tuo classificatore mirava a valutare un test diagnostico per una malattia grave che ha una cura relativamente sicura, la sensibilità è molto più importante della specificità. In un altro caso, se la malattia fosse relativamente minore e il trattamento fosse rischioso, la specificità sarebbe più importante da controllare. Per problemi di classificazione generale, è considerato "buono" ottimizzare congiuntamente la sensibilità e le specifiche - ad esempio, è possibile utilizzare il classificatore che minimizza la loro distanza euclidea dal punto :(1,1)

δ=[P(Yi=1|Y^i=1)1]2+[P(Yi=0|Y^i=0)1]2

δ potrebbe essere ponderato o modificato in un altro modo per riflettere una misura più ragionevole di distanza da nel contesto dell'applicazione - la distanza euclidea da (1,1) è stata scelta qui arbitrariamente a scopo illustrativo. In ogni caso, tutte e quattro queste misure potrebbero essere più appropriate, a seconda dell'applicazione.(1,1)

Di seguito è riportato un esempio simulato che utilizza la previsione da un modello di regressione logistica per classificare. Il cutoff è vario per vedere quale cutoff fornisce il classificatore "migliore" in ciascuna di queste tre misure. In questo esempio i dati provengono da un modello di regressione logistica con tre predittori (vedere il codice R sotto il diagramma). Come puoi vedere da questo esempio, il taglio "ottimale" dipende da quale di queste misure è più importante - dipende interamente dall'applicazione.

Modifica 2: e , il valore predittivo positivo e il valore predittivo negativo (notare che NON sono gli stessi come sensibilità e specificità) possono anche essere utili misure di prestazione.P(Yi=1|Y^i=1)P(Yi=0|Y^i=0)

inserisci qui la descrizione dell'immagine

# data y simulated from a logistic regression model 
# with with three predictors, n=10000
x = matrix(rnorm(30000),10000,3)
lp = 0 + x[,1] - 1.42*x[2] + .67*x[,3] + 1.1*x[,1]*x[,2] - 1.5*x[,1]*x[,3] +2.2*x[,2]*x[,3] + x[,1]*x[,2]*x[,3]
p = 1/(1+exp(-lp))
y = runif(10000)<p

# fit a logistic regression model
mod = glm(y~x[,1]*x[,2]*x[,3],family="binomial")

# using a cutoff of cut, calculate sensitivity, specificity, and classification rate
perf = function(cut, mod, y)
{
   yhat = (mod$fit>cut)
   w = which(y==1)
   sensitivity = mean( yhat[w] == 1 ) 
   specificity = mean( yhat[-w] == 0 ) 
   c.rate = mean( y==yhat ) 
   d = cbind(sensitivity,specificity)-c(1,1)
   d = sqrt( d[1]^2 + d[2]^2 ) 
   out = t(as.matrix(c(sensitivity, specificity, c.rate,d)))
   colnames(out) = c("sensitivity", "specificity", "c.rate", "distance")
   return(out)
}

s = seq(.01,.99,length=1000)
OUT = matrix(0,1000,4)
for(i in 1:1000) OUT[i,]=perf(s[i],mod,y)
plot(s,OUT[,1],xlab="Cutoff",ylab="Value",cex.lab=1.5,cex.axis=1.5,ylim=c(0,1),type="l",lwd=2,axes=FALSE,col=2)
axis(1,seq(0,1,length=5),seq(0,1,length=5),cex.lab=1.5)
axis(2,seq(0,1,length=5),seq(0,1,length=5),cex.lab=1.5)
lines(s,OUT[,2],col="darkgreen",lwd=2)
lines(s,OUT[,3],col=4,lwd=2)
lines(s,OUT[,4],col="darkred",lwd=2)
box()
legend(0,.25,col=c(2,"darkgreen",4,"darkred"),lwd=c(2,2,2,2),c("Sensitivity","Specificity","Classification Rate","Distance"))

2
(+1) Risposta molto bella. Mi piace l'esempio Esiste una pronta interpretazione che conosci per motivare l'uso della distanza euclidea che hai dato? Penso anche che potrebbe essere interessante sottolineare in questo contesto che la curva ROC è essenzialmente ottenuta facendo una modifica post hoc della stima dell'intercetta del modello logistico.
cardinale

@Cardinal, so che le soglie per la classificazione binaria sono spesso scelte in base a quale punto della curva ROC è più vicino a (1,1) - la distanza euclidea era arbitrariamente la definizione predefinita di "distanza" nel mio esempio
Macro

Vedo. Ho pensato che ci potesse essere un'interpretazione intuitiva di questa quantità in termini di modello sottostante che non stavo vedendo. (Forse c'è [?])
cardinale

Forse è perché ho scoperto che le curve di sensibilità e specificità si intersecano nello stesso posto in cui è minimizzato ...δ
Macro

Non ho un terminale da usare al momento, ma mi chiedo se l'effetto che stai vedendo sia probabilmente dovuto in parte al fatto che la tua simulazione dovrebbe generare un numero approssimativamente uguale di risposte 0 e 1. Se si varia la proporzione di quelli, la relazione è ancora valida? R
cardinale
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.