Come generare dati categorici casuali?


15

Diciamo che ho una variabile categoriale che può assumere i valori A, B, C e D. Come posso generare 10000 punti di dati casuali e controllare la frequenza di ciascuno? Per esempio:

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

Qualche idea su come posso farlo?

Risposte:


35

Vuoi che le proporzioni nel campione siano esattamente le proporzioni dichiarate? o per rappresentare l'idea di campionare da una popolazione molto ampia con quelle proporzioni (quindi le proporzioni del campione saranno vicine ma non esatte)?

Se vuoi le proporzioni esatte, puoi seguire il suggerimento di Brandon e usare la samplefunzione R per randomizzare l'ordine di un vettore che ha le proporzioni esatte.

Se vuoi campionare dalla popolazione, ma non limitare le proporzioni per essere esatti, puoi comunque usare la samplefunzione in R con l' probargomento in questo modo:

> 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

Utilizzando R (http://cran.r-project.org/). Tutto quello che sto facendo qui è creare un elenco casuale con le proporzioni specificate.

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 Aspetta pazientemente una discussione su quanto sia davvero casuale


5
È possibile accorciare / semplificare la prima linea x <- rep( c("A","B","C","D"), 10000*c(0.1,0.2,0.65,0.05) )e non è necessario specificare il 10000 nella chiamata da campionare, sarebbe l'impostazione predefinita (anche se per chiarezza non fa male specificarlo).
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)))

Non ho dubbi, questo è davvero casuale. Voglio dire, nella misura in cui runif()è casuale :)


4
Se le frequenze desiderate sono davvero delle probabilità, sarebbe più semplice usare l' probargomento per sample():sample(LETTERS[1:4], 10000, replace=TRUE, prob=c(0.1, 0.2, 0.65, 0.05))
caracal

Sì, è molto più carino. Il mio è solo una forza bruta.
StasK,

Ho effettivamente valutato questo perché mostra come sample(,prob=)funziona (almeno in polacco si chiama algoritmo di roulette).

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.