Introducción

En este documento se presenta un ejemplo de cómo calcular un intervalo de confianza para una proporción y para la media de una variable aleatoria, utilizando la técnica de “bootstrapping”.

Ejemplo 1

Vamos a usar los datos del consultorio de un médico para ilustrar el método. En particular, vamos a calcular un intervalo de confianza para la proporción de pacientes con complicaciones durante la visita. La proporción de pacientes con complicaciones es una variable binaria, donde 1 indica que el paciente tuvo complicaciones y 0 indica que no las tuvo. La proporción de pacientes con complicaciones en una muestra es de 3/62, según una muestra (n = 62) de los expedientes.

Vamos a calcular un intervalo de confianza (95 %) para la proporción de pacientes con complicaciones en el consultorio del médico. Para ello, vamos a utilizar la técnica de “bootstrapping”.

# Definir la proporción de pacientes con complicaciones
prop_complicaciones <- 3/62

# Realizar bootstrapping de las proporciones
library(boot)
boot_results <- boot(c(rep(1, 3), rep(0, 59)), statistic = function(data, indices) {
  return(mean(data[indices]))
}, R = 10000)

# gráfica con puntos de la frecuencia absoluta de las proporciones usando ggplot2
library(ggplot2)
ggplot(data.frame(prop = boot_results$t), aes(x = prop)) +
  geom_histogram(binwidth = 0.001, fill = "lightblue", color = "black") +
  geom_vline(xintercept = prop_complicaciones, color = "red", linetype = "dashed") +
  labs(title = "Distribución de las proporciones", x = "Proporción de complicaciones", y = "Frecuencia")

# graph using box-plot with ggplot2
ggplot(data.frame(prop = boot_results$t), aes(y = prop)) +
  geom_boxplot(fill = "lightblue", color = "black") +
  geom_hline(yintercept = prop_complicaciones, color = "red", linetype = "dashed") +
  labs(title = "Distribución de las proporciones", x = "", y = "Proporción de complicaciones")

# Calcular el intervalo de confianza
boot_ci <- boot.ci(boot_results, type = "basic")
boot_ci
## BOOTSTRAP CONFIDENCE INTERVAL CALCULATIONS
## Based on 10000 bootstrap replicates
## 
## CALL : 
## boot.ci(boot.out = boot_results, type = "basic")
## 
## Intervals : 
## Level      Basic         
## 95%   (-0.0161,  0.0968 )  
## Calculations and Intervals on Original Scale
# includes the intervals in the graphs
# histogram
ggplot(data.frame(prop = boot_results$t), aes(x = prop)) +
  geom_histogram(binwidth = 0.001, fill = "lightblue", color = "black") +
  geom_vline(xintercept = prop_complicaciones, color = "red", linetype = "dashed") +
  geom_vline(xintercept = boot_ci$basic[4:5], color = "blue", linetype = "dashed") +
  labs(title = "Distribución de las proporciones", x = "Proporción de complicaciones", y = "Frecuencia")

# boxplot
ggplot(data.frame(prop = boot_results$t), aes(y = prop)) +
  geom_boxplot(fill = "lightblue", color = "black") +
  geom_hline(yintercept = prop_complicaciones, color = "red", linetype = "dashed") +
  geom_hline(yintercept = boot_ci$basic[4:5], color = "blue", linetype = "dashed") +
  labs(title = "Distribución de las proporciones", x = "", y = "Proporción de complicaciones")

Ejemplo 2

Para ilustrar el método, se utilizará un conjunto de datos de la librería datasets de R. En particular, se utilizará el conjunto de datos airquality, que contiene información sobre la calidad del aire en Nueva York durante el verano de 1973.

data(airquality)
head(airquality)
##   Ozone Solar.R Wind Temp Month Day
## 1    41     190  7.4   67     5   1
## 2    36     118  8.0   72     5   2
## 3    12     149 12.6   74     5   3
## 4    18     313 11.5   62     5   4
## 5    NA      NA 14.3   56     5   5
## 6    28      NA 14.9   66     5   6

Estimación del intervalo de confianza

Para estimar el intervalo de confianza para la media de la variable Ozone, se utilizará la técnica de “bootstrapping”. En este caso, se realizarán 1000 remuestreos con reemplazo de los datos originales y se calculará la media de la variable Ozone en cada remuestreo.

library(boot)

# Definir la función para calcular la media de la variable Ozone
mean_func <- function(data, indices) {
  return(mean(data[indices, "Ozone"], na.rm = TRUE))
}

# Realizar bootstrapping
boot_results <- boot(data = airquality, statistic = mean_func, R = 1000)

# Crear un histograma de las medias obtenidas icluir la media de la variable Ozone
hist(boot_results$t, main = "Distribución de las medias", xlab = "Media de Ozone")
abline(v = mean(airquality$Ozone, na.rm = TRUE), col = "blue", lty = 2)

# Calcular el intervalo de confianza
boot_ci <- boot.ci(boot_results, type = "basic")
boot_ci
## BOOTSTRAP CONFIDENCE INTERVAL CALCULATIONS
## Based on 1000 bootstrap replicates
## 
## CALL : 
## boot.ci(boot.out = boot_results, type = "basic")
## 
## Intervals : 
## Level      Basic         
## 95%   (36.20, 47.92 )  
## Calculations and Intervals on Original Scale
# incluir el intervalo de confianza en la gráfica
hist(boot_results$t, main = "Distribución de las medias", xlab = "Media de Ozone")
abline(v = boot_ci$basic[4:5], col = "red", lty = 2)
abline(v = mean(airquality$Ozone, na.rm = TRUE), col = "blue", lty = 2)