Como gerar dados categóricos aleatórios?

15

Digamos que eu tenho uma variável categórica que pode assumir os valores A, B, C e D. Como posso gerar 10000 pontos de dados aleatórios e controlar a frequência de cada um? Por exemplo:

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

Alguma idéia de como eu posso fazer isso?

user333
fonte

Respostas:

35

Deseja que as proporções na amostra sejam exatamente as proporções indicadas? ou para representar a idéia de amostragem de uma população muito grande com essas proporções (para que as proporções da amostra sejam próximas, mas não exatas)?

Se você quiser as proporções exatas, poderá seguir a sugestão de Brandon e usar a samplefunção R para randomizar a ordem de um vetor que tenha as proporções exatas.

Se você deseja fazer uma amostra da população, mas não restringir as proporções para ser exato, ainda poderá usar a samplefunção em R com o probargumento da seguinte maneira:

> 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
fonte
6

Usando R (http://cran.r-project.org/). Tudo o que estou fazendo aqui é criar uma lista aleatória com as proporções que você especificou.

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 Aguarda pacientemente a discussão sobre quão verdadeiramente aleatório isso é

Brandon Bertelsen
fonte
5
Você pode encurtar / simplificar sua primeira linha x <- rep( c("A","B","C","D"), 10000*c(0.1,0.2,0.65,0.05) )e não precisa especificar os 10000 na chamada para amostra, esse seria o padrão (embora, para maior clareza, não seja necessário especificá-la).
Greg Neve
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)))

Não tenho dúvida de que isso é verdadeiramente aleatório. Quero dizer, na medida em que runif()é aleatório :)

StasK
fonte
4
Se as freqüências desejadas são realmente probabilidades, seria mais fácil usar o probargumento para sample():sample(LETTERS[1:4], 10000, replace=TRUE, prob=c(0.1, 0.2, 0.65, 0.05))
caracal
Sim, isso é muito mais bonito. A minha é apenas uma força bruta.
Stask
Na verdade, eu votei positivo porque mostra como sample(,prob=)funciona (pelo menos em polonês, é chamado algoritmo de roleta).