#1.- REGRESIÓN LOGIT

La regresión logística, a menudo simplemente llamada modelo “logit”, es una técnica de regresión utilizada para predecir la probabilidad de que ocurra un evento en función de uno o más predictores. A diferencia de la regresión lineal, que se utiliza para predecir una variable continua, la regresión logística se utiliza para predecir una variable categórica binaria (es decir, con dos categorías posibles, como “sí” o “no”).

ln(p/(1-p)) = b0 + b1x1 + 2x2 +… + bkxk + error

#**2.- EJEMPLO1*

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) # PCH son 16 puntos

##2.3.- MODELO LOGIT

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

Coeficientes:

X (0.0002009 > 0). Se estima que un incremento de la variable X (ingreso), con el resto de los factores constantes provocaría un incremento de la probabilidad de ser propietario de una vivienda (P(y=1)). El p valor de este coeficiente es 0.0458 < 0.05. Tenemos evidencia empírica suficiente para rechazar la hipótesis de H0: beta = 0. Por tanto, la variable es significativa al 5% para explicar la probabilidad de ser propietario de una vivienda.

com <- coefficients(modelo1)
c1 <- com[1]; c1
## (Intercept) 
##   -8.739514

El coeficiente estimado de beta 0 es -8, 739514.

c2 <- com[2]; c2
##            x 
## 0.0002009056

El coeficiente de la pendiente es 0.0002009.

Calculamos los exponenciales del coeficiente exp (b) o las Odds

exp(coefficients(modelo1))
##  (Intercept)            x 
## 0.0001601317 1.0002009258

Sólo nos interesa explicar el odd- X

p/(1-p) = 1.002

p = 1.002(1-p)

La probabilidad de ser propietario de una vivienda es 1.002 veces la probabilidad de no ser propietario de una vivienda.

Si el odd es superior a 1, indica que las variaciones en la probabilidad de Y son positivas (aumentar x hace aumentar la probabbilidad de Y).

Simulación de las probabilidades a cambios en X

z <- function(x){
1/(1+exp(-(c1+c2*x))) # 1/(1+exp (- y^)) función logística
}

curve(z, xlim=c(30000, 60000), lwd = 2) # dibujamos todos los puntos "x" y sus probabilidades

###2.4. - PREDICCIONES

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

Aquí tenemos todas las predicciones de y^

Predecimos cada Odd

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

Mayor a uno significa que la probabilidad de ser propietario es superior a la de no ser propietario de una vivienda.

Menor a uno significa aue la probabilidad de ser propietario es inferior a la probabilidad de ser propietario de una vivienda.

Calculamos las probabilidades de cada uno:

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

Ésta sería la probabilidad de cada encuestado de tener una vivienda en propiedad en base a sus ingresos.

Calcular la probabilidad de ser propietario de una vivienda con un ingreso de 50.000 euros

y1 <- c1 + c2*50000
y1
## (Intercept) 
##    1.305768
prob1 = 1/(1+exp(-y1))
prob1
## (Intercept) 
##   0.7868041

La probabilidad de ser propietario de una vivienda es de un 78,68%.

##2.5.- Curva de ROC

library(pROC)
## Warning: package 'pROC' was built under R version 4.2.3
## Type 'citation("pROC")' for a citation.
## 
## Attaching package: 'pROC'
## The following objects are masked from 'package:stats':
## 
##     cov, smooth, var
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%

El área de la curva de roc (AUC) asciende a un 79,80% de los casos.

El resultado nos muestra una fiabilidad elevada (>75%).

##2.6. - Matriz de confusión

tabla1 <- table(true = y, pred=round(fitted(modelo1)))
accuracy <- sum(diag(tabla1))/sum(tabla1)
accuracy
## [1] 0.7

La fiabilidad de casos correctamente predichos es de un 70%.

library(caret)
## Warning: package 'caret' was built under R version 4.2.3
## Loading required package: ggplot2
## Warning: package 'ggplot2' was built under R version 4.2.3
## Loading required package: lattice
MC1 <- confusionMatrix(tabla1)
MC1
## 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               
## 

Cuando el individuo indica no ser propietario y el modelo lo clasifica como no propietario ocurre en un total de 7 ocasiones (verdaderos negativos).

Cuando el individuo indica no ser propietario, pero el modelo los clasifica como que sí es propietario ocurre en un total de 22 ocasiones (falsos positivos).

Cuando el individuo indica ser propietario, pero el modelo lo clasifica como que no es propietario ocurre en 4 ocasiones (falsos negativos).

Cuando el individuo indica ser propietario y el modelo indica que es propietario esto ocurre en 7 ocasiones.

fiabilidad = (7+7)/(7+4+7+4) = 0.7

El área bajo la curva de roc (AUC) es 0.79, pero su intervalo de confianza al 95% es (0.4572; 0.8811). No se puede asegurar que la fiabilidad es correcta, pues puede tomar el AUC cualquier valor entre 45% y 88% (esta dispersión se debe a que tenemos muy pocos datos).

Sensibilidad

La sensibilidad, también conocida como tasa verdadera positiva o recall, es una métrica utilizada para evaluar el desempeño de modelos de clasificación, en especial en contextos donde las clases están desequilibradas o cuando la detección de ciertos eventos es particularmente crucial.

Sensibilidad = verdaderos positivos /(total verdaderos positivos + falsos negativos)

La sensibilidad del modelo es 63.64%; el porcentaje de gente correctamente predicho como que sí es propietaria asciende al 63.64% de la muestra.

Especificidad

La especificidad, también conocida como tasa verdadera negativa, es otra métrica crucial utilizada para evaluar el desempeño de modelos de clasificación, en particular en contextos médicos o cuando es esencial minimizar los falsos positivos.

especificidad = verdaderos negativos/(verdaderos negativos + falsos positivos)

La proporción de verdaderos negativos es del 77.78%, es decir, el modelo predice correctamente el 77.78% de la gente que no es propietaria de una vivienda.

Kappa de Cohen

El coeficiente Kappa de Cohen es una métrica utilizada para medir la concordancia entre dos raters (o evaluadores) que clasifican ítems en categorías mutuamente excluyentes. Es especialmente útil, porque tiene en cuenta la posibilidad de que el acuerdo ocurra por azar.

Si el coeficiente Kappa es:

1: Significa que hay un acuerdo perfecto entre los raters. 0: Significa que el acuerdo es exactamente lo que se esperaría por azar. < 0: Significa que hay un desacuerdo.

Este coeficiente es muy útil, porque proporciona una métrica que tiene en cuenta la posibilidad de acuerdos aleatorios., lo que puede ser particularmente importante en problemas con clases muy desequilibradas o cuando se comparan dos evaluadores humanos.

El kappa de nuestro modelo es 0.4059; es un modelo no especialmente bueno, pues cuanto más cerca de uno indica mayor fiabilidad. Obviamente será 1 si el accuracy del modelo es 1.

Mc Neamn Test

El test de McNemar es una prueba estadística utilizada para determinar si hay diferencias significativas entre dos métodos de clasificación binaria sobre el mismo conjunto de datos. Es comúnmente usado para comparar la performance de dos modelos de clasificación o para evaluar la concordancia entre dos raters cuando realizan clasificaciones binarias en un conjunto de datos.

P valor = 0.68 >0.05. tenemos eidencia empírica suficiente para aceptar H0 No hay diferencias en las proporciones de errors de las dos categorías (el modelo no es acertado)

Prevalencia

La prevalencia se refiere a la proporción de individuos en una población que tienen una determinada característica, condición o enfermedad en un punto específico o periodo de tiempo. Es una medida que ayuda a entender qué tan común es un evento o condición en un grupo particular de personas.

Prevalencia = número de positivos/total de la muestra

La prevalencia asciende a un 55% (de los encuestados el 55% de ellos indicaron tener vivienda en propiedad).

Detección de l prevalencia

1- prevalencia = 1 -0.55 = 0-45 El 45% de los encuestados confirman no tener vivienda en propiedad.

library(pheatmap)
## Warning: package 'pheatmap' was built under R version 4.2.3
pheatmap(MC1,
         main="Matriz de Confusión",
         color = colorRampPalette(c("white", "lightblue"))(25),
         show_rownames = TRUE,
         show_colnames = TRUE,
         annotation_names_col = TRUE,
         annotation_names_row = TRUE,
         display_numbers = TRUE,  # Esta opción muestra los números en cada celda
         number_format = "%.0f")  # Formato para los números)

##2.7.- R2 de Mac Faddeden

Modelo completo

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

Guardamos el loglikehood ratio.

L1 <- 22.435
L0 <- 27.526

R2McFaddeden <- 1- L1/L0
R2McFaddeden
## [1] 0.1849524

El logaritmo de la verosimilitud mejora en un 18.49% en comparación al modelo nulo.

##2.8.- Contraste de Hosmer Memeshow

H0: La bondad del ajuste es aceptable H1: La bondad del ajuste no es aceptable

library(ResourceSelection)
## Warning: package 'ResourceSelection' was built under R version 4.2.3
## ResourceSelection 0.3-6   2023-06-27
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

El p-valor es 0.15 > 0.05. Tenemos evidencia empírica suficiente para aceptar H0; por tanto, la bondad del ajuste no es aceptable y el modelo no predice de forma acertada.