6 Bootstrap
6.1 Bootstrap y el principio de sustitución (plug-in)
El bootstrap es un método muy versátil para aproximar la distribución en el muestreo de un estadístico, y en particular calcular el error típico de un estimador. Bradley Efron lo introdujo en 1979. La potencia del método procede de combinar técnicas de simulación con el principio de sustitución o plug-in. Este principio es muy simple, consiste en reemplazar la verdadera distribución de los datos por la distribución empírica muestral para estimar cualquier cantidad que dependa de
La palabra bootstrap alude a una de las aventuras del Barón de Münchausen, escritas en el siglo XVIII por R. E. Raspe, según la cual el Barón cayó a las aguas de un profundo lago y consiguió salir tirando de los cordones de sus botas (de donde procede la expresión en inglés to pull oneself up by one’s own bootstrap) o de su coleta en otras versiones.
Vamos a aplicar ahora el principio de sustitución de forma más ambiciosa, con el objetivo de estimar la distribución de un estadístico de la forma
Como hemos dicho, el bootstrap esencialmente consiste en sustituir
En la práctica, es necesario poder calcular
En resumen, el procedimiento a seguir es:
- Se estima
mediante . (Principio de sustitución o plug-in.) - Se obtienen
muestras bootstrap ( ) procedentes de la distribución , sorteando con reemplazamiento entre los datos originales . - Se calcula
( ) para cada una de las muestras bootstrap. - Para cada
fijo se calcula la proporción .
El proceso anterior implica dos aproximaciones diferentes:
El mismo algoritmo sirve esencialmente para estimar cualquier aspecto de la distribución, en lugar de la función de distribución completa. Por ejemplo, muchas veces lo que interesa es estimar la varianza o la desviación típica de un estimador
Ejemplo: el error típico de la mediana para datos de la distribución de Cauchy
Supongamos que
set.seed(100)
# Parámetros
<- 30
n <- 1
theta
# Generamos los datos
<- rt(n, 1) + theta # Cauchy con theta = 0 coincide con t Student con 1 gl
muestra_original <- median(muestra_original) mediana_original
Imaginemos primero que la distribución es conocida completamente (lo que no es muy realista). En este caso la muestra no hace falta para nada. Para aproximar la desviación típica de la mediana bastaría obtener un número grande de muestras de tamaño 30 de la ditribución de Cauchy con
<- 1000
B <- matrix(rt(n*B, 1) + theta, nrow = n) # cada columna una muestra
muestras <- apply(muestras, 2, median) # calcula la mediana de cada columna
medianas sd(medianas)
#> [1] 0.2799922
En realidad no podemos suponer que conocemos la distribución. En un contexto paramétrico sí podemos suponer que la distribución es de Cauchy, pero que el valor de
<- 1000
B <- median(muestra_original)
theta_estimado <- matrix(rt(n*B, 1) + theta_estimado, nrow = n) # cada columna una muestra
muestras <- apply(muestras, 2, median) # calcula la mediana de cada columna
medianas sd(medianas)
#> [1] 0.2893767
El resultado obtenido es muy similar. A este procedimiento en el que se asume un modelo paramétrico
Cuando no estamos dispuestos a asumir un modelo paramétrico, aplicamos el principio de sustitución de la forma como hemos descrito anteriormente y en lugar de generar muestras de la distribución de Cauchy, las generamos de la empírica de la muestra original:
# Generamos las remuestras (matriz n x B, cada columna una remuestra)
<- sample(muestra_original, n*B, rep = TRUE)
muestras_bootstrap <- matrix(muestras_bootstrap, nrow = n)
muestras_bootstrap
# Medianas de las remuestras
<- apply(muestras_bootstrap, 2, median)
medianas_bootstrap
# Estimador bootstrap del error típico de la mediana
<- sd(medianas_bootstrap)
sd_mediana
sd_mediana#> [1] 0.3355713
Vemos que se obtiene 0.336, que no es muy diferente al obtenido en el caso en que se suponía conocida la distribución o la familia paramétrica, solo unas centésimas de diferencia. Esta es la magia del bootstrap. De hecho, una vez que tenemos todas las medianas artificiales podemos usarlas para aproximar la distribución completa de la mediana muestral, no solo su error típico:
# Histograma de las medianas bootstrap
<- data.frame(medianas_bootstrap = medianas_bootstrap)
df ggplot(df) +
geom_histogram(aes(x = medianas_bootstrap, y = ..density..),
bins = 10, fill = 'olivedrab4', col = 'black') +
geom_vline(xintercept = mediana_original, size = 1.1)
La alternativa clásica al bootstrap es la teoría asintótica. Recordemos que en la sección 2.6.4 demostramos la fórmula (2.1):
Para la distribución de Cauchy (centrada en
Superponemos a continuación, la distribución normal aproximada al histograma de medianas bootstrap que habíamos obtenido:
<- data.frame(medianas_bootstrap = medianas_bootstrap)
df ggplot(df) +
geom_histogram(aes(x = medianas_bootstrap, y = ..density..),
bins = 10, fill = 'olivedrab4', col = 'black') +
geom_vline(xintercept = mediana_original, size = 1.1) +
geom_function(fun = dnorm,
args = list(mean = mediana_original, sd = .5*pi/sqrt(n)),
linetype = 2, size = 1.1)
Este gráfico motiva una reflexión sobre el papel desempeñado por las matemáticas en la inferencia estadística. Su papel clásico era el de proporcionar aproximaciones (TCL) o fórmulas cerradas que hicieran posibles los cálculos. En la actualidad estas aproximaciones son menos necesarias ya que como vemos se pueden sustituir por cálculos intensivos. No obstante, el papel de las matemáticas sigue siendo fundamental para interpretar los resultados, descubrir nuevos métodos y establecer las condiciones bajo las que los métodos funcionan. Por ejemplo, ¿es el bootstrap consistente en este caso? ¿Podemos demostrar que, en algún sentido, la diferencia entre el histograma y la distribución asintótica converge a cero al aumentar el tamaño muestral?
6.2 Consistencia
6.2.1 ¿Qué significa que el bootstrap es consistente?
Como muestra el ejemplo anterior, el bootstrap nos ha permitido reemplazar un TCL para la mediana, que no es trivial de obtener, por cálculos llevados a cabo con el ordenador. Sin embargo, garantizar la validez asintótica del procedimiento no es siempre fácil.
Recordemos que en general queremos garantizar que la primera aproximación de la ecuación (6.1) se cumple para
Dada una distancia entre distribuciones de probabilidad
Uno de los primeros resultados de validez asintótica del bootstrap se refiere a la estimación de la distribución de la media muestral. Se puede encontrar en (Singh, 1981). y lo enunciamos aquí sin demostración:
Teorema 6.1 Supongamos
Resultados muy generales de validez del bootstrap para la mediana se pueden encontrar en Ghosh et al (1984). Enunciamos aquí uno de ellos:
Teorema 6.2 Sea
Según el resultado anterior, el estimador bootstrap de la varianza converge con probabilidad uno al valor que obtendríamos usando la distribución asintótica, pero el bootstrap no requiere conocer la función de densidad
La distribución de Cauchy verifica la condición del teorema ya que si
6.2.2 ¿Cuándo falla el bootstrap?
El método bootstrap no siempre es consistente. La situación típica en la que falla es aquella en la que el estadístico
, pero , por lo que no podemos usar el TCL. , pero no es derivable en , con lo que no es aplicable el método delta. , pero , y no se aplican los resultados asintóticos disponibles para estadísticos de orden.- La distribución de los datos es
y el soporte de depende del parámetro.
Vamos a ver un ejemplo de esta última situación. Sean
6.3 Intervalos de confianza bootstrap
Una vez que hemos estimado la distribución en el muestreo de
6.3.1 Método basado en la aproximación normal
Este es el método más sencillo de usar bootstrap para calcular un intervalo de confianza. Si la distribución de
Ejemplo: distribución de Cauchy (continuación)
En el caso de la muestra de una distribución de Cauchy, cuyo error típico calculamos con bootstrap en un ejemplo anterior, este intervalo quedaría de la siguiente manera:
<- 0.05
alfa <- qnorm(1 - alfa/2)
z c(mediana_original - z*sd_mediana, mediana_original + z*sd_mediana)
#> [1] 0.4382376 1.7536529
Dado que sabemos que el valor del parámetro es
6.3.2 Remuestreo de una cantidad pivotal
Si la distribución de
- Ordenar todos los valores simulados
- Seleccionar los percentiles que dejan una proporción de valores
a su izquierda y a su derecha - Utilizar estos valores en la fórmula anterior en el lugar de
y , respectivamente.
En algunos libros a este método se le llama método bootstrap híbrido.
Ejemplo: distribución de Cauchy (continuación)
En el siguiente ejemplo se aplica el método bootstrap híbrido para calcular un intervalo de confianza (nivel de confianza nominal
set.seed(100)
# Parámetros
<- 1000
R <- 30
n <- 1
theta <- 100
m <- 0.05
alfa
# Cálculo de los intervalos
<- NULL
acierto <- NULL
intervalo for (i in 1:m){
<- rt(n, 1) + theta
muestra_original <- median(muestra_original)
mediana_original
<- sample(muestra_original, n*R, rep = TRUE)
muestras_bootstrap <- matrix(muestras_bootstrap, nrow = n)
muestras_bootstrap <- apply(muestras_bootstrap, 2, median)
medianas_bootstrap <- sqrt(n) * (medianas_bootstrap - mediana_original)
T_bootstrap <- mediana_original - quantile(T_bootstrap, 1-alfa/2)/sqrt(n)
ic_min <- mediana_original - quantile(T_bootstrap, alfa/2)/sqrt(n)
ic_max <- rbind(intervalo, c(ic_min, ic_max))
intervalo <- c(acierto, ic_min < theta & ic_max > theta)
acierto
}
# Gráfico
<- data.frame(ic_min <- intervalo[,1],
df <- intervalo[, 2],
ic_max ind = 1:m,
acierto = acierto)
ggplot(df) +
geom_linerange(aes(xmin = ic_min, xmax = ic_max, y = ind, col = acierto)) +
scale_color_hue(labels = c("NO", "SÍ")) +
geom_vline(aes(xintercept = theta), linetype = 2) +
theme_bw() +
labs(y = 'Muestras', x = 'Intervalos (nivel 0.95)',
title = 'IC (método bootstrap híbrido)')
En el gráfico anterior, se han representado gráficamente los intervalos obtenidos. Se usa el color rojizo en el caso de que el intervalo no contiene al parámetro. Esto ha ocurrido en 8 de los 100 intervalos (el nivel teórico es del 5 %).
Existen otros métodos más refinados para obtener intervalos de confianza mediante bootstrap. Una alternativa es basar el intervalo bootstrap en el remuestreo de una versión estudentizada del tipo
6.3.3 Método del percentil bootstrap
Este método se basa en usar los percentiles de los valores bootstrap generados del estimador para construir el intervalo. Más concretamente,
- Generamos
- Sea
el percentil de los valores bootstrap, es decir, el valor tal que - El intervalo es
Veamos una situación en la que el uso de este método es conveniente: supongamos que existe una transformación monótona creciente
Supongamos que la transformación
Ejemplo: un intervalo de confianza para el coeficiente de correlación
Este es un ejemplo clásico, en el sentido de que lo eligió Efron para ilustrar su método. Nosotros lo adaptaremos a un conjunto de datos de notas en 2009 y 2010 de una prueba al final de primaria en más de 1000 colegios de la Comunidad de Madrid. El siguiente código carga todos los datos y selecciona 100 de ellos aleatoriamente:
set.seed(100)
<- 100
n
<- read_table("http://verso.mat.uam.es/~joser.berrendero/datos/notas.txt",
colegios locale = locale(decimal_mark = ",")) %>%
mutate(tipo = factor(tipo)) %>%
slice_sample(n = n) # selecciona n colegios aleatoriamente
El objetivo es calcular un intervalo de confianza del coeficiente de correlación entre las notas de 2009 y 2010 a partir de los 100 colegios seleccionados. La distribución del coeficiente de correlación muestral es bastante asimétrica, por lo que tradicionalmente la inferencia se basa en la transformación
La correlación y la correlación transformada para los colegios de la muestra son:
<- cbind(colegios$nota09, colegios$nota10)
datos_xy <- cor(datos_xy)[1,2]
correlacion <- 0.5 * log ((1+correlacion)/(1-correlacion))
correlacion_fisherz
round(c(correlacion, correlacion_fisherz), 2)
#> [1] 0.56 0.63
A continuación, calculamos un número grande de correlaciones bootstrap y representamos la distribución bootstrap de las correlaciones transformadas junto con la aproximación normal. Con ello comprobamos que la aproximación (6.2) se cumple en este caso, es decir,
<- 1000 # número de remuestras
R
<- replicate(R, cor(datos_xy[sample(1:n, n, rep=TRUE),])[1,2])
corr_bootstrap <- 0.5*log((1+corr_bootstrap)/(1-corr_bootstrap))
corr_bootstrap_fisherz
<- data.frame(corr_bootstrap, corr_bootstrap_fisherz)
df
ggplot(df) +
geom_histogram(aes(x=corr_bootstrap_fisherz, y=..density..),
fill='olivedrab4',
col='black',
bins = 20) +
labs(x = 'Correlaciones bootstrap transformadas', y = NULL) +
geom_vline(xintercept = correlacion_fisherz, col = 'red') +
geom_function(fun = dnorm,
args = list(mean=correlacion_fisherz, sd = 1/sqrt(n-3)),
size = 1.2)
Quizá las colas pesan un poco más de lo que deberían pero vamos a considerar suficiente el grado de aproximación. Según hemos observado, en estas circunstancias el intervalo del percentil bootstrap debería ser similar al intervalo de la transformada
<- 0.05 # 1 - nivel de confianza
alpha
# IC basado en el percentil bootstrap
round(c(quantile(corr_bootstrap, alpha/2), quantile(corr_bootstrap, 1-alpha/2)), 2)
#> 2.5% 97.5%
#> 0.37 0.70
# IC basado en la transformación z de Fisher
<- c(correlacion_fisherz - qnorm(1-alpha/2)/sqrt(n-3),
IC_phi + qnorm(1-alpha/2)/sqrt(n-3))
correlacion_fisherz <- (exp(2*IC_phi) - 1) / (exp(2*IC_phi) + 1)
IC_rho round(IC_rho, 2)
#> [1] 0.40 0.68
Como vemos, ambos intervalos son similares pero el bootstrap presenta la gran ventaja de que no es necesario conocer la transformada ni el valor de la varianza asintótica. El coeficiente para todos los colegios es igual a 0.53 con lo que los intervalos calculados con la muestra de 100 contienen al “verdadero valor del parámetro”.
6.4 Ejercicios
Ejercicio 6.1 Se extrae una remuestra bootstrap de una muestra de
- Calcula la probabilidad de que una observación prefijada,
, no aparezca en la muestra bootstrap. - Calcula el límite de esta probabilidad si
.
Ejercicio 6.2 Sea
Ejercicio 6.3 Dada una muestra de
Aplica la expresión obtenida al caso
Ejercicio 6.4 Sea
Este ejercicio muestra la validez asintótica del llamado bootstrap paramétrico para el estimador de máxima verosimilitud, en un caso en el que el bootstrap no paramétrico no funciona.
Ejercicio 6.5 Sean
- Para
, demuestra que - Como consecuencia, demuestra que
Este ejercicio demuestra que para estimar la varianza y la distribución de los estadísticos de orden mediante bootstrap no es necesario el remuestreo. Esto se aplica en particular a la mediana.
(Indicación: consulta las propiedades de la función beta incompleta y su relación con la función de distribución de una v.a. binomial.)
Ejercicio 6.6 Consideremos la siguiente muestra de tamaño
<- c(1, 2, 3.5, 4, 7, 7.3, 8.6, 12.4, 13.8, 18.1) muestra
Sea
Calcula
Ejercicio 6.7 Para la muestra del ejercicio 6.6 se verifica
<- c(1, 2, 3.5, 4, 7, 7.3, 8.6, 12.4, 13.8, 18.1)
muestra var(muestra)
#> [1] 30.84233
- Usa bootstrap para determinar el error típico de este estimador de
. - Compara el resultado con el error típico que darías si, por ejemplo, supieras que los datos proceden de una distribución normal.
- Calcula un intervalo de confianza para
usando el método bootstrap híbrido. Fija .
Ejercicio 6.8 Sea
6.5 Referencias
James et al. (2013) presenta una perspectiva aplicada del bootstrap. Para profundizar en las relaciones del bootstrap con otros métodos se puede consultar Efron y Hastie (2016). DasGupta (2008) contiene un buen resumen de las propiedades de consistencia. En general, la comparación teórica de las propiedades de los intervalos es técnicamente complicada y se basa en desarrollos de Edgeworth. La referencia clásica para este tema es Hall (1992). Una monografía clásica sobre bootstrap es Efron y Tibshirani (1994).
- DasGupta, A. (2008). Asymptotic theory of statistics and probability. Springer.
- Efron, B. y Hastie, T. (2016). Computer Age Statistical Inference. Cambridge University Press.
- Efron, B., y Tibshirani, R.J. (1994). An introduction to the bootstrap. CRC press.
- Hall, P. (1992). The bootstrap and Edgeworth expansion. Springer.
- James, G., Witten, D., Hastie, T. y Tibshirani, R. (2013). An introduction to statistical learning. Springer.