Analítica Avanzada de Datos

Sesión #5: Introducción al Bootstrap

Autor/a
Afiliación

Universidad del Norte, Barranquilla

Fecha de publicación

7 de junio de 2024

Consideremos los siguientes datos de un proceso de inyección:

  y     change
1 0 -1.9396807
2 1 -0.7245350
3 0 -2.2534429
4 0  1.3929212
5 0 -0.5057383
6 0 -2.2307026

Los coeficientes del modelo ajustado son:

## modelo de RL
fit <- glm(y ~., data = d, family = 'binomial')
summary(fit)$coefficients
               Estimate Std. Error    z value     Pr(>|z|)
(Intercept) -0.03017878  0.1271316 -0.2373821 8.123604e-01
change       1.12436593  0.1106093 10.1651993 2.835417e-24

Homework

Supongamos que el cutoff óptimo para el modelo de Regresión Logística anterior es \(\theta_0 = 0.5826\). Así las cosas, la matriz de confusión es

## matriz de confusión
theta_0 <- 0.5826
theta_hat <- predict(fit, type = 'response')
cm <- table(model = 1*(theta_hat > theta_0), real = d$y)[2:1, 2:1]
cm
     real
model   1   0
    1  79  20
    0  81 320

De acuerdo con los resultados, la especificidad es 0.941.

Calcule un intervalo de confianza del 95% para el Jaccard index usando Bootstrap.

Respuesta

Sabemos que al calcular el Jaccard index, se busca medir la similitud entre conjuntos de muestreo, que en prinicipio está definido como el tamaño de la intersección entre el tamaño de la unión. Al hablar de una matriz de confusión, el coeficiente de Jaccard está definido de esta manera:

\[ J = \frac{M_{22}}{M_{22}+M_{12}+M_{21}} \] Donde 1 representa la ausencia del atributo, y 2 representa la presencia del atributo.

Para obtener una estimación del indice, se utiliza el método de bootstrap paramétrico, el cual tomará como base una distribución multinomial, que en este caso, toma como parámetros el vector \(\pi\) (vector de probabilidades de cada uno de los \(M_{ij}\)) y \(\mathbf{n} = n_{11}+ n_{12} + n_{21} + n_{22}\) (suma de todas las combinaciones posibles dentro de la matriz de confunsión).

Primero, se genera una muestra de una distribución multinomial con parámetros \(\pi\) y \(n\) basada en la matriz de confusión cm:

set.seed(015)
n1 <- sum(cm)
probab <- cm/sum(cm)

confu_muestra <- rmultinom(n = 1, size = n1, prob = probab)
confu_muestra <- matrix(confu_muestra, ncol = 2, byrow = F)
confu_muestra
     [,1] [,2]
[1,]   71   18
[2,]   99  312

Para esta muestra, el coeficiente de Jaccard es:

jac <- confu_muestra[2,2]/sum(confu_muestra[2,2],
                              confu_muestra[2,1], 
                              confu_muestra[1,2])
jac
[1] 0.7272727

Ahora, se realiza este proceso \(B = 10000\) veces

set.seed(015)
B <- 10000
jacc_boot <- replicate(B, {
                confu_muestra <- rmultinom(n = 1, size = n1, prob = probab)
                confu_muestra <- matrix(confu_muestra, ncol = 2, byrow = F)
                jac <- confu_muestra[2,2]/sum(confu_muestra[2,2],
                                              confu_muestra[2,1], 
                                              confu_muestra[1,2])
})

La distribución muestral del coeficiente de Jaccard es

library(ggplot2)

df0 <- data.frame(statistic = jacc_boot)
ggplot(df0, aes(x = statistic)) +
  geom_histogram(fill = 'lightblue', color = 'gray', alpha = 0.7) + 
  xlab("Coeficiente de Jaccard basado en Bootstrap") + 
  ylab("Frecuencia") + 
  theme_minimal()
`stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

Con esto, un intervalo de confianza del 95% para el coeficiente de Jaccard es

quantile(jacc_boot, probs = c(0.025, 0.975))
     2.5%     97.5% 
0.7183099 0.7995169 

Más recursos