Esta confusión entre los procedimientos bootstrap y los procedimientos Monte Carlo se repite una y otra vez, por lo que quizás éste sea un lugar tan bueno como cualquier otro para abordarla. (Los ejemplos de R
código también puede ayudar con los deberes).
Considere lo siguiente implementación del bootstrap en R
:
boot <- function(x, t) { # Exact bootstrap of procedure t on data x
n <- length(x) # Must lie between 2 and 7 inclusive.
if (n > 7) {
stop("Sample size exceeds 7; use an approximate method instead.")
}
p <- c(n, 1:(n-1))
a <- rep(x, n^(n-1))
dim(a) <- rep(n, n)
y <- as.vector(a)
while (n > 1) {
n <- n-1
a <- aperm(a, p)
y <- cbind(as.vector(a), y)
}
apply(y, 1, t)
}
Un vistazo rápido confirmará que se trata de un determinista cálculo: no se generan ni utilizan valores aleatorios. (Dejaré los detalles de su funcionamiento interno para que los lectores interesados lo averigüen por sí mismos).
Los argumentos para boot
son un lote de datos numéricos en la matriz x
y una referencia t
a una función (que puede aplicarse a matrices exactamente igual que x
) para devolver un único valor numérico; en otras palabras, t
es un estadística . Genera todas las muestras posibles con reemplazo a partir de x
y aplica t
a cada una de ellas, produciendo así un número para cada una de esas muestras: eso es el bootstrap en pocas palabras. El valor devuelto es una matriz que representa el distribución bootstrap exacta de t
para la muestra x
.
Un pequeño ejemplo vamos a hacer un bootstrap de la media de una muestra x
= c(1,3)
:
> boot(c(1,3), mean)
> [1] 1 2 2 3
Efectivamente, hay cuatro muestras posibles de tamaño $2$ con sustitución de $(1,3)$ a saber, $(1,1)$ , $(1,3)$ , $(3,1)$ y $(3,3)$ . boot
los genera todos (en el orden que se acaba de enumerar) y aplica t
a cada uno de ellos. En este caso t
calcula la media y resultan ser $1$ , $2$ , $2$ y $3$ respectivamente, como se muestra en la salida.
A partir de aquí, depende de cómo quieras utilizar el bootstrap. En completo La información sobre el bootstrap está contenida en esta matriz de salida, por lo que suele ser una buena idea mostrarla. He aquí un ejemplo en el que la desviación estándar se obtiene por bootstrap a partir de la muestra $(1,3,3,4,7)$ :
hist(boot(c(1,3,3,4,7), sd))
Ahora estamos preparados para hablar de Simulación Monte Carlo. Supongamos, por ejemplo, que vamos a hacer un bootstrap de un límite de confianza superior del 95% de la DE a partir de una muestra de $5$ utilizando el percentil 95 superior de su distribución bootstrap. ¿Qué propiedades tendría este procedimiento? Una forma de averiguarlo es supongamos que la muestra se obtuvieron aleatoriamente a partir de, por ejemplo, una distribución uniforme. (La aplicación indicará a menudo cuál puede ser una hipótesis de distribución razonable; aquí, he elegido arbitrariamente una que es sencilla para el cálculo pero no fácil de tratar analíticamente). Podemos simular lo que ocurre tomando una muestra de este tipo y calculando el UCL:
> set.seed(17)
> quantile(boot(runif(5, min=0, max=10), sd), .95)[1]
95%
3.835870
El resultado para este muestra aleatoria particular es 3,83587. Esto es definitivo: si se llamara boot
de nuevo con el mismo conjunto de datos, la respuesta sería exactamente la misma. Pero, ¿cómo podría cambiar la respuesta con diferentes muestras aleatorias? Averígualo repitiendo este proceso unas cuantas veces y dibujando un histograma de los resultados:
> boot.sd <- replicate(100, quantile(boot(runif(5, min=0, max=10), sd), .95)[1])
> hist(boot.sd)
Si hiciéramos otra serie de simulaciones, las extracciones aleatorias serían diferentes, creando un histograma (ligeramente) distinto, pero no muy diferente de éste. Podemos usarlo con cierta confianza para entender cómo funciona el bootstrap UCL de la DE. Como referencia, observe que la desviación estándar de una distribución uniforme (que abarca el intervalo de $0$ a $10$ como se especifica aquí) es igual a $10/\sqrt{12} \approx 2.887$ . Como cabría esperar de cualquier UCL que se precie, la mayoría (tres cuartas partes, o 0,75) de los valores del histograma lo superan:
> length(boot.sd[boot.sd >= 10/sqrt(12)]) / length(boot.sd)
[1] 0.75
Pero eso no es ni de lejos el 95% nominal que especificamos (y que esperábamos). Este es uno de los valores de la simulación: compara nuestras esperanzas con lo que realmente ocurre. (¿A qué se debe esta discrepancia? Creo que se debe a que el bootstrapping de una DE no funciona bien con muestras realmente pequeñas).
Consulte
-
Los estadísticos bootstrap son conceptualmente iguales a cualquier otro estadístico, como la media o la desviación estándar; sólo que tienden a tardar mucho en calcularse. (Véase el mensaje de advertencia en la página boot
código!)
-
La simulación Monte-Carlo puede ser útil para estudiar cómo varía una estadística bootstrap debido a la aleatoriedad en la obtención de muestras. La variación observada en dicha simulación se debe a la variación en las muestras, no variación en el bootstrap.
-
(No se ilustra aquí) Dado que las estadísticas bootstrap pueden requerir muchos cálculos (al parecer, hasta $n^n$ cálculos para muestras de tamaño $n$ ), es conveniente aproximado la distribución bootstrap. Esto se suele hacer creando un programa "caja negra" para obtener un valor al azar de la distribución bootstrap verdadera y llamando a ese programa repetidamente. El resultado colectivo se aproxima a la distribución exacta. La aproximación puede variar debido a la aleatoriedad de la caja negra, pero esa variación es un artefacto del procedimiento de aproximación. No es (conceptualmente) inherente al propio procedimiento bootstrap.