¿Cómo generar datos categóricos al azar?

15

Digamos que tengo una variable categórica que puede tomar los valores A, B, C y D. ¿Cómo puedo generar 10000 puntos de datos aleatorios y controlar la frecuencia de cada uno? Por ejemplo:

A = 10% B = 20% C = 65% D = 5%

¿Alguna idea de cómo puedo hacer esto?

usuario333
fuente

Respuestas:

35

¿Desea que las proporciones en la muestra sean exactamente las proporciones establecidas? o para representar la idea de tomar muestras de una población muy grande con esas proporciones (para que las proporciones de la muestra sean cercanas pero no exactas)?

Si desea las proporciones exactas, puede seguir la sugerencia de Brandon y utilizar la samplefunción R para aleatorizar el orden de un vector que tenga las proporciones exactas.

Si desea muestrear de la población, pero no restringir las proporciones para que sean exactas, aún puede usar la samplefunción en R con el probargumento de la siguiente manera:

> x <- sample( LETTERS[1:4], 10000, replace=TRUE, prob=c(0.1, 0.2, 0.65, 0.05) )
> prop.table(table(x))
x
     A      B      C      D 
0.0965 0.1972 0.6544 0.0519 
Greg Snow
fuente
6

Usando R (http://cran.r-project.org/). Todo lo que estoy haciendo aquí es crear una lista aleatoria con las proporciones que especificó.

x <- c(rep("A",0.1*10000),rep("B",0.2*10000),rep("C",0.65*10000),rep("D",0.05*10000))
# cheating    
x <- sample(x, 10000) 


prop.table(summary(as.factor(x)))

/ me Espera pacientemente una discusión sobre cuán verdaderamente aleatorio es esto

Brandon Bertelsen
fuente
55
Puede acortar / simplificar su primera línea x <- rep( c("A","B","C","D"), 10000*c(0.1,0.2,0.65,0.05) )y no necesita especificar el 10000 en la llamada a la muestra, eso sería lo predeterminado (aunque para mayor claridad no hace daño especificarlo).
Greg Snow
3
    n <- 10000
    blah <- character(n)
    u <- runif(n)
    blah[u<=0.1] <- "A"
    blah[u>0.1 & u<=0.3] <- "B"
    blah[u>0.3 & u<=0.95] <- "C"
    blah[u>0.95] <- "D"
    table(blah)
    prop.table(summary(as.factor(blah)))

No tengo dudas de que esto es realmente al azar. Quiero decir, en la medida en que runif()sea ​​aleatorio :)

StasK
fuente
44
Si las frecuencias deseadas son realmente probabilidades, sería más fácil usar el probargumento para sample():sample(LETTERS[1:4], 10000, replace=TRUE, prob=c(0.1, 0.2, 0.65, 0.05))
caracal
Sí, eso es mucho más lindo. La mía es solo una fuerza bruta.
StasK
De hecho, he votado a favor porque muestra cómo sample(,prob=)funciona (al menos en polaco se llama algoritmo de ruleta).