Muestreo aleatorio estratificado a partir del marco de datos.

Resuelto user3525533 asked hace 54 años • 0 respuestas

Tengo un marco de datos en el formato:

head(subset)
# ants  0 1 1 0 1 
# age   1 2 2 1 3
# lc    1 1 0 1 0

Necesito crear un nuevo marco de datos con muestras aleatorias según la edad y el lc. Por ejemplo, quiero 30 muestras de age:1 y lc:1, 30 muestras de age:1 y lc:0, etc.

Miré un método de muestreo aleatorio como;

newdata <- function(subset, age, 30)

Pero no es el código que quiero.

user3525533 avatar Jan 01 '70 08:01 user3525533
Aceptado

Sugeriría usar stratifieddesde mi paquete "splitstackshape" o sample_ndesde el paquete "dplyr":

## Sample data
set.seed(1)
n <- 1e4
d <- data.table(age = sample(1:5, n, T), 
                lc = rbinom(n, 1 , .5),
                ants = rbinom(n, 1, .7))
# table(d$age, d$lc)

Para stratified, básicamente especifica el conjunto de datos, las columnas estratificadoras y un número entero que representa el tamaño que desea de cada grupo O un decimal que representa la fracción que desea que se devuelva (por ejemplo, .1 representa el 10% de cada grupo).

library(splitstackshape)
set.seed(1)
out <- stratified(d, c("age", "lc"), 30)
head(out)
#    age lc ants
# 1:   1  0    1
# 2:   1  0    0
# 3:   1  0    1
# 4:   1  0    1
# 5:   1  0    0
# 6:   1  0    1

table(out$age, out$lc)
#    
#      0  1
#   1 30 30
#   2 30 30
#   3 30 30
#   4 30 30
#   5 30 30

Primero sample_ncrea una tabla agrupada (usando group_by) y luego especifica el número de observaciones que deseas. Si en su lugar quisiera un muestreo proporcional, debería usar sample_frac.

library(dplyr)
set.seed(1)
out2 <- d %>%
  group_by(age, lc) %>%
  sample_n(30)

# table(out2$age, out2$lc)
A5C1D2H2I1M1N2O1R2T1 avatar Mar 31 '2015 06:03 A5C1D2H2I1M1N2O1R2T1

Aquí hay algunos datos:

set.seed(1)
n <- 1e4
d <- data.frame(age = sample(1:5,n,TRUE), 
                lc = rbinom(n,1,.5),
                ants = rbinom(n,1,.7))

Quiere una estrategia de división, aplicación y combinación, en la que splitsu marco de datos ( den este ejemplo), muestree filas/observaciones de cada submuestra y luego combine y vuelva a juntar con rbind. Así es como funciona:

sp <- split(d, list(d$age, d$lc))
samples <- lapply(sp, function(x) x[sample(1:nrow(x), 30, FALSE),])
out <- do.call(rbind, samples)

El resultado:

> str(out)
'data.frame':   300 obs. of  3 variables:
 $ age : int  1 1 1 1 1 1 1 1 1 1 ...
 $ lc  : int  0 0 0 0 0 0 0 0 0 0 ...
 $ ants: int  1 1 0 1 1 1 1 1 1 1 ...
> head(out)
         age lc ants
1.0.2242   1  0    1
1.0.4417   1  0    1
1.0.389    1  0    0
1.0.4578   1  0    1
1.0.8170   1  0    1
1.0.5606   1  0    1
Thomas avatar May 05 '2014 19:05 Thomas