library("stats")
library("psych")
library("readxl")
library("MASS")
library("ISLR")
library("fRegression")
library("vcd")
library("openxlsx")
Base1 = read.xlsx("test2.xlsx")
# race = cateogria de raza
# captial gain = si tiene o no ingresos
# hours-per-week = horas de trabajo por semana
Base2 = read.xlsx("URBI.xlsx")
# y = si se dio o no lo que se esta analizando
# z = un numero que esta atado a la y (si se les dio o no (1 y 0))
modelo_logit1 = glm(capitalgain~hoursweek+race,data=Base1,family=binomial(link="logit"))
summary(modelo_logit1)
##
## Call:
## glm(formula = capitalgain ~ hoursweek + race, family = binomial(link = "logit"),
## data = Base1)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -3.605073 0.526591 -6.846 7.59e-12 ***
## hoursweek 0.027962 0.009424 2.967 0.00301 **
## race -0.154478 0.224193 -0.689 0.49080
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 456.40 on 898 degrees of freedom
## Residual deviance: 447.46 on 896 degrees of freedom
## AIC: 453.46
##
## Number of Fisher Scoring iterations: 5
# La cantidad de horas si tiene significanciía en si generan ingresos o no. Mientras que la raza no tiene significancia en sus ingresos.
modelo_logit2 = glm(Y~Z,data=Base2,family=binomial(link="logit"))
summary(modelo_logit2)
##
## Call:
## glm(formula = Y ~ Z, family = binomial(link = "logit"), data = Base2)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -1.0703 0.5004 -2.139 0.032449 *
## Z -0.4428 0.1170 -3.786 0.000153 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 62.183 on 44 degrees of freedom
## Residual deviance: 30.669 on 43 degrees of freedom
## AIC: 34.669
##
## Number of Fisher Scoring iterations: 6
modelo_probit1 = glm(capitalgain~hoursweek+race,data=Base1,family=binomial(link="probit"))
summary(modelo_probit1)
##
## Call:
## glm(formula = capitalgain ~ hoursweek + race, family = binomial(link = "probit"),
## data = Base1)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -2.003983 0.260522 -7.692 1.45e-14 ***
## hoursweek 0.014436 0.004933 2.926 0.00343 **
## race -0.074307 0.103155 -0.720 0.47131
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 456.4 on 898 degrees of freedom
## Residual deviance: 447.2 on 896 degrees of freedom
## AIC: 453.2
##
## Number of Fisher Scoring iterations: 5
modelo_probit2 = glm(Y~Z,data=Base2,family=binomial(link="probit"))
summary(modelo_probit2)
##
## Call:
## glm(formula = Y ~ Z, family = binomial(link = "probit"), data = Base2)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -0.67883 0.27671 -2.453 0.0142 *
## Z -0.25095 0.05836 -4.300 1.71e-05 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 62.183 on 44 degrees of freedom
## Residual deviance: 30.835 on 43 degrees of freedom
## AIC: 34.835
##
## Number of Fisher Scoring iterations: 6
Estimamos los criterios de información para cada modelo utilizado en la Base1
CIA_Logit1 = AIC(modelo_logit1)
CIA_Probit1 = AIC(modelo_probit1)
CIA_Logit1
## [1] 453.4582
CIA_Probit1
## [1] 453.2016
El modelo con mejor ajuste con base al CIA es el probit al tener un valor menor.
Ahora estimamos los criterios de información para cada modelo utilizado en la Base2.
CIA_Logit2 = AIC(modelo_logit2)
CIA_Probit2 = AIC(modelo_probit2)
CIA_Logit2
## [1] 34.66863
CIA_Probit2
## [1] 34.83505
Aquí el modelo con mejor ajuste con base al CIA es el logit al tener un valor menor.
El objetivo de hacer esto es predecir
log.odds <- predict(modelo_probit1, data.frame(hoursweek = 99, race = 2))
Prob1 = pnorm(log.odds)
Prob1
## 1
## 0.2347176
# Equivalentemente
predict(modelo_probit1, data.frame(hoursweek = 3, race = 1), type="response")
## 1
## 0.02092637
### lo que arroja es la probabilidad de que tengan ingresos, ya que el numero que arroja esta más cerca al 0.
log.odds2 <- predict(modelo_logit2, data.frame(Z = mean(Base2$Z)))
Prob2 = exp(log.odds2)/(1+exp(log.odds2))
Prob2
## 1
## 0.6753464
#Equivalentemente
predict(modelo_logit2, data.frame(Z = mean(Base2$Z)), type="response")
## 1
## 0.6753464
### el 66% de los datos son rechazados y lo restante es lo aceptado --> esta mas cerca al 1
En este modelo los coeficientes indican cómo una unidad de esta unidad afecta al logaritmo de cociente de probabilidades. Lo más relevante en sí es el signo de esta relación para así saber si el incremento de la variable en cuestión aumenta o disminuye la probabilidad de tener el atributo que se está prediciendo.
Prob1*coef(modelo_probit1)
## (Intercept) hoursweek race
## -0.470370191 0.003388467 -0.017441175
# B0x seria hoursweek / B1 seria race / intercept =b2
Prob2*coef(modelo_logit2)
## (Intercept) Z
## -0.7228405 -0.2990640
La Matriz de Confusiones es la herramienta principal para generar diferentes métricas que sirven para evaluar el desmepeño de nuestro modelo. Estas métricas las veremos con mayor detalle en las próximas clases.
predicciones1 <- ifelse(test = modelo_probit1$fitted.values > 0.5, yes =1, no = 0)
matriz_confusion1 <- table(predicciones1,modelo_probit1$model$capitalgain,dnn = c( "predicciones","observaciones"))
matriz_confusion1
## observaciones
## predicciones 0 1
## 0 836 63
# si es mayor a 0.5 es si y si es menor a 0.5 es no
predicciones2 <- ifelse(test = modelo_logit2$fitted.values > 0.5, yes =1, no = 0)
matriz_confusion2 <- table(modelo_logit2$model$Y, predicciones2,dnn = c("observaciones", "predicciones"))
matriz_confusion2
## predicciones
## observaciones 0 1
## 0 19 2
## 1 3 21
A partir de esta matriz se puede estimar una medida del ajuste
(836+0)/(899)*100
## [1] 92.99221
# (calificacion buena )/ total de calificaciones * 100
(19+21)/(21+24)*100
## [1] 88.88889
Alternativas para generar matrices de confusiones se pueden encontrar en: https://www.statology.org/confusion-matrix-in-r/