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.
- Paquete splitstackshape
- Paquete dplyr
- Paquete caret
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
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.
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
También se puede utilizar la librería TeachingSampling
ResponderEliminarlibrary(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
Gracias por el comentario, Alex. Saludos.
Eliminar