Jak generować losowe dane kategoryczne?

15

Powiedzmy, że mam zmienną kategoryczną, która może przyjmować wartości A, B, C i D. Jak wygenerować 10000 losowych punktów danych i kontrolować częstotliwość każdego z nich? Na przykład:

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

Jakieś pomysły, jak to zrobić?

użytkownik333
źródło

Odpowiedzi:

35

Czy chcesz, aby proporcje w próbce były dokładnie takie, jak podano? lub reprezentować ideę pobierania próbek z bardzo dużej populacji przy tych proporcjach (więc proporcje próby będą bliskie, ale nie dokładne)?

Jeśli chcesz uzyskać dokładne proporcje, możesz zastosować się do sugestii Brandona i użyć samplefunkcji R, aby losowo uporządkować wektor o dokładnych proporcjach.

Jeśli chcesz próbkować z populacji, ale nie ograniczać dokładnych proporcji, nadal możesz użyć samplefunkcji w R z probargumentem w ten sposób:

> 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
źródło
6

Korzystanie z R (http://cran.r-project.org/). Wszystko, co tu robię, to tworzenie losowej listy o określonych proporcjach.

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 Cierpliwie czeka na spór o to, jak naprawdę jest to przypadkowe

Brandon Bertelsen
źródło
5
Możesz skrócić / uprościć swój pierwszy wiersz x <- rep( c("A","B","C","D"), 10000*c(0.1,0.2,0.65,0.05) )i nie musisz określać 10000 w wywołaniu próbkowania, byłoby to ustawienie domyślne (chociaż dla jasności nie zaszkodzi to określić).
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)))

Nie mam wątpliwości, że to naprawdę przypadek. Chodzi mi o to, że runif()jest to losowe :)

StasK
źródło
4
Jeśli pożądane częstotliwości są naprawdę prawdopodobieństwami, łatwiej byłoby użyć probargumentu dla sample():sample(LETTERS[1:4], 10000, replace=TRUE, prob=c(0.1, 0.2, 0.65, 0.05))
caracal
Tak, to dużo ładniejsze. Mój to tylko brutalna siła.
StasK,
Właściwie to głosowałem, ponieważ pokazuje, jak to sample(,prob=)działa (przynajmniej po polsku nazywa się to algorytmem ruletki).