Comment générer des données catégoriques aléatoires?

15

Disons que j'ai une variable catégorielle qui peut prendre les valeurs A, B, C et D. Comment puis-je générer 10 000 points de données aléatoires et contrôler la fréquence de chacun? Par exemple:

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

Des idées comment je peux faire ça?

user333
la source

Réponses:

35

Voulez-vous que les proportions dans l'échantillon soient exactement les proportions indiquées? ou pour représenter l'idée de l'échantillonnage d'une très grande population avec ces proportions (donc les proportions de l'échantillon seront proches mais pas exactes)?

Si vous voulez les proportions exactes, vous pouvez suivre la suggestion de Brandon et utiliser la samplefonction R pour randomiser l'ordre d'un vecteur qui a les proportions exactes.

Si vous souhaitez échantillonner à partir de la population, mais sans restreindre les proportions pour être exact, vous pouvez toujours utiliser la samplefonction dans R avec l' probargument comme suit:

> 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
la source
6

Utilisation de R (http://cran.r-project.org/). Tout ce que je fais ici est de créer une liste aléatoire avec les proportions que vous avez spécifiées.

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 Attend patiemment l'argument sur le caractère vraiment aléatoire

Brandon Bertelsen
la source
5
Vous pouvez raccourcir / simplifier votre première ligne x <- rep( c("A","B","C","D"), 10000*c(0.1,0.2,0.65,0.05) )et vous n'avez pas besoin de spécifier le 10000 dans l'appel à l'échantillon, ce serait la valeur par défaut (bien que pour plus de clarté, il ne soit pas difficile de le spécifier).
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)))

Je ne doute pas que ce soit vraiment aléatoire. Je veux dire, dans la mesure où runif()c'est aléatoire :)

StasK
la source
4
Si les fréquences souhaitées sont vraiment des probabilités, il serait plus facile d'utiliser l' probargument pour sample():sample(LETTERS[1:4], 10000, replace=TRUE, prob=c(0.1, 0.2, 0.65, 0.05))
caracal
Ouais, c'est beaucoup plus mignon. Le mien n'est qu'une force brute.
StasK
J'ai en fait voté contre cela parce qu'il montre comment cela sample(,prob=)fonctionne (au moins en polonais, il est appelé algorithme de roulette).