Ejemplo 1. Supongamos que estamos interesados en los factores que influyen en si un candidato polĆtico gana una elección. La variable de resultado (respuesta) es binaria (0/1); ganar o perder. Las variables de predicción de interĆ©s son la cantidad de dinero gastado en la campaƱa, la cantidad de tiempo dedicado a la campaƱa negativa y si el candidato es o no un titular.
Ejemplo 2. Un investigador estÔ interesado en cómo las variables, como el GRE (puntaje del examen de Graduados), el GPA (promedio de calificaciones) y el prestigio de la institución de pregrado, tienen efecto en la admisión a la escuela de postgrado. La variable de respuesta, admitir / no admitir, es una variable binaria.
Para nuestro anÔlisis de datos a continuación, vamos a ampliar el ejemplo 2 sobre cómo ingresar a la escuela de postgrado.
La base de datos contiene 400 filas y 4 columnas(variables):
admit) variable que no dice 1 = si es admitido, 0 = no es admitido.gre) puntage en el examen general para ingreso a la escuela graduada (continua). gpa) puntage promedio general el pregrado (continua).rank) de la escuela de pregrado de la cual proveiene el estudiante (categorica del 1 a 4).# Lee base de datos del sitio web
library(readr)
ingreso <- read_csv("~/Desktop/libro_glm/datos/ingreso.csv")
head(ingreso)
# A tibble: 6 x 5
X1 admit gre gpa rank
<int> <int> <int> <dbl> <int>
1 1 0 380 3.61 3
2 2 1 660 3.67 3
3 3 1 800 4 1
4 4 1 640 3.19 4
5 5 0 520 2.93 4
6 6 1 760 3 2
summary(ingreso)
X1 admit gre gpa
Min. : 1.0 Min. :0.0000 Min. :220.0 Min. :2.260
1st Qu.:100.8 1st Qu.:0.0000 1st Qu.:520.0 1st Qu.:3.130
Median :200.5 Median :0.0000 Median :580.0 Median :3.395
Mean :200.5 Mean :0.3175 Mean :587.7 Mean :3.390
3rd Qu.:300.2 3rd Qu.:1.0000 3rd Qu.:660.0 3rd Qu.:3.670
Max. :400.0 Max. :1.0000 Max. :800.0 Max. :4.000
rank
Min. :1.000
1st Qu.:2.000
Median :2.000
Mean :2.485
3rd Qu.:3.000
Max. :4.000
sapply(ingreso, sd)
X1 admit gre gpa rank
115.6143013 0.4660867 115.5165364 0.3805668 0.9444602
Observe que para la tabla de contingencia no deben haber datos fantantes
## tabla de contingencia categorica two-way
xtabs(~admit + rank, data = ingreso)
rank
admit 1 2 3 4
0 28 97 93 55
1 33 54 28 12
ingreso$rank <- factor(ingreso$rank)
mod.logit <- glm(admit ~ gre + gpa + rank, data = ingreso, family = "binomial")
summary(mod.logit)
Call:
glm(formula = admit ~ gre + gpa + rank, family = "binomial",
data = ingreso)
Deviance Residuals:
Min 1Q Median 3Q Max
-1.6268 -0.8662 -0.6388 1.1490 2.0790
Coefficients:
Estimate Std. Error z value Pr(>|z|)
(Intercept) -3.989979 1.139951 -3.500 0.000465 ***
gre 0.002264 0.001094 2.070 0.038465 *
gpa 0.804038 0.331819 2.423 0.015388 *
rank2 -0.675443 0.316490 -2.134 0.032829 *
rank3 -1.340204 0.345306 -3.881 0.000104 ***
rank4 -1.551464 0.417832 -3.713 0.000205 ***
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
(Dispersion parameter for binomial family taken to be 1)
Null deviance: 499.98 on 399 degrees of freedom
Residual deviance: 458.52 on 394 degrees of freedom
AIC: 470.52
Number of Fisher Scoring iterations: 4
Intervalos de confianza IC estimados con log-likelihood
confint(mod.logit)
2.5 % 97.5 %
(Intercept) -6.2716202334 -1.792547080
gre 0.0001375921 0.004435874
gpa 0.1602959439 1.464142727
rank2 -1.3008888002 -0.056745722
rank3 -2.0276713127 -0.670372346
rank4 -2.4000265384 -0.753542605
IC estimados con errores estandar
confint.default(mod.logit)
2.5 % 97.5 %
(Intercept) -6.2242418514 -1.755716295
gre 0.0001202298 0.004408622
gpa 0.1536836760 1.454391423
rank2 -1.2957512650 -0.055134591
rank3 -2.0169920597 -0.663415773
rank4 -2.3703986294 -0.732528724
library("aod")
wald.test(b = coef(mod.logit), Sigma = vcov(mod.logit), Terms = 4:6)
Wald test:
----------
Chi-squared test:
X2 = 20.9, df = 3, P(> X2) = 0.00011
l <- cbind(0, 0, 0, 1, -1, 0)
wald.test(b = coef(mod.logit), Sigma = vcov(mod.logit), L = l)
Wald test:
----------
Chi-squared test:
X2 = 5.5, df = 1, P(> X2) = 0.019
## odds ratios and 95% CI
exp(cbind(OR = coef(mod.logit), confint(mod.logit)))
OR 2.5 % 97.5 %
(Intercept) 0.0185001 0.001889165 0.1665354
gre 1.0022670 1.000137602 1.0044457
gpa 2.2345448 1.173858216 4.3238349
rank2 0.5089310 0.272289674 0.9448343
rank3 0.2617923 0.131641717 0.5115181
rank4 0.2119375 0.090715546 0.4706961
Ahora podemos decir que para un aumento de una unidad en gpa, las probabilidades (odds) de ser admitido en la escuela de postgrado (versus no ser admitido) aumentan en un factor de 2.23.
Comenzaremos por calcular la probabilidad de admisión prevista en cada valor de rango, manteniendo gre y gpa en sus medios. Primero creamos y vemos el marco de datos.
newdata1 <- with(ingreso, data.frame(gre = mean(gre), gpa = mean(gpa), rank = factor(1:4)))
## datos newdata1
newdata1
gre gpa rank
1 587.7 3.3899 1
2 587.7 3.3899 2
3 587.7 3.3899 3
4 587.7 3.3899 4
agreguemos ahora el valor de la probabilidad predicha para cada rango
newdata1$rankP <- predict(mod.logit, newdata = newdata1, type = "response")
newdata1
gre gpa rank rankP
1 587.7 3.3899 1 0.5166016
2 587.7 3.3899 2 0.3522846
3 587.7 3.3899 3 0.2186120
4 587.7 3.3899 4 0.1846684
newdata2 <- with(ingreso, data.frame(gre = rep(seq(from = 200, to = 800, length.out = 100),
4), gpa = mean(gpa), rank = factor(rep(1:4, each = 100))))
newdata3 <- cbind(newdata2, predict(mod.logit, newdata = newdata2, type = "link",
se = TRUE))
newdata3 <- within(newdata3, {
PredictedProb <- plogis(fit)
LL <- plogis(fit - (1.96 * se.fit))
UL <- plogis(fit + (1.96 * se.fit))
})
## veamos aldunas lineas de los datos
head(newdata3)
gre gpa rank fit se.fit residual.scale UL
1 200.0000 3.3899 1 -0.8114870 0.5147714 1 0.5492064
2 206.0606 3.3899 1 -0.7977632 0.5090986 1 0.5498513
3 212.1212 3.3899 1 -0.7840394 0.5034491 1 0.5505074
4 218.1818 3.3899 1 -0.7703156 0.4978239 1 0.5511750
5 224.2424 3.3899 1 -0.7565919 0.4922237 1 0.5518545
6 230.3030 3.3899 1 -0.7428681 0.4866494 1 0.5525464
LL PredictedProb
1 0.1393812 0.3075737
2 0.1423880 0.3105042
3 0.1454429 0.3134499
4 0.1485460 0.3164108
5 0.1516973 0.3193867
6 0.1548966 0.3223773
También puede ser útil usar grÔficos de probabilidades pronosticadas para comprender y / o presentar el modelo. Utilizaremos el paquete ggplot2 para graficar. A continuación hacemos una grÔfica con las probabilidades predichas e intervalos de confianza del 95%.
library("ggplot2")
p <- ggplot(newdata3, aes(x = gre, y = PredictedProb)) + geom_ribbon(aes(ymin = LL,
ymax = UL, fill = rank), alpha = 0.2) + geom_line(aes(colour = rank),
size = 1)+
theme(text=element_text(size = 20))
p