Sortie de prédiction de régression logistique

14

J'ai créé une régression logistique en utilisant le code suivant:

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)

J'ai ensuite utilisé la sortie pour créer un modèle 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)

Ensuite, j'ai prédit les résultats pour un autre ensemble de données en utilisant la fonction de prédiction:

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

J'ai pu utiliser établir une courbe ROC agréable et créé un tableau pour établir la sensibilité et la spécificité qui me donne les réponses que j'attendrais.

Cependant, ce que j'essaie de faire, c'est d'établir pour chaque ligne de données quelle est la probabilité que Ft_45 soit 1. Si je regarde la sortie de log.pred.fv, j'obtiens, par exemple:

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

Comme je n'ai qu'une compréhension provisoire de ce que je fais, j'ai du mal à comprendre comment interpréter les valeurs négatives et supérieures à 1 car je m'attendrais à ce qu'une probabilité se situe entre 0 et 1.

Ma question est donc de savoir s'il me manque une étape où je dois transformer la sortie ou si je me suis complètement trompé. Merci d'avance pour toute aide que vous pouvez offrir.

SeBee
la source

Réponses:

23

Tout d'abord, il semble que vous ayez construit un modèle de régression linéaire régulier, pas un modèle de régression logistique. Pour construire un modèle de régression logistique, vous devez utiliser glm()avec family="binomial" , non lm().

X1,X2X3y

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

β0,β1,β2β3

Si c'est le cas predict(logit), R calculera et reviendra b0 + b1*x1 + b2*x2 + b3*x3.

y=log(p1-p)=β0+β1X1+β2X2+β3X3

p

Dans R, vous pouvez faire quelque chose comme ceci:

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
Ben F
la source
Merci beaucoup, d'une part d'avoir corrigé mon code et d'autre part d'avoir expliqué comment obtenir les probabilités dans R. Je l'ai essayé et cela fonctionne parfaitement. J'aimerais avoir demandé il y a des semaines !!
SeBee
1
Peut être raccourci avec probs <- exp(predict(logit, type = "response" , newdata=data)ou au moins `probs <- 1 / (1 + exp (-pred))
snoram
11

En regardant la documentation de la predict.glm, il semble que c'est aussi simple que d'utiliser un paramètre supplémentaire dans l' predictappel:

 type = "response"

Voir documentation:

type - le type de prédiction requis. La valeur par défaut est à l'échelle des prédicteurs linéaires; la «réponse» alternative est à l'échelle de la variable de réponse. Ainsi, pour un modèle binomial par défaut, les prédictions par défaut sont de log-odds (probabilités sur une échelle logit) et type = "response" donne les probabilités prédites. L'option «termes» renvoie une matrice donnant les valeurs ajustées de chaque terme dans la formule du modèle sur l'échelle du prédicteur linéaire. La valeur de cet argument peut être abrégée

Bulat
la source