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:

  1. El paquete rsample (forma parte de la colección tidymodels) y tiene una función bootsrtraps() 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
  1. 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().
  2. 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().

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.