Як генерувати випадкові категоричні дані?


15

Скажімо, у мене є категоріальна змінна, яка може приймати значення A, B, C і D. Як я можу генерувати 10000 випадкових точок даних і контролювати частоту кожного? Наприклад:

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

Будь-які ідеї, як я можу це зробити?

Відповіді:


35

Ви хочете, щоб пропорції у вибірці були саме вказаними пропорціями? чи представляти ідею вибірки з дуже великої сукупності з тими пропорціями (тому пропорції вибірки будуть близькими, але не точними)?

Якщо ви хочете точних пропорцій, ви можете дотримуватися пропозиції Брендона і використовувати функцію R sampleдля рандомізації порядку вектора, який має точні пропорції.

Якщо ви хочете взяти вибірку з сукупності, але не обмежувати пропорції, щоб бути точними, ви все одно можете використовувати sampleфункцію в R з таким probаргументом:

> 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

Використання R (http://cran.r-project.org/). Все, що я тут роблю, - це створення випадкового списку з вказаними вами пропорціями.

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

/ мене терпляче чекає аргументу щодо того, наскільки це справді випадково


5
Ви можете скоротити / спростити свій перший рядок до, x <- rep( c("A","B","C","D"), 10000*c(0.1,0.2,0.65,0.05) )і вам не потрібно вказувати 10000 у виклику до вибірки, це було б за замовчуванням (хоча для наочності його не завадить вказувати).
Грег Сног

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

Я не сумніваюся, що це справді випадково. Я маю на увазі, настільки runif()випадково :)


4
Якщо бажані частоти дійсно вірогідні, було б простіше використовувати probаргумент для sample():sample(LETTERS[1:4], 10000, replace=TRUE, prob=c(0.1, 0.2, 0.65, 0.05))
каракал

Так, це набагато симпатичніше. Міна - просто груба сила.
Стаск

Я фактично підтримав це, тому що це показує, як це sample(,prob=)працює (принаймні польською мовою це називається алгоритмом рулетки).

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.