Bootstrap con R

Francisco García García (2014-10-12)


0. Introducción

1. Ejemplos

2. Cálculo de intervalos de confianza

3. Ejercicios

4. Bibliografía y enlaces interesantes





0. Introducción

Procedimiento:

Replicación: en lugar de tomar muchas muestras de la población, obtener réplicas (muestras con reemplazamiento) de la muestra original. Todas las réplicas deben tener el mismo tamaño que la muestra original: n.

La distribución bootstrap del estadístico se obtiene a partir de estas muestras y sirve para estimar la distribución del estadístico.


1. Ejemplos

1.1. ¿Cuál es el error típico de la media muestral?

Generamos una muestra de 50 valores que siguen una distribución normal de media 10 y desviación típica 2:

x = rnorm(50, mean=10, sd=2) 
x
#>  [1]  9.611508 11.491747 13.895451  8.050265 11.001862 12.908973  9.734026
#>  [8]  9.417167  6.904873 12.461002  9.740190 10.718098  9.042781 10.554776
#> [15]  9.436542 10.478445  7.822609  9.229711 14.197283  9.896884 10.498047
#> [22] 11.446452 10.615934  5.703998  9.598118  9.351235  7.511319 10.617467
#> [29]  5.989494 10.328063  7.037037  7.824670  8.180056 11.224523 10.162885
#> [36]  6.859558 10.581051 11.310052 13.895711 11.811797 10.228164 13.910892
#> [43]  8.936571 11.300202 12.878367 11.851383  9.580084  7.681413  9.882151
#> [50] 10.726072

A continuación creamos un vector vacío (en realidad está formado por 1000 ceros) donde almacenaremos los resultados que obtenemos:

medias=numeric(1000) 
head(medias)
#> [1] 0 0 0 0 0 0
length(medias)
#> [1] 1000

Mediante este código repetiremos 1000 veces las siguientes acciones: extracción de una muestra con reemplazamiento desde x, cálculo de la media muestral de esta nueva réplica y almacenamiento de la media muestral obtenida en el vector medias que hemos generado anteriormente:

for(i in 1:1000)
{
  muestra=sample(x, replace=T)
  medias[i]=mean(muestra)
}

Evaluamos los resultados obtenidos:

hist(medias) #un histograma de las medias

plot of chunk unnamed-chunk-4

qqnorm(medias, datax=T) #papel probabilistico normal

plot of chunk unnamed-chunk-4

mean(medias) # el centro de la distribucion de las medias
#> [1] 10.06803
sd(medias) # la desviacion tipica de las medias
#> [1] 0.2808914

1.2. ¿Cuál es el error típico de la mediana muestral?

Generamos una muestra de 70 valores que siguen una distribución normal de media 5 y desviación típica 1:

x = rnorm(70, mean=5, sd=1) 
x
#>  [1] 3.431259 3.559209 4.738021 5.286514 4.435731 5.119932 4.570800
#>  [8] 5.995586 4.766061 7.668557 6.412096 6.123822 5.695724 4.182644
#> [15] 5.104181 4.664639 3.593147 2.752794 5.175830 4.698195 3.907878
#> [22] 6.301497 6.087444 3.053649 3.905862 5.023151 5.221556 5.578620
#> [29] 4.482345 3.711805 6.221218 4.968053 5.344431 2.406120 6.505367
#> [36] 3.968421 6.277629 4.139923 4.216554 3.090438 4.485011 2.742732
#> [43] 4.639466 6.092158 3.553084 3.449766 4.331211 7.858513 4.970931
#> [50] 3.887755 4.217525 4.569956 4.702367 5.075653 4.665098 5.764191
#> [57] 4.816800 4.786887 5.541266 4.851533 5.297830 5.451397 5.371850
#> [64] 6.048320 5.657185 2.490922 7.166263 4.041296 4.149502 5.283316

A continuación creamos un vector vacío (en realidad está formado por 1000 ceros) donde almacenaremos los resultados que obtenemos:

medianas=numeric(1000) 
head(medianas)
#> [1] 0 0 0 0 0 0
length(medianas)
#> [1] 1000

Mediante este código repetiremos 1000 veces las siguientes acciones: extracción de una muestra con reemplazamiento desde x, cálculo de la mediana muestral de esta nueva réplica y almacenamiento de la mediana muestral obtenida en el vector mediana que hemos generado anteriormente:

for(i in 1:1000)
{
  muestra=sample(x, replace=T)
  medianas[i]=median(muestra)
}

Evaluamos los resultados obtenidos:

hist(medianas) #un histograma de las medianas

plot of chunk unnamed-chunk-8

qqnorm(medianas, datax=T) #papel probabilistico normal

plot of chunk unnamed-chunk-8

mean(medianas) # el centro de la distribucion de las medianas
#> [1] 4.810627
sd(medianas) # la desviacion tipica de las medianas
#> [1] 0.1460738

Ventajas de los procedimientos bootstrap

  1. No necesitamos la condición de normalidad en la que se basan las técnicas de inferencia paramétricas.

  2. En la mayoría de casos, la distribución bootstrap de un estadístico tiene aproximadamente la misma forma y dispersión que la distribución del estadístico que se obtiene al seleccionar muchas muestras de la población, pero su centro es el valor que toma el estadístico en la muestra original, en lugar del verdadero valor del parámetro que intentamos estimar.

  3. La técnica bootstrap nos permite calcular el error típico de cualquier estadístico sin necesidad de recurrir a la teoría estadística.


2. Cálculo de intervalos de confianza

2.1. Intervalos de confianza bootstrap usando t

Suponemos que la distribución bootstrap de un estadístico, obtenida a partir de una muestra aleatoria simple de tamaño n es aproximadamente normal y que el sesgo es pequeño. El sesgo es la diferencia entre el estadístico de interés en la muestra original y el estadístico obtenido a partir de la distribución bootstrat). Un intervalo de confianzan del (1 - alfa)*100% para el parámetro poblacional se obtiene mediante la expresión :

valor del estadístico +- t(alfa/2, n-1) *Sb, donde Sb es el error típico obtenido de la distribución bootstrap.

2.2. Intervalos de confianza bootstrap basados en percentiles

Cuando no se verifica la normalidad no es posible utilizar el procedimiento anterior para el cálculo de los intervalos de confianza bootstrap. Existen otros procedimientos:

El intervalo formado por los percentiles 2.5% y 97.5% de la distribución bootstrap de un estadístico, permiten calcular un intervalo de confianza del 95% para el parámetro poblacional. utilizaremos este método si la distribución bootstrap presenta un sesgo reducido.

Continuamos con los 2 ejemplos anteriores. De esta forma obtenemos los intervalos de confianza del 95% de los parámetros poblaciones media y mediana, a partir de la distribución bootstrap:

quantile(medias, c(0.025, 0.975))
#>      2.5%     97.5% 
#>  9.544179 10.619509
quantile(medianas, c(0.025, 0.975))
#>     2.5%    97.5% 
#> 4.570800 5.112056

2.3. Comparación de los intervalos de confianza bootstrap basados en t y en percentiles

2.4. Intervalos de confianza bootstrap más precisos: BCa

2.5. Bootstrap en R

Vemos un ejemplo de uso de bootstrap en R: la media muestral

Cargamos el paquete boot en nuestra sesión de R. Incluye algunas funciones de utilidad para el cálculo de la distribución bootstrap:

library(boot) 

Generamos una muestra de 50 valores que siguen una distribución normal de media 10 y desviación típica 2:

x = rnorm(50, mean=10, sd=2) 
x # es la muestra original
#>  [1] 10.702721 10.981019  7.093087  8.311465  7.645829 10.007150  8.741626
#>  [8] 11.478447  9.077784 13.611307 11.997823 13.622466  9.587657 10.854784
#> [15]  7.394178 12.107820 10.465594 13.825318 10.295840 10.257538 10.901772
#> [22] 12.182633  8.099342 11.754665 10.309974 10.030964  8.182202  9.107931
#> [29] 13.016811 11.908127 10.695847  9.983860 11.803832 11.197955 11.187103
#> [36]  9.536782  7.912447  8.624146 11.193682 10.120946  8.924292 10.997956
#> [43]  8.636663  9.476928 10.959153 10.542264  9.151097  8.196685 11.005376
#> [50]  9.368131
datos=data.frame(x) # requiere un data.frame
media=function(datos, indices)
{
  d=datos[indices,]
  mean(d)
}
replicas =boot(data=datos, statistic =media, R=5000)

Exploramos los elementos que contiene el objeto replicas que acabamos de generar:

names(replicas)
#>  [1] "t0"        "t"         "R"         "data"      "seed"     
#>  [6] "statistic" "sim"       "call"      "stype"     "strata"   
#> [11] "weights"

Vemos como es la distribución bootstrap de la media que hemos obtenido:

hist(replicas$t)

plot of chunk unnamed-chunk-13

qqnorm(replicas$t, datax=T)

plot of chunk unnamed-chunk-13

Centro de la distribución bootstrap:

mean(replicas$t)
#> [1] 10.26043

Desviación típica de la distribución bootstrap:

sd( replicas $t)
#> [1] 0.229736

Valor del estadístico en la muestra original:

replicas$t0
#> [1] 10.26138

Calculamos el sesgo:

sesgo=abs(mean(replicas$t)- (replicas$t0))
sesgo
#> [1] 0.000953733

Por último calculamos el intervalo de confianza de la media poblacional utilizando los 3 métodos comentados anteriormente:

Si la distribución del estadístico es normal y el sesgo pequeño, determinaremos el intervalo basado en la distribucion t:

replicas $t0-qt(0.975,df=length(x)-1)*sd(replicas$t)
#> [1] 9.799709
replicas $t0+qt(0.975,df=length(x)-1)*sd(replicas$t)
#> [1] 10.72305

Si la distribución del estadístico no es normal pero el sesgo es pequeño, usaremos el intervalo basado en percentiles:

quantile(replicas$t, c(0.025,0.975))
#>      2.5%     97.5% 
#>  9.803691 10.709877

Cuando hay un gran sesgo utilizaremos el intervalo BCa:

boot.ci ( replicas , type="bca")
#> BOOTSTRAP CONFIDENCE INTERVAL CALCULATIONS
#> Based on 5000 bootstrap replicates
#> 
#> CALL : 
#> boot.ci(boot.out = replicas, type = "bca")
#> 
#> Intervals : 
#> Level       BCa          
#> 95%   ( 9.81, 10.71 )  
#> Calculations and Intervals on Original Scale




3. Ejercicios




4. Bibliografía y enlaces interesantes: