2018-05-19

Muestra aleatoria estratificada proporcional en R

Problema

Necesitamos crear una muestra estratificada en R. Nuestro data frame contiene dos estratos con un 60% y 40% respectivamente del total de la población. Deseamos estraer una muestra de 10 en la que cada estrato esté representado proporcionalmente: 60% (6 elementos) del estrato 1 y un 40% (4 elementos) del estrato 2.

id <- c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20)
estrato<- c(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2)
df <- data.frame(id, estrato)
df %>%
  group_by(estrato) %>%
  summarise (cuenta = n()) %>%
  mutate(porcentaje = cuenta / sum (cuenta ))
# A tibble: 2 x 3
  estrato cuenta porcentaje
            
1      1.     12      0.600
2      2.      8      0.400

Solución

Muestro tres soluciones diferentes. Las dos primeras son muy similares entre sí — con dplyr encadenamos las expresiones con el operador %>% — y arrojan el mismo resultado. Finalmente empleamos el paquete caret.

  1. Paquete splitstackshape
  2. library(splitstackshape)
    set.seed(1)
    stratified(df, "status", 10 / nrow(df))
    
        id estrato
     1:  4       1
     2:  5       1
     3:  6       1
     4:  9       1
     5:  2       1
     6:  7       1
     7: 20       2
     8: 17       2
     9: 16       2
    10: 13       2
    
  3. Paquete dplyr
  4. library(dplyr)
    set.seed(1)
    df %>%
      group_by(estrato) %>%
      sample_frac(10 / nrow(df))
    
    # A tibble: 10 x 2
    # Groups:   estrato [2]
          id estrato
          
     1    4.      1.
     2    5.      1.
     3    6.      1.
     4    9.      1.
     5    2.      1.
     6    7.      1.
     7   20.      2.
     8   17.      2.
     9   16.      2.
    10   13.      2.
    
  5. Paquete caret
  6. library(caret)
    set.seed(1)
    train.index <- createDataPartition(df$estrato,
                                       p = .5,
                                       list = FALSE)
    df[train.index, ]
    
       id estrato
    1   1       1
    4   4       1
    6   6       1
    8   8       1
    9   9       1
    11 11       1
    14 14       2
    15 15       2
    16 16       2
    19 19       2
    

Referencias

2 comentarios:

  1. También se puede utilizar la librería TeachingSampling

    library(TeachingSampling)
    >
    > peso <- rep(1,nrow(df))
    > muestra <- round(10*table(df$estrato)/nrow(df))
    > set.seed(1)
    > res <- S.STpiPS(S = df$estrato,x = peso,nh = muestra)
    > sam <- res[,1]
    > df[sam,]
    id estrato
    12 12 1
    11 11 1
    8 8 1
    4 4 1
    3 3 1
    2 2 1
    19 19 2
    17 17 2
    14 14 2
    13 13 2

    ResponderEliminar

Nube de datos