6.4 Bootstrap en R
Es común crear nuestras porpias funciones cuando usamos bootstrap, sin embargo, en R también hay alternativas que pueden resultar convenientes, mencionamos 3:
- El paquete
rsample
(forma parte de la colección tidymodels) y tiene una funciónbootsrtraps()
que regresa un arreglo cuadrangular (tibble
,data.frame
) que incluye una columna con las muestras bootstrap y un identificador del número y tipo de muestra.
Veamos un ejemplo donde seleccionamos muestras del conjunto de datos
muestra_computos
que contiene 10,000 observaciones.
library(rsample)
#>
#> Attaching package: 'rsample'
#> The following object is masked from 'package:tidyr':
#>
#> fill
muestra_computos <- read_csv("data/muestra_computos_2012.csv")
#> Parsed with column specification:
#> cols(
#> .default = col_double(),
#> TIPO_CASILLA = col_character()
#> )
#> See spec(...) for full column specifications.
muestra_computos
#> # A tibble: 10,000 x 36
#> ID_ESTADO D_DISTRITO SECCION ID_CASILLA TIPO_CASILLA EXT_CONTIGUA
#> <dbl> <dbl> <dbl> <dbl> <chr> <dbl>
#> 1 15 14 324 1 C 0
#> 2 20 3 207 3 C 0
#> 3 19 9 275 1 B 0
#> 4 8 7 2422 1 B 0
#> 5 30 11 4665 1 C 0
#> 6 13 3 199 1 E 0
#> 7 20 11 2014 1 B 0
#> 8 2 6 739 1 C 0
#> 9 30 12 4348 1 C 0
#> 10 21 11 1121 1 B 0
#> # ... with 9,990 more rows, and 30 more variables: TIPO_CANDIDATURA <dbl>,
#> # CASILLA <dbl>, ESTATUS_ACTA <dbl>, ORDEN <dbl>,
#> # LISTA_NOMINAL_CASILLA <dbl>, ID_GRUPO <dbl>, TIPO_RECUENTO <dbl>,
#> # NUM_VOTOS_NULOS <dbl>, NUM_VOTOS_CAN_NREG <dbl>,
#> # NUMERO_VOTOS_VALIDOS <dbl>, TOTAL_VOTOS <dbl>,
#> # BOLETAS_INUTILIZADAS <dbl>, PAN <dbl>, PRI <dbl>, PRD <dbl>,
#> # PVEM <dbl>, PT <dbl>, MC <dbl>, PANAL <dbl>, PRI_PVEM <dbl>,
#> # PRD_PT_MC <dbl>, PRD_PT <dbl>, PRD_MC <dbl>, PT_MC <dbl>,
#> # ID_MUNICIPIO <dbl>, LISTA_NOMINAL <dbl>, VOTOS_RESERVADOS <dbl>,
#> # pan <dbl>, pri <dbl>, prd <dbl>
Generamos 100 muestras bootstrap, y la función nos regresa un arreglo con 100 renglones, cada uno corresponde a una muestra bootstrap.
set.seed(839287482)
computos_boot <- bootstraps(muestra_computos, times = 100)
computos_boot
#> # Bootstrap sampling
#> # A tibble: 100 x 2
#> splits id
#> <list> <chr>
#> 1 <split [10K/3.7K]> Bootstrap001
#> 2 <split [10K/3.7K]> Bootstrap002
#> 3 <split [10K/3.7K]> Bootstrap003
#> 4 <split [10K/3.6K]> Bootstrap004
#> 5 <split [10K/3.7K]> Bootstrap005
#> 6 <split [10K/3.7K]> Bootstrap006
#> 7 <split [10K/3.7K]> Bootstrap007
#> 8 <split [10K/3.7K]> Bootstrap008
#> 9 <split [10K/3.7K]> Bootstrap009
#> 10 <split [10K/3.7K]> Bootstrap010
#> # ... with 90 more rows
La columna splits
tiene información de las muestras seleccionadas, para la
primera vemos que de 10,000 observaciones en la muestra original la primera
muestra bootstrap contiene 10000-3709=6291.
first_computos_boot <- computos_boot$splits[[1]]
first_computos_boot
#> <10000/3709/10000>
Y podemos obtener los datos de la muestra bootstrap con la función
as.data.frame()
as.data.frame(first_computos_boot)
#> # A tibble: 10,000 x 36
#> ID_ESTADO D_DISTRITO SECCION ID_CASILLA TIPO_CASILLA EXT_CONTIGUA
#> <dbl> <dbl> <dbl> <dbl> <chr> <dbl>
#> 1 20 3 1246 3 C 0
#> 2 21 7 9 1 B 0
#> 3 30 2 3609 1 B 0
#> 4 15 3 433 2 C 0
#> 5 7 3 861 1 B 0
#> 6 32 2 565 1 B 0
#> 7 15 36 4402 1 B 0
#> 8 5 5 542 2 C 0
#> 9 16 9 2213 1 C 0
#> 10 5 4 1006 1 E 2
#> # ... with 9,990 more rows, and 30 more variables: TIPO_CANDIDATURA <dbl>,
#> # CASILLA <dbl>, ESTATUS_ACTA <dbl>, ORDEN <dbl>,
#> # LISTA_NOMINAL_CASILLA <dbl>, ID_GRUPO <dbl>, TIPO_RECUENTO <dbl>,
#> # NUM_VOTOS_NULOS <dbl>, NUM_VOTOS_CAN_NREG <dbl>,
#> # NUMERO_VOTOS_VALIDOS <dbl>, TOTAL_VOTOS <dbl>,
#> # BOLETAS_INUTILIZADAS <dbl>, PAN <dbl>, PRI <dbl>, PRD <dbl>,
#> # PVEM <dbl>, PT <dbl>, MC <dbl>, PANAL <dbl>, PRI_PVEM <dbl>,
#> # PRD_PT_MC <dbl>, PRD_PT <dbl>, PRD_MC <dbl>, PT_MC <dbl>,
#> # ID_MUNICIPIO <dbl>, LISTA_NOMINAL <dbl>, VOTOS_RESERVADOS <dbl>,
#> # pan <dbl>, pri <dbl>, prd <dbl>
Una de las principales ventajas de usar este paquete es que es eficiente en el uso de memoria.
library(pryr)
#>
#> Attaching package: 'pryr'
#> The following objects are masked from 'package:purrr':
#>
#> compose, partial
object_size(muestra_computos)
#> 2.89 MB
object_size(computos_boot)
#> 6.98 MB
# tamaño por muestra
object_size(computos_boot)/nrow(computos_boot)
#> 69.8 kB
# el incremento en tamaño es << 100
as.numeric(object_size(computos_boot)/object_size(muestra_computos))
#> [1] 2.4133
- El paquete
boot
está asociado al libro Bootstrap Methods and Their Applications (Davison and Hinkley (1997)) y tiene, entre otras, funciones para calcular replicaciones bootstrap y para construir intervalos de confianza usando bootstrap:- calculo de replicaciones bootstrap con la función
boot()
, - intervalos normales, de percentiles y \(BC_a\) con la función
boot.ci()
, - intevalos ABC con la función `abc.ci().
- calculo de replicaciones bootstrap con la función
- El paquete
bootstrap
contiene datos usados en Efron and Tibshirani (1993), y la implementación de funciones para calcular replicaciones y construir intervalos de confianza:- calculo de replicaciones bootstrap con la función
bootstrap()
, - intervalos \(BC_a\) con la función
bcanon()
, - intevalos ABC con la función `abcnon().
- calculo de replicaciones bootstrap con la función
Referencias
Davison, A. C., and D. V. Hinkley. 1997. Bootstrap Methods and Their Applications. Cambridge: Cambridge University Press. http://statwww.epfl.ch/davison/BMA/.
Efron, Bradley, and Robert J. Tibshirani. 1993. An Introduction to the Bootstrap. Monographs on Statistics and Applied Probability 57. Boca Raton, Florida, USA: Chapman & Hall/CRC.