# 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

- 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).

### 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] 12.974315  8.529455 16.737582 10.455446  7.506414  7.632348 11.985472
    #>  [8]  7.827186  8.418217  8.597877 12.690399 13.461670  5.371033  6.974942
    #> [15]  8.134798 11.198297  9.759244  8.519278 11.492714 11.119023  7.286995
    #> [22] 10.450008  9.355977 10.852709 11.373146 11.883653  8.579663  6.191612
    #> [29] 10.087867  6.388917  8.726519  8.125192  8.400049 11.081015 13.315741
    #> [36]  5.058028  9.090409  9.468838 10.492466  9.036909 14.472023  9.647497
    #> [43] 12.310186  9.422588  8.385316  9.169412  7.828620  9.633153  6.047684
    #> [50] 10.174506

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] 9.662586

    sd(medias) # la desviacion tipica de las medias

    #> [1] 0.3215283

### 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] 5.919652 4.570945 5.630471 4.310711 7.243816 4.251805 4.411721
    #>  [8] 2.630940 5.026003 4.782486 5.028920 5.334170 6.034600 4.390639
    #> [15] 6.497660 5.130898 4.113413 4.340473 6.012232 4.057664 4.684690
    #> [22] 4.869224 5.436422 5.633505 5.340338 5.027130 5.667826 6.326682
    #> [29] 6.348475 3.545851 3.288954 3.793642 6.006485 5.545246 7.342326
    #> [36] 3.988086 7.305356 4.128686 3.001349 5.346502 4.672858 6.223533
    #> [43] 7.170885 6.322607 4.354730 5.064345 5.438937 4.723230 5.256104
    #> [50] 4.580947 4.930080 5.718846 4.522421 3.170703 6.434204 6.130261
    #> [57] 4.570274 4.181364 4.955013 3.791760 4.971282 5.691414 2.729749
    #> [64] 5.224100 3.289096 4.857872 4.503420 4.360685 4.659494 2.982557

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.916152

    sd(medianas) # la desviacion tipica de las medianas

    #> [1] 0.1519076

### 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.062426 10.300314

    quantile(medianas, c(0.025, 0.975))

    #>     2.5%    97.5%
    #> 4.620220 5.240102

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

- 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.

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

- 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.

### 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]  9.266757 10.425875 13.538996 10.653615  6.767040  9.020870  7.895070
    #>  [8] 14.421386  8.958914 12.382806 12.122275  8.613311  7.974057  6.080576
    #> [15] 10.388721  9.436301  8.585377  5.990973  8.810554  7.327600  8.412881
    #> [22]  8.745549 10.799474  9.143090 10.418064  8.901424 11.631347  8.942747
    #> [29] 10.359440 12.897123 11.877831 10.299888 11.283511  9.912507 10.378823
    #> [36]  9.233205  6.774801  9.120112 12.694063  8.753765 10.383905 10.290908
    #> [43] 12.435533  8.861161 10.700612  9.358490  8.598181 13.694865 11.760912
    #> [50]  9.948069

    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] 9.909813

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

    sd( replicas $t)

    #> [1] 0.271783

Valor del estadístico en la muestra original:

    replicas$t0

    #> [1] 9.905467

Calculamos el sesgo:

    sesgo=abs(mean(replicas$t)- (replicas$t0))
    sesgo

    #> [1] 0.004346309

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.359299

    replicas $t0+qt(0.975,df=length(x)-1)*sd(replicas$t)

    #> [1] 10.45164

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.382172 10.445602

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.379, 10.442 )
    #> Calculations and Intervals on Original Scale

## 3. Ejercicios

## 4. Bibliografía y enlaces interesantes:

- 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.