Как генерировать случайные категориальные данные?


15

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

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

Есть идеи, как я могу это сделать?

Ответы:


35

Вы хотите, чтобы пропорции в образце были точно такими, как указано? или чтобы представить идею выборки из очень большой популяции с этими пропорциями (чтобы пропорции выборки были близки, но не точны)?

Если вам нужны точные пропорции, вы можете следовать предложению Брэндона и использовать sampleфункцию R, чтобы рандомизировать порядок вектора, который имеет точные пропорции.

Если вы хотите произвести выборку из совокупности, но не ограничивать пропорции, чтобы быть точными, вы все равно можете использовать 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)))

/ me терпеливо ждет спора о том, насколько это действительно случайно


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))
Каракал

Да, это намного симпатичнее. Моя просто грубая сила.
StasK

Я фактически проголосовал за это, потому что это показывает, как sample(,prob=)работает (по крайней мере, на польском языке это называется алгоритмом рулетки).

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.