Saída da previsão de regressão logística


14

Eu criei uma regressão logística usando o seguinte código:

full.model.f = lm(Ft_45 ~ ., LOG_D)
base.model.f = lm(Ft_45 ~ IP_util_E2pl_m02_flg)
step(base.model.f, scope=list(upper=full.model.f, lower=~1),
     direction="forward", trace=FALSE)

Em seguida, usei a saída para criar um modelo final:

final.model.f = lm(Ft_45 ~ IP_util_E2pl_m02_flg + IP_util_E2_m02_flg + 
                           AE_NumVisit1_flg + OP_NumVisit1_m01_flg + IP_TotLoS_m02 + 
                           Ft1_45 + IP_util_E1_m05_flg + IP_TotPrNonElecLoS_m02 + 
                           IP_util_E2pl_m03_flg + LTC_coding + OP_NumVisit0105_m03_flg +
                           OP_NumVisit11pl_m03_flg + AE_ArrAmb_m02_flg)

Em seguida, previ os resultados para um conjunto diferente de dados usando a função de previsão:

log.pred.f.v <- predict(final.model.f, newdata=LOG_V)

Consegui usar uma curva ROC agradável e criei uma tabela para estabelecer a sensibilidade e a especificidade que me dão respostas que eu esperaria.

No entanto, o que estou tentando fazer é estabelecer para cada linha de dados qual é a probabilidade de Ft_45 ser 1. Se eu olhar para a saída de log.pred.fv, obtenho, por exemplo:

1 -0.171739593    
2 -0.049905948    
3 0.141146419    
4 0.11615669    
5 0.07342591    
6 0.093054334    
7 0.957164383    
8 0.098415639    
.
.
.
104 0.196368229    
105 1.045208447    
106 1.05499112

Como só tenho uma idéia provisória do que estou fazendo, estou lutando para entender como interpretar os valores negativos e maiores que 1, pois esperaria que a probabilidade estivesse entre 0 e 1.

Portanto, minha pergunta é: estou apenas perdendo uma etapa em que preciso transformar a saída ou estou completamente errado. Agradecemos antecipadamente por qualquer ajuda que você possa oferecer.

Respostas:


23

Primeiro, parece que você construiu um modelo de regressão linear regular, não um modelo de regressão logística. Para construir um modelo de regressão logística, você precisa usar glm()com family="binomial" , não lm().

x1,x2x3y

logit <- glm(y~x1+x2+x3,family="binomial")

β0 0,β1,β2β3

Se você o fizer predict(logit), R calculará e retornará b0 + b1*x1 + b2*x2 + b3*x3.

y=euog(p1-p)=β0 0+β1x1+β2x2+β3x3

p

No R, você pode fazer algo assim:

pred <- predict(logit,newdata=data) #gives you b0 + b1x1 + b2x2 + b3x3
probs <- exp(pred)/(1+exp(pred)) #gives you probability that y=1 for each observation

Muito obrigado, primeiro por corrigir meu código e, em segundo lugar, por explicar como obter as probabilidades em R. Eu tentei e funciona perfeitamente. Eu gostaria de ter perguntado semanas atrás !!
SeBee

1
Pode ser reduzido com probs <- exp(predict(logit, type = "response" , newdata=data)ou pelo menos `probs <- 1 / (1 + exp (-pred))
snoram 26/10/17

11

Olhando para a documentação do predict.glm, parece tão fácil quanto usar um parâmetro extra na predictchamada:

 type = "response"

Veja a documentação:

type - o tipo de previsão necessária. O padrão está na escala dos preditores lineares; a "resposta" alternativa está na escala da variável de resposta. Assim, para um modelo binomial padrão, as previsões padrão são de probabilidades logarítmicas (probabilidades na escala logit) e type = "response" fornece as probabilidades preditas. A opção "terms" retorna uma matriz que fornece os valores ajustados de cada termo na fórmula do modelo na escala preditora linear. O valor desse argumento pode ser abreviado

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.