¿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?

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 

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


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 :)


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).

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.