1 Introducción al bootstrap

Datos tomados de (http://college.cengage.com/mathematics/brase/understandable_statistics/7e/students/datasets/)

1.1 Fasting Glucose Blood Tests

The following data represents glucose blood level (mg/100ml) after a 12 hour fast for a random sample of 70 women. Reference: American J. Clin. Nutr. Vol. 19, 345-351

datos = read.csv("svls05.csv", header=T)
str(datos)
## 'data.frame':    70 obs. of  1 variable:
##  $ GLUCOSE: int  45 66 83 71 76 64 59 59 76 82 ...

Por comodidad, guardamos los datos en una variable nueva:

glucosa = datos$GLUCOSE
hist(glucosa)

El nivel medio de glucosa es:

mean(glucosa)
## [1] 77.98571

Si solo tuviésemos una muestra de 10 datos, hubiésemos obtenido:

ndatos = 10
set.seed(99) # semilla para los numeros aleatorios
muestra1 = sample(glucosa,ndatos,replace = F) # muestreo sin reemplazamiento
mean(muestra1)
## [1] 82.9

¿Con qué precisión hemos estimado la media? En teoría

\[ SE(media) = \frac{\sigma}{\sqrt{n}} \]

var_n = var(muestra1)*(ndatos-1)/ndatos # varianza dividiendo por n, y no por (n-1)
sqrt(var_n/ndatos)
## [1] 4.126621

Para comprobarlo podemos seleccionar muchas muestras de 10 datos y calcular:

nmuestras = 1000
media_M = rep(0, nmuestras)
for (n in 1:nmuestras){
  muestra_n = sample(glucosa,ndatos,replace = F) # muestreo sin reemplazamiento
  media_M[n] = mean(muestra_n)
}
hist(media_M)

sd(media_M)
## [1] 3.640443

Como solo tenemos una (muestra1), muestreamos con reemplazamiento (bootstrap)

nB = 10000
media_B = rep(0, nB)
for (n in 1:nB){
  muestra_B = sample(muestra1,ndatos,replace = T) # muestreo sin reemplazamiento
  media_B[n] = mean(muestra_B)
}
c(sd(media_M),sd(media_B))
## [1] 3.640443 4.069297

En este caso, la estimación del SE es mejor con bootstrap que con la fórmula teórica.