Francisco García García (2014-10-12)
La inferencia estadística se basa en la distribución de los diferentes estadísticos. Esta distribución la conocemos al seleccionar diferentes muestras de tamaño n de la misma población.
La distribución de un estadístico se obtiene al observar sus valores en muchas muestras de la población.
La técnica de bootstrap consiste en obtener la distribución de un estadístico (al menos de forma aproximada) utilizando la información que se deriva de una sola muestra (y sus réplicas).
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.
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
qqnorm(medias, datax=T) #papel probabilistico normal
mean(medias) # el centro de la distribucion de las medias
#> [1] 10.06803
sd(medias) # la desviacion tipica de las medias
#> [1] 0.2808914
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
qqnorm(medianas, datax=T) #papel probabilistico normal
mean(medianas) # el centro de la distribucion de las medianas
#> [1] 4.810627
sd(medianas) # la desviacion tipica de las medianas
#> [1] 0.1460738
No necesitamos la condición de normalidad en la que se basan las técnicas de inferencia paramétricas.
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.
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.
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.
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
Las condiciones para utilizar estos intervalos no están perfectamente definidas (son muy generales).
Comprueba que los intervalos obtenidos son razonables comparándolos.
Si el sesgo de la distribución bootstrap es pequeño y la distribución es normal, ambos intervalos deberían ser muy similares.
Los intervalos basados en percentiles son preferibles a los basados en t si la distribución bootstrap no es normal. Son más precisos que los basados en t cuando el sesgo es pequeño.
Si los intervalos t y los basados en percentiles no coinciden, un buen consejo es no fiarse de ninguno.
Existen métodos más elaborados basados en la técnica de bootstrap que mejoran sustancialmente su fiabilidad al aumentar el tamaño de la muestra.
Los intervalos BCa (bias-corrected accelerated) basados en la técnica de bootstrap son una modificación de los intervalos basados en percentiles que realizan los ajustes necesarios para corregir el sesgo y la asimetría.
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)
qqnorm(replicas$t, datax=T)
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
Quick-R Web con recursos para trabajar con R.
r-tutor An R Introduction to Statistics.
Jeffrey R. Harring Andrew S. Zieffler y Jeffrey D. Long. Comparing groups - Randomization and bootstrap methods using R. 1st Ed. JohnWiley y Sons, 2011.
George P. McCabe David S. Moore y Bruce A. Craig. Introduction to the practice of statistics. 7th. New York: W.H. Freeman y Company, 2012.