El modelo logit se utiliza cuando se tiene una variable dependiente o de respuesta binaria, en la cual se supone que solo asume dos valores posibles \(0\) y \(1\), que son asignaciones arbitrarias a una respuesta cualitativa. Tal respuesta puede corresponder a no y sí, a incumplimiento y cumplimiento, en general, a fracaso y éxito.
Se puede considerar el modelo de la forma
\[\begin{equation*} y_{i}=X_{i}^{\prime}\beta+\varepsilon_{i} \end{equation*}\]
En donde:
\(X_{i}^{\prime}=[1, x_{i1}, x_{i2},x_{i3},\cdots, x_{ik}]\)
\(\beta^{\prime}=[\beta_{0},\beta_{1},\beta_{2},\cdots,\beta_{k}]\)
Y la variable respuesta \(Y\) solo toma los valores \(0\) y \(1\), o sea que esta es una variable aleatoria tipo Bernoulli, que tiene distribución de probabilidad:
\(Y_{i}\) | Probabilidad |
---|---|
0 | \(1-\pi\) |
1 | \(\pi\) |
Como se parte del supuesto de que \(E(\varepsilon_{i})=0\), entonces el valor esperado de la variable dependiente será:
\(E(y_{i})=0\cdot (1-\pi_{i})+1\cdot \pi_{i}\)
\(E(y_{i})=\pi_{i}\)
o sea:
\(E(y_{i})=E(X_{i}^{\prime }\beta)=\pi_{i}\)
Esto implica que la respuesta esperada es simplemente la probabilidad de que la variable dependiente tome el valor \(1\).
Una restricción importante del modelo es que se debe cumplir que \(0\leq E(y_{i})=\pi_{i} \leq 1\). Esta restricción puede causar problemas en términos de seleccionar la función de respuesta lineal según el modelo especificado; por lo tanto, la función de respuesta debería ser no lineal. Una función monótonamente creciente o decreciente, en forma de \(S\) o de \(S\) invertida es la que suele utilizarse. Esta función es la función logística o logit que tiene la forma
\(E(y)=\dfrac{e^{(X^{\prime}\beta)}}{1+e^{X^{\prime}\beta)}}\)
O en forma
\(\pi _{i}=\dfrac{1}{1+e^{(-X^{\prime}\beta)}}\)
Que, a su vez, es equivalente a:
\(1-\pi_{i}=\dfrac{1}{e^{(X^{\prime}\beta)}}\)
Con lo cual se tiene:
\(\dfrac{\pi_{i}}{1-\pi_{i}}=\dfrac{1+e^{(X^{\prime}\beta)}}{1+e^{(-X^{\prime}\beta)}}\)
A esta transformación se le conoce como transformación logit de la probabilidad \(\pi_{i}\) y la relación \(\dfrac{\pi_{i}}{1-\pi_{i}}\) es una razón de probabilidades o ventaja (odds ratio).
Si se toma logaritmo, se obtiene:
\(L_{i}=ln\,\left( \dfrac{\pi_{i}}{1-\pi_{i}}\right) =X^{\prime}\beta\)
O sea que el logaritmo de la razón de probabilidades es lineal en las variables y en los parámetros.
Cada observación muestral tiene una distribución Bernoulli, cuya distribución tiene la forma:
\(f(y_{i})=\pi_{i}^{y_{i}}(1-\pi_{i})^{1-y_{i}} para i=1,2,3,\cdots,n\)
Donde cada observación \(y_{i}\) toma valor \(0\) o \(1\), y las observaciones son independientes, con lo cual la función de verosimilitud es:
\(L(y_{1}, y_{2}, y_{3},\cdots,y_{n},\beta)=\displaystyle\prod_{i=1}^{n} \pi_{i}^{y_{i}}(1-\pi_{i})^{1-y_{i}}\)
Tomando el logaritmo de la verosimilitud,
\(ln[ L(y_{1}, y_{2}, y_{3},\cdots,y_{n},\beta)]=Ln\left[ \displaystyle\prod_{i=1}^{n} \pi_{i}^{y_{i}}(1-\pi_{i})^{1-y_{i}}\right]\)
\(ln[ L(y_{1}, y_{2}, y_{3},\cdots,y_{n},\beta)]=\displaystyle\sum_{i=1}^{n}y_{i}\,Ln \left( \dfrac{\pi_{i}}{1-\pi_{i}} \right) +\displaystyle\sum_{i=1}^{n}y_{i}Ln\,(1-\pi_{i})\)
Como
\(1+\pi_{i}=[1+ e^{(X^{\prime}\beta)}]^{-1}\)
y,
\(ln\,\left( \dfrac{\pi_{i}}{1-\pi_{i}}\right) =X^{\prime}\beta\)
El logaritmo de la función de verosimilitud se puede expresar como:
\(ln(Y,\beta)=\displaystyle\sum_{i=1}^{n}y_{i}X^{\prime}\beta+\displaystyle\sum_{i=1}^{n}Ln[1+e^{(X^{\prime}\beta)}\)
La prueba de Hosmer-Lemeshow (1989), básicamente consiste en dividir el recorrido de la probabilidad en deciles, \(< 0.1\), \(< 0.2\) y así hasta \(<1\), y calcular tanto la distribución de éxitos como de fracasos, prevista por el modelo y los valores realmente observados. Ambas distribuciones, esperada y observada, se contrastan mediante una prueba chi-cuadrado.
Entonces, se tienen 10 grupos diferentes y se utiliza el estadístico:
\(G_{H-L}=\displaystyle\sum_{i=1}^{10}\dfrac{(O_{i}-E_{i})^{2}}{E_{i}\left( 1-\dfrac{E_{i}}{n_{i}}\right) }\)
Que tiene una distribución chi-cuadrado con 8 grados de libertad.
Donde:
\(n_{i}\) es el número de observaciones en cada grupo.
\(O_{i}\) es el número de casos en el grupo.
\(E_{i}\) es el número de casos esperados en cada grupo.
plot(logitp,p,t="l",xlab="log(p/1-p)",xaxt="n")
abline(h=c(0,0.5,1),v=0,col="grey")
Ejemplo tomado del libro Introducción al análisis de regresión lineal de Montgomery-Peck-Vining. Página 432.
Datos de 20 familias.
x: ingreso.
y: propiedad de la vivienda (1= sí, 0= no)
x<-c(38000,51200,39600,43400,47700,53000,41500,40800,45400,52400,38700,40100,
49500,38000,42000,54000,51700,39400,40900,52800)
y<-c(0,1,0,1,0,0,1,0,1,1,1,0,1,0,1,1,1,0,0,1)
plot(x,y,pch=16)
modelo1=glm(y~x,family=binomial(link="logit"))
summary(modelo1)
##
## Call:
## glm(formula = y ~ x, family = binomial(link = "logit"))
##
## Deviance Residuals:
## Min 1Q Median 3Q Max
## -2.0232 -0.8766 0.5072 0.7980 1.6046
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -8.7395139 4.4394326 -1.969 0.0490 *
## x 0.0002009 0.0001006 1.998 0.0458 *
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 27.526 on 19 degrees of freedom
## Residual deviance: 22.435 on 18 degrees of freedom
## AIC: 26.435
##
## Number of Fisher Scoring iterations: 4
com<-coefficients(modelo1)
c1<-com[1];c1
## (Intercept)
## -8.739514
c2<-com[2];c2
## x
## 0.0002009056
exp(coefficients(modelo1))
## (Intercept) x
## 0.0001601317 1.0002009258
z<-function(x){
1/(1+exp(-(c1+c2*x)))
}
curve(z,xlim=c(30000,60000),lwd=2)
pred<-predict(modelo1)
pred
## 1 2 3 4 5 6
## -1.10509968 1.54685473 -0.78365066 -0.02020924 0.84368500 1.90848488
## 7 8 9 10 11 12
## -0.40192995 -0.54256390 0.38160203 1.78794150 -0.96446574 -0.68319784
## 13 14 15 16 17 18
## 1.20531515 -1.10509968 -0.30147713 2.10939052 1.64730755 -0.82383179
## 19 20
## -0.52247333 1.86830375
exp(pred)
## 1 2 3 4 5 6 7 8
## 0.3311779 4.6966746 0.4567356 0.9799936 2.3249185 6.7428648 0.6690276 0.5812561
## 9 10 11 12 13 14 15 16
## 1.4646291 5.9771358 0.3811868 0.5049995 3.3378108 0.3311779 0.7397247 8.2432156
## 17 18 19 20
## 5.1929792 0.4387472 0.5930519 6.4773000
pre1<-predict(modelo1,type="response");pre1
## 1 2 3 4 5 6 7 8
## 0.2487856 0.8244590 0.3135336 0.4949479 0.6992408 0.8708488 0.4008487 0.3675914
## 9 10 11 12 13 14 15 16
## 0.5942594 0.8566747 0.2759850 0.3355480 0.7694690 0.2487856 0.4251964 0.8918125
## 17 18 19 20
## 0.8385268 0.3049509 0.3722741 0.8662619
#probabilidad para un ingreso de 38000
odds<- predict(modelo1,data.frame(x=38000))
odds
## 1
## -1.1051
exp(odds)/(1+exp(odds))
## 1
## 0.2487856
1/(1+exp(-(c1+c2*x)))
## [1] 0.2487856 0.8244590 0.3135336 0.4949479 0.6992408 0.8708488 0.4008487
## [8] 0.3675914 0.5942594 0.8566747 0.2759850 0.3355480 0.7694690 0.2487856
## [15] 0.4251964 0.8918125 0.8385268 0.3049509 0.3722741 0.8662619
confint(modelo1,level=0.95)
## Waiting for profiling to be done...
## 2.5 % 97.5 %
## (Intercept) -1.89408e+01 -0.8444742832
## x 2.44334e-05 0.0004365721
roc(y,pre1,plot = TRUE, legacy.axes = TRUE,
percent = TRUE, xlab = "% Falsos positivos",
ylab = "% verdaderos postivios", col = "red", lwd = 2,
print.auc = TRUE)
## Setting levels: control = 0, case = 1
## Setting direction: controls < cases
##
## Call:
## roc.default(response = y, predictor = pre1, percent = TRUE, plot = TRUE, legacy.axes = TRUE, xlab = "% Falsos positivos", ylab = "% verdaderos postivios", col = "red", lwd = 2, print.auc = TRUE)
##
## Data: pre1 in 9 controls (y 0) < 11 cases (y 1).
## Area under the curve: 79.8%
tabla1<-table(true=y,pred=round(fitted(modelo1)))
sum(diag(tabla1))/sum(tabla1)
## [1] 0.7
matriz1<-confusionMatrix(tabla1);matriz1
## Confusion Matrix and Statistics
##
## pred
## true 0 1
## 0 7 2
## 1 4 7
##
## Accuracy : 0.7
## 95% CI : (0.4572, 0.8811)
## No Information Rate : 0.55
## P-Value [Acc > NIR] : 0.1299
##
## Kappa : 0.4059
##
## Mcnemar's Test P-Value : 0.6831
##
## Sensitivity : 0.6364
## Specificity : 0.7778
## Pos Pred Value : 0.7778
## Neg Pred Value : 0.6364
## Prevalence : 0.5500
## Detection Rate : 0.3500
## Detection Prevalence : 0.4500
## Balanced Accuracy : 0.7071
##
## 'Positive' Class : 0
##
hl<-hoslem.test(modelo1$y,fitted(modelo1),g=10)
hl
##
## Hosmer and Lemeshow goodness of fit (GOF) test
##
## data: modelo1$y, fitted(modelo1)
## X-squared = 11.809, df = 8, p-value = 0.1599
cbind(x,y,pred,pre1)
## x y pred pre1
## 1 38000 0 -1.10509968 0.2487856
## 2 51200 1 1.54685473 0.8244590
## 3 39600 0 -0.78365066 0.3135336
## 4 43400 1 -0.02020924 0.4949479
## 5 47700 0 0.84368500 0.6992408
## 6 53000 0 1.90848488 0.8708488
## 7 41500 1 -0.40192995 0.4008487
## 8 40800 0 -0.54256390 0.3675914
## 9 45400 1 0.38160203 0.5942594
## 10 52400 1 1.78794150 0.8566747
## 11 38700 1 -0.96446574 0.2759850
## 12 40100 0 -0.68319784 0.3355480
## 13 49500 1 1.20531515 0.7694690
## 14 38000 0 -1.10509968 0.2487856
## 15 42000 1 -0.30147713 0.4251964
## 16 54000 1 2.10939052 0.8918125
## 17 51700 1 1.64730755 0.8385268
## 18 39400 0 -0.82383179 0.3049509
## 19 40900 0 -0.52247333 0.3722741
## 20 52800 1 1.86830375 0.8662619
Ejemplo tomado del libro Introducción al análisis de regresión lineal de Montgomery-Peck-Vining. Página 434.
Datos de 20 familias.
x1: ingreso.
x2: edad (años) del coche mas viejo.
y: si seis meses después habian comprado otro coche (1= sí, 0= no)
x1<-c(45000,40000,60000,50000,55000,50000,35000,65000,53000,48000,37000,31000,
40000,75000,43000,49000,37500,71000,34000,27000)
x2<-c(2,4,3,2,2,5,7,2,2,1,5,7,4,2,9,2,4,1,5,6)
y2<-c(0,0,1,1,0,1,1,1,0,0,1,1,1,0,1,0,1,0,0,0)
modelo2=glm(y2~x1+x2,family=binomial(link="logit"))
summary(modelo2)
##
## Call:
## glm(formula = y2 ~ x1 + x2, family = binomial(link = "logit"))
##
## Deviance Residuals:
## Min 1Q Median 3Q Max
## -1.5635 -0.8045 -0.1397 0.9535 1.7915
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -7.047e+00 4.674e+00 -1.508 0.132
## x1 7.382e-05 6.371e-05 1.159 0.247
## x2 9.879e-01 5.274e-01 1.873 0.061 .
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 27.726 on 19 degrees of freedom
## Residual deviance: 21.082 on 17 degrees of freedom
## AIC: 27.082
##
## Number of Fisher Scoring iterations: 5
pred2<-predict(modelo2)
pred2
## 1 2 3 4 5 6 7
## -1.7495337 -0.1428455 0.3456042 -1.3804498 -1.0113658 1.5832084 2.4517287
## 8 9 10 11 12 13 14
## -0.2731979 -1.1589994 -2.5159694 0.6235902 2.1564616 -0.1428455 0.4649700
## 15 16 17 18 19 20
## 5.0180352 -1.4542665 -0.3273875 -0.8181833 0.4021398 0.8733083
exp(pred2)
## 1 2 3 4 5 6
## 0.17385499 0.86688797 1.41284330 0.25146543 0.36372186 4.87055764
## 7 8 9 10 11 12
## 11.60839715 0.76094217 0.31380001 0.08078456 1.86561392 8.64050968
## 13 14 15 16 17 18
## 0.86688797 1.59196638 151.11409898 0.23357161 0.72080438 0.44123253
## 19 20
## 1.49502033 2.39482067
coma<-coefficients(modelo2); coma
## (Intercept) x1 x2
## -7.047061e+00 7.381679e-05 9.878861e-01
d1<-coma[1]
d2<-coma[2]
d3<-coma[3]
odds2<- predict(modelo2,data.frame(x1=45000,x2=2))
odds2
## 1
## -1.749534
exp(odds2)/(1+exp(odds2))
## 1
## 0.148106
pre2<-predict(modelo2,type="response");pre2
## 1 2 3 4 5 6 7
## 0.14810602 0.46434922 0.58555120 0.20093678 0.26671264 0.82965843 0.92068778
## 8 9 10 11 12 13 14
## 0.43212218 0.23884915 0.07474622 0.65103464 0.89627104 0.46434922 0.61419253
## 15 16 17 18 19 20
## 0.99342599 0.18934581 0.41887642 0.30614944 0.59920166 0.70543363
1/(1+exp(-(d1+d2*x1*d3*x2)))
## [1] 0.38130110 0.99024866 0.99771477 0.56099382 0.72600005 0.99998610
## [7] 0.99997998 0.91929998 0.66434815 0.02801017 0.99841188 0.99984580
## [13] 0.99024866 0.97999030 1.00000000 0.52481740 0.97999030 0.13359283
## [19] 0.99527324 0.99156083
confint(modelo2,level=0.95)
## Waiting for profiling to be done...
## 2.5 % 97.5 %
## (Intercept) -1.805544e+01 1.0275430082
## x1 -4.361540e-05 0.0002184223
## x2 1.544228e-01 2.2872127855
roc(y2,pre2,plot = TRUE, legacy.axes = TRUE,
percent = TRUE, xlab = "% Falsos positivos",
ylab = "% verdaderos postivios", col = "red", lwd = 2,
print.auc = TRUE)
## Setting levels: control = 0, case = 1
## Setting direction: controls < cases
##
## Call:
## roc.default(response = y2, predictor = pre2, percent = TRUE, plot = TRUE, legacy.axes = TRUE, xlab = "% Falsos positivos", ylab = "% verdaderos postivios", col = "red", lwd = 2, print.auc = TRUE)
##
## Data: pre2 in 10 controls (y2 0) < 10 cases (y2 1).
## Area under the curve: 77.5%
tabla2<-table(true=y2,pred=round(fitted(modelo2)))
sum(diag(tabla2))/sum(tabla2)
## [1] 0.65
matriz2<-confusionMatrix(tabla2);matriz2
## Confusion Matrix and Statistics
##
## pred
## true 0 1
## 0 7 3
## 1 4 6
##
## Accuracy : 0.65
## 95% CI : (0.4078, 0.8461)
## No Information Rate : 0.55
## P-Value [Acc > NIR] : 0.252
##
## Kappa : 0.3
##
## Mcnemar's Test P-Value : 1.000
##
## Sensitivity : 0.6364
## Specificity : 0.6667
## Pos Pred Value : 0.7000
## Neg Pred Value : 0.6000
## Prevalence : 0.5500
## Detection Rate : 0.3500
## Detection Prevalence : 0.5000
## Balanced Accuracy : 0.6515
##
## 'Positive' Class : 0
##
h2<-hoslem.test(modelo2$y,fitted(modelo2),g=10)
h2
##
## Hosmer and Lemeshow goodness of fit (GOF) test
##
## data: modelo2$y, fitted(modelo2)
## X-squared = 7.3153, df = 8, p-value = 0.503