Obtenção de valores previstos (Y = 1 ou 0) a partir de um ajuste do modelo de regressão logística

50

Digamos que eu tenho um objeto de classe glm(correspondente a um modelo de regressão logística) e gostaria de transformar as probabilidades previstas fornecidas predict.glmusando o argumento type="response"em respostas binárias, ou seja, ou Y = 0 . Qual é a maneira mais rápida e canônica de fazer isso no R?Y=1Y=0

Embora, mais uma vez, eu estou ciente predict.glm, eu não sei onde exatamente o valor de corte vive - e eu acho que este é o meu principal obstáculo aqui.P(Yi=1|X^i)

tetragrammaton
fonte

Respostas:

77

Depois de ter as probabilidades previstas, cabe a você qual limite você gostaria de usar. Você pode escolher o limite para otimizar a sensibilidade, a especificidade ou qualquer outra medida que seja mais importante no contexto do aplicativo (algumas informações adicionais seriam úteis aqui para obter uma resposta mais específica). Você pode examinar as curvas ROC e outras medidas relacionadas à classificação ideal.

Edit: Para esclarecer um pouco esta resposta, vou dar um exemplo. A resposta real é que o ponto de corte ideal depende de quais propriedades do classificador são importantes no contexto do aplicativo. Deixe- ser o verdadeiro valor de observação I , e Y i ser a classe previsto. Algumas medidas comuns de desempenho sãoYiiY^i

(1) Sensibilidade: - a proporção de '1 do que estejam correctamente identificados como tal.P(Y^i=1|Yi=1)

P(Y^i=0|Yi=0)

P(Yi=Y^i)

(1) também é chamado de Taxa Positiva Verdadeira, (2) também é chamado de Taxa Negativa Verdadeira.

(1,1)

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

δ(1,1)

Abaixo está um exemplo simulado usando previsão de um modelo de regressão logística para classificar. O ponto de corte é variado para ver qual ponto de corte fornece o "melhor" classificador em cada uma dessas três medidas. Neste exemplo, os dados vêm de um modelo de regressão logística com três preditores (consulte o código R abaixo da plotagem). Como você pode ver neste exemplo, o ponto de corte "ideal" depende de qual dessas medidas é mais importante - isso depende totalmente da aplicação.

P(Yi=1|Y^i=1)P(Yi=0|Y^i=0)

insira a descrição da imagem aqui

# 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"))
Macro
fonte
2
(+1) Resposta muito boa. Eu gosto do exemplo. Você conhece uma interpretação pronta para motivar o uso da distância euclidiana que você deu? Eu também acho que pode ser interessante ressaltar neste contexto que a curva ROC é essencialmente obtida fazendo uma modificação post hoc da estimativa de interceptação do modelo logístico.
cardeal
@ Cardinal, eu sei que os limiares para classificação binária geralmente são escolhidos com base em qual ponto da curva ROC é o mais próximo de (1,1) - distância euclidiana foi arbitrariamente a definição padrão de "distância" no meu exemplo
Macro
Eu vejo. Eu pensei que poderia haver uma interpretação intuitiva dessa quantidade em termos de modelo subjacente que eu não estava vendo. (Talvez haja [?])
cardeal
δ
R