El bootstrap es un método de inferencia sobre una población a partir de datos muestrales. Bradley Efron lo presentó por primera vez en este artículo en 1979. El bootstrap se basa en remuestrear con reemplazo a partir de los datos de la muestra. Esta técnica permite estimar el error estándar de cualquier estadístico y obtener su intervalo de confianza (IC). Es especialmente útil cuando el IC no tiene una forma cerrada o esta es muy compleja.
\n
Supongamos que tenemos una muestra de n elementos: X = {x1, x2, …, xn} y nos interesa el IC de algún estadístico T = t(X). El esquema del bootstrap es directo. Repetimos R veces lo siguiente: en la repetición i-ésima, muestreamos con reemplazo n elementos de la muestra disponible (algunos se elegirán más de una vez). Llamamos a esta nueva muestra la muestra bootstrapi-ésima, Xi, y calculamos el estadístico deseado Ti = t(Xi).
\n
Como resultado, obtenemos R valores de nuestro estadístico: T1, T2, …, TR. Los llamamos realizaciones bootstrap de T o la distribución bootstrap de T. A partir de ella, podemos calcular un IC para T. Hay varias formas de hacerlo; usar percentiles suele ser la más sencilla.
\n
Bootstrap en acción
\n
Usemos (otra vez) el conocido conjunto de datos iris. Echa un vistazo a las primeras filas:
Imagina que queremos obtener IC para la mediana de Sepal.Length, la mediana de Sepal.Width y el coeficiente de correlación por rangos de Spearman entre ambas. Usaremos el paquete boot de R y una función llamada… boot. Para aprovechar su potencial debemos crear una función que calcule nuestro(s) estadístico(s) a partir de los datos remuestreados. Debe tener al menos dos argumentos: un dataset y un vector con los indices de los elementos del conjunto de datos que se eligieron para crear una muestra bootstrap.
\n
Si queremos calcular IC para más de un estadístico a la vez, nuestra función debe devolverlos en un único vector.
\n
En nuestro ejemplo podría verse así:
\n
library(boot)\n\nfoo <-function(data, indices){\n dt<-data[indices,]\n c(\n cor(dt[,1], dt[,2], method='s'),\n median(dt[,1]),\n median(dt[,2])\n )\n}Con la tecnología de
\n
foo elige los elementos deseados (cuyos números están en indices) de data y calcula el coeficiente de correlación de las dos primeras columnas (method='s' selecciona el coeficiente de Spearman; con method='p' obtendrías el de Pearson) y sus medianas.
\n
También podemos añadir argumentos extra; por ejemplo, dejar que el usuario elija el tipo de coeficiente de correlación:
\n
foo <-function(data, indices, cor.type){\n dt<-data[indices,]\n c(\n cor(dt[,1], dt[,2], method=cor.type),\n median(dt[,1]),\n median(dt[,2])\n )\n}Con la tecnología de
\n
Para hacer este tutorial más general, usaré la última versión de foo.
\n
Ahora podemos usar la función boot. Tenemos que pasarle el nombre del conjunto de datos, la función que acabamos de crear, el número de repeticiones (R) y cualquier argumento adicional de nuestra función (como cor.type). Abajo uso set.seed para que el ejemplo sea reproducible.
\n
set.seed(12345)\nmyBootstrap <- boot(iris, foo, R=1000, cor.type='s')Con la tecnología de
\n
La función boot devuelve un objeto de clase… (sí, ¡lo has adivinado!) boot. Tiene dos elementos interesantes. $t contiene los R valores de nuestro(s) estadístico(s) generados por el procedimiento bootstrap (las realizaciones bootstrap de T):
Imprimir el objeto boot en la consola proporciona más información:
\n
myBootstrap\n\n##\n## ORDINARY NONPARAMETRIC BOOTSTRAP\n##\n##\n## Call:\n## boot(data = iris, statistic = foo, R = 1000, cor.type = \"s\")\n##\n##\n## Bootstrap Statistics :\n## original bias std. error\n## t1* -0.1667777 0.002546391 0.07573983\n## t2* 5.8000000 -0.013350000 0.10295571\n## t3* 3.0000000 0.007900000 0.02726414Con la tecnología de
\n
original es lo mismo que $t0. bias es la diferencia entre la media de las realizaciones bootstrap (las de $t), llamada estimación bootstrap de T, y el valor en el conjunto de datos original (el de $t0).
\n
colMeans(myBootstrap$t)-myBootstrap$t0\n\n## [1] 0.002546391 -0.013350000 0.007900000Con la tecnología de
\n
std. error es el error estándar de la estimación bootstrap, que equivale a la desviación estándar de las realizaciones bootstrap.
\n
apply(myBootstrap$t,2,sd)\n\n## [1] 0.07573983 0.10295571 0.02726414Con la tecnología de
\n
Tipos de IC bootstrap
\n
Antes de ponernos con los IC, siempre conviene mirar la distribución de las realizaciones bootstrap. Podemos usar la función plot, con index indicando a cuál de los estadísticos calculados en foo queremos mirar. Aquí index=1 es el coeficiente de correlación de Spearman entre la longitud y la anchura del sépalo, index=2 es la mediana de la longitud del sépalo e index=3 es la mediana de la anchura del sépalo.
La distribución de los coeficientes de correlación bootstrap parece bastante normal. Busquemos su IC. Podemos usar boot.ci. Por defecto calcula IC al 95%, aunque se puede cambiar con el parámetro conf.
\n
boot.ci(myBootstrap, index=1)\n\n## Warning in boot.ci(myBootstrap, index = 1): bootstrap variances needed for\n## studentized intervals\n\n## BOOTSTRAP CONFIDENCE INTERVAL CALCULATIONS\n## Based on 1000 bootstrap replicates\n##\n## CALL :\n## boot.ci(boot.out = myBootstrap, index = 1)\n##\n## Intervals :\n## Level Normal Basic \n## 95% (-0.3178, -0.0209 ) (-0.3212, -0.0329 ) \n##\n## Level Percentile BCa \n## 95% (-0.3007, -0.0124 ) (-0.3005, -0.0075 ) \n## Calculations and Intervals on Original ScaleCon la tecnología de
\n
boot.ci proporciona 5 tipos de IC bootstrap. Uno de ellos, el intervalo studentized, es especial: necesita una estimación de la varianza bootstrap. No la proporcionamos, así que R muestra el aviso: bootstrap variances needed for studentized intervals. Las estimaciones de varianza pueden obtenerse con un bootstrap de segundo nivel o (más fácil) con la técnica jackknife. Esto queda fuera del alcance de este tutorial, así que centrémonos en los otros cuatro tipos de IC bootstrap.
\n
Si no queremos verlos todos, podemos elegir los relevantes en el argumento type. Los valores posibles son norm, basic, stud, perc, bca o un vector con varios de ellos.
\n
boot.ci(myBootstrap, index=1, type=c('basic','perc'))\n\n## BOOTSTRAP CONFIDENCE INTERVAL CALCULATIONS\n## Based on 1000 bootstrap replicates\n##\n## CALL :\n## boot.ci(boot.out = myBootstrap, type = c(\"basic\", \"perc\"), index = 1)\n##\n## Intervals :\n## Level Basic Percentile \n## 95% (-0.3212, -0.0329 ) (-0.3007, -0.0124 ) \n## Calculations and Intervals on Original ScaleCon la tecnología de
\n
La función boot.ci crea un objeto de clase… (sí, ¡lo has adivinado!) bootci. Sus elementos se llaman igual que los tipos de IC usados en el argumento type. $norm es un vector de 3 elementos que contiene el nivel de confianza y los límites del IC.
\n
boot.ci(myBootstrap, index=1, type='norm')$norm\n\n## conf \n## [1,] 0.95 -0.3177714 -0.02087672Con la tecnología de
\n
$basic, $stud, $perc y $bca son vectores de 5 elementos que también incluyen los percentiles usados para calcular el IC (volveremos a esto más adelante):
\n
boot.ci(myBootstrap, index=1, type='basic')$basic\n\n## conf \n## [1,] 0.95 975.98 25.03 -0.3211981 -0.03285178Con la tecnología de
\n
Un poco de notación (¡perdón!)
\n
Para entender qué son los distintos tipos de IC, necesitamos introducir algo de notación. Sea:
\n
\n
t⋆ la estimación bootstrap (media de las realizaciones bootstrap),
\n
t0 el valor de nuestro estadístico en el conjunto de datos original,
\n
se⋆ el error estándar de la estimación bootstrap,
\n
b el sesgo de la estimación bootstrap, b = t⋆ − t0
\n
α el nivel de confianza, típicamente α = 0.95,
\n
zα el cuantil $1-\\frac \\alpha 2$ de la distribución normal estándar,
\n
θα el α-percentil de la distribución de las realizaciones bootstrap.
\n
\n
IC por percentiles
\n
Con la notación anterior, el IC por percentiles es:
\n
(θ(1 − α)/2, θ1 − (1 − α)/2)
\n
es decir, tomamos los percentiles correspondientes. Nada más.
\n
IC normal
\n
Un IC de Wald típico sería:
\n
t0 ± zα ⋅ se⋆
\n
pero en el caso bootstrap conviene corregirlo por sesgo. Así queda:
El IC por percentiles en general no se recomienda porque se comporta mal con distribuciones de colas raras. El IC básico (también llamado pivotal o empirical) es mucho más robusto. La idea es calcular las diferencias entre cada réplica bootstrap y t0 y usar los percentiles de su distribución. Los detalles completos pueden verse, por ejemplo, en All of Statistics de L. Wasserman.
\n
La fórmula final del IC básico es:
\n
(2t0 − θ1 − (1 − α)/2, 2t0 − θ(1 − α)/2)
\n
BCα (bias-corrected and accelerated)
\n
BCα viene de bias-corrected, accelerated. Su fórmula no es muy complicada pero sí poco intuitiva, así que la omitiremos. Consulta el artículo de Thomas J. DiCiccio y Bradley Efron si te interesan los detalles.
\n
La aceleración que menciona el método requiere usar percentiles específicos de las realizaciones bootstrap. A veces puede ocurrir que estos sean percentiles extremos, quizá valores atípicos. En esos casos, BCα puede resultar inestable.
\n
Veamos el IC BCα para la mediana de la anchura del pétalo. En el conjunto de datos original, esta mediana es exactamente 3.
\n
boot.ci(myBootstrap, index=3)\n\n## Warning in boot.ci(myBootstrap, index = 3): bootstrap variances needed for\n## studentized intervals\n\n## Warning in norm.inter(t, adj.alpha): extreme order statistics used as\n## endpoints\n\n## BOOTSTRAP CONFIDENCE INTERVAL CALCULATIONS\n## Based on 1000 bootstrap replicates\n##\n## CALL :\n## boot.ci(boot.out = myBootstrap, index = 3)\n##\n## Intervals :\n## Level Normal Basic \n## 95% ( 2.939, 3.046 ) ( 2.900, 3.000 ) \n##\n## Level Percentile BCa \n## 95% ( 3.0, 3.1 ) ( 2.9, 2.9 ) \n## Calculations and Intervals on Original Scale\n## Warning : BCa Intervals used Extreme Quantiles\n## Some BCa intervals may be unstableCon la tecnología de
\n
Obtenemos un IC BCα (2.9, 2.9). Es raro, pero por suerte R nos avisó con extreme order statistics used as endpoints. Veamos qué ha pasado exactamente:
La distribución de las realizaciones bootstrap es inusual. Una gran mayoría (más del 90%) son 3.
\n
table(myBootstrap$t[,3])\n\n##\n## 2.9 2.95 3 3.05 3.1 3.15 3.2\n## 1 1 908 24 63 1 2Con la tecnología de
\n
En una situación así, la \"aceleración\" del método BCα salta fácilmente a valores extremos. Aquí, el IC por percentiles, que sirve de base para el IC BCα, es (3, 3.1). Al expandirlo \"hacia la izquierda\" tenemos que usar el percentil 0.002. La expansión \"hacia la derecha\" también se va a los extremos: percentil 0.997.
\n
Reproducir los resultados
\n
A veces necesitamos recrear las réplicas bootstrap. Si podemos usar R, no hay problema: la función set.seed lo soluciona. Recrearlas en otro software sería mucho más complicado. Además, para R grandes, recalcular en R puede no ser una opción (por falta de tiempo, por ejemplo).
\n
Podemos afrontarlo guardando los índices de los elementos del conjunto original que formaron cada muestra bootstrap. Esto es lo que hace la función boot.array (con el argumento indices=T).
Si establecemos indices=F (valor por defecto), obtendremos la respuesta a la pregunta: \"¿Cuántas veces apareció cada elemento del conjunto original en cada muestra bootstrap?\". Por ejemplo, en la primera muestra: el primer elemento apareció una vez, el segundo no apareció, el tercero apareció una vez, el cuarto dos veces, y así sucesivamente.
Una tabla así nos permite recrear las realizaciones bootstrap fuera de R. O en el propio R cuando no queremos usar set.seed y repetir todos los cálculos.
\n
onceAgain<-apply(tableOfIndices,1, foo, data=iris, cor.type='s')Con la tecnología de
Este artículo te enseña el significado, las diferencias y los casos de uso adecuados de los intervalos de predicción y los intervalos de confianza en los análisis estadísticos y de regresión. También te muestra cómo implementar estos intervalos en R.
Descubre cómo acceder a los datos de tu marco de datos con el subconjunto. Aprende a hacer subconjuntos utilizando paréntesis o la función subconjunto() de R.
¿Qué es el bootstrap?
\nEl bootstrap es un método de inferencia sobre una población a partir de datos muestrales. Bradley Efron lo presentó por primera vez en este artículo en 1979. El bootstrap se basa en remuestrear con reemplazo a partir de los datos de la muestra. Esta técnica permite estimar el error estándar de cualquier estadístico y obtener su intervalo de confianza (IC). Es especialmente útil cuando el IC no tiene una forma cerrada o esta es muy compleja.
\nSupongamos que tenemos una muestra de n elementos: X = {x1, x2, …, xn} y nos interesa el IC de algún estadístico T = t(X). El esquema del bootstrap es directo. Repetimos R veces lo siguiente: en la repetición i-ésima, muestreamos con reemplazo n elementos de la muestra disponible (algunos se elegirán más de una vez). Llamamos a esta nueva muestra la muestra bootstrap i-ésima, Xi, y calculamos el estadístico deseado Ti = t(Xi).
\nComo resultado, obtenemos R valores de nuestro estadístico: T1, T2, …, TR. Los llamamos realizaciones bootstrap de T o la distribución bootstrap de T. A partir de ella, podemos calcular un IC para T. Hay varias formas de hacerlo; usar percentiles suele ser la más sencilla.
\nBootstrap en acción
\nUsemos (otra vez) el conocido conjunto de datos
\n\niris. Echa un vistazo a las primeras filas:Imagina que queremos obtener IC para la mediana de
\nSepal.Length, la mediana deSepal.Widthy el coeficiente de correlación por rangos de Spearman entre ambas. Usaremos el paquetebootdeRy una función llamada…boot. Para aprovechar su potencial debemos crear una función que calcule nuestro(s) estadístico(s) a partir de los datos remuestreados. Debe tener al menos dos argumentos: undatasety un vector con losindicesde los elementos del conjunto de datos que se eligieron para crear una muestra bootstrap.Si queremos calcular IC para más de un estadístico a la vez, nuestra función debe devolverlos en un único vector.
\nEn nuestro ejemplo podría verse así:
\n\n
\nfooelige los elementos deseados (cuyos números están enindices) dedatay calcula el coeficiente de correlación de las dos primeras columnas (method='s'selecciona el coeficiente de Spearman; conmethod='p'obtendrías el de Pearson) y sus medianas.También podemos añadir argumentos extra; por ejemplo, dejar que el usuario elija el tipo de coeficiente de correlación:
\n\nPara hacer este tutorial más general, usaré la última versión de
\nfoo.Ahora podemos usar la función
\n\nboot. Tenemos que pasarle el nombre del conjunto de datos, la función que acabamos de crear, el número de repeticiones (R) y cualquier argumento adicional de nuestra función (comocor.type). Abajo usoset.seedpara que el ejemplo sea reproducible.La función
\n\nbootdevuelve un objeto de clase… (sí, ¡lo has adivinado!)boot. Tiene dos elementos interesantes.$tcontiene los R valores de nuestro(s) estadístico(s) generados por el procedimiento bootstrap (las realizaciones bootstrap de T):
\n\n$t0contiene los valores de nuestro(s) estadístico(s) en el conjunto de datos original y completo:Imprimir el objeto
\n\nbooten la consola proporciona más información:
\n\noriginales lo mismo que$t0.biases la diferencia entre la media de las realizaciones bootstrap (las de$t), llamada estimación bootstrap de T, y el valor en el conjunto de datos original (el de$t0).
\n\nstd. errores el error estándar de la estimación bootstrap, que equivale a la desviación estándar de las realizaciones bootstrap.Tipos de IC bootstrap
\nAntes de ponernos con los IC, siempre conviene mirar la distribución de las realizaciones bootstrap. Podemos usar la función
\n\nplot, conindexindicando a cuál de los estadísticos calculados enfooqueremos mirar. Aquíindex=1es el coeficiente de correlación de Spearman entre la longitud y la anchura del sépalo,index=2es la mediana de la longitud del sépalo eindex=3es la mediana de la anchura del sépalo.La distribución de los coeficientes de correlación bootstrap parece bastante normal. Busquemos su IC. Podemos usar
\n\nboot.ci. Por defecto calcula IC al 95%, aunque se puede cambiar con el parámetroconf.
\nboot.ciproporciona 5 tipos de IC bootstrap. Uno de ellos, el intervalo studentized, es especial: necesita una estimación de la varianza bootstrap. No la proporcionamos, así queRmuestra el aviso:bootstrap variances needed for studentized intervals. Las estimaciones de varianza pueden obtenerse con un bootstrap de segundo nivel o (más fácil) con la técnica jackknife. Esto queda fuera del alcance de este tutorial, así que centrémonos en los otros cuatro tipos de IC bootstrap.Si no queremos verlos todos, podemos elegir los relevantes en el argumento
\n\ntype. Los valores posibles sonnorm,basic,stud,perc,bcao un vector con varios de ellos.La función
\n\nboot.cicrea un objeto de clase… (sí, ¡lo has adivinado!)bootci. Sus elementos se llaman igual que los tipos de IC usados en el argumentotype.$normes un vector de 3 elementos que contiene el nivel de confianza y los límites del IC.
\n\n$basic,$stud,$percy$bcason vectores de 5 elementos que también incluyen los percentiles usados para calcular el IC (volveremos a esto más adelante):Un poco de notación (¡perdón!)
\nPara entender qué son los distintos tipos de IC, necesitamos introducir algo de notación. Sea:
\n\n- t⋆ la estimación bootstrap (media de las realizaciones bootstrap),
\n- t0 el valor de nuestro estadístico en el conjunto de datos original,
\n- se⋆ el error estándar de la estimación bootstrap,
\n- b el sesgo de la estimación bootstrap, b = t⋆ − t0
\n- α el nivel de confianza, típicamente α = 0.95,
\n- zα el cuantil $1-\\frac \\alpha 2$ de la distribución normal estándar,
\n- θα el α-percentil de la distribución de las realizaciones bootstrap.
\n
\nIC por percentiles
\nCon la notación anterior, el IC por percentiles es:
\n
\nes decir, tomamos los percentiles correspondientes. Nada más.
IC normal
\nUn IC de Wald típico sería:
\npero en el caso bootstrap conviene corregirlo por sesgo. Así queda:
\n$$ t_0 - b \\pm z_\\alpha \\cdot se^\\star \\\\ 2t_0 - t^\\star \\pm z_\\alpha \\cdot se^\\star$$
\nIC básico
\nEl IC por percentiles en general no se recomienda porque se comporta mal con distribuciones de colas raras. El IC básico (también llamado pivotal o empirical) es mucho más robusto. La idea es calcular las diferencias entre cada réplica bootstrap y t0 y usar los percentiles de su distribución. Los detalles completos pueden verse, por ejemplo, en All of Statistics de L. Wasserman.
\nLa fórmula final del IC básico es:
\nBCα (bias-corrected and accelerated)
\nBCα viene de bias-corrected, accelerated. Su fórmula no es muy complicada pero sí poco intuitiva, así que la omitiremos. Consulta el artículo de Thomas J. DiCiccio y Bradley Efron si te interesan los detalles.
\nLa aceleración que menciona el método requiere usar percentiles específicos de las realizaciones bootstrap. A veces puede ocurrir que estos sean percentiles extremos, quizá valores atípicos. En esos casos, BCα puede resultar inestable.
\nVeamos el IC BCα para la mediana de la anchura del pétalo. En el conjunto de datos original, esta mediana es exactamente 3.
\n\nObtenemos un IC BCα (2.9, 2.9). Es raro, pero por suerte
\n\nRnos avisó conextreme order statistics used as endpoints. Veamos qué ha pasado exactamente:La distribución de las realizaciones bootstrap es inusual. Una gran mayoría (más del 90%) son 3.
\n\nEn una situación así, la \"aceleración\" del método BCα salta fácilmente a valores extremos. Aquí, el IC por percentiles, que sirve de base para el IC BCα, es (3, 3.1). Al expandirlo \"hacia la izquierda\" tenemos que usar el percentil 0.002. La expansión \"hacia la derecha\" también se va a los extremos: percentil 0.997.
\nReproducir los resultados
\nA veces necesitamos recrear las réplicas bootstrap. Si podemos usar
\nR, no hay problema: la funciónset.seedlo soluciona. Recrearlas en otro software sería mucho más complicado. Además, para R grandes, recalcular enRpuede no ser una opción (por falta de tiempo, por ejemplo).Podemos afrontarlo guardando los índices de los elementos del conjunto original que formaron cada muestra bootstrap. Esto es lo que hace la función
\n\nboot.array(con el argumentoindices=T).Cada fila es una muestra bootstrap. Por ejemplo, nuestra primera muestra contiene los siguientes elementos:
\n\nSi establecemos
\n\nindices=F(valor por defecto), obtendremos la respuesta a la pregunta: \"¿Cuántas veces apareció cada elemento del conjunto original en cada muestra bootstrap?\". Por ejemplo, en la primera muestra: el primer elemento apareció una vez, el segundo no apareció, el tercero apareció una vez, el cuarto dos veces, y así sucesivamente.Una tabla así nos permite recrear las realizaciones bootstrap fuera de
\n\nR. O en el propioRcuando no queremos usarset.seedy repetir todos los cálculos.Comprobemos si los resultados coinciden:
\n\n¡Sí, coinciden!
\nSi quieres aprender más sobre Machine Learning en R, haz el curso Machine Learning Toolbox de DataCamp y echa un vistazo al tutorial Machine Learning en R para principiantes.