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

15

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

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

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

user333
источник

Ответы:

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()случайно :)

Stask
источник
4
Если желаемые частоты действительно вероятности, было бы проще использовать probаргумент для sample():sample(LETTERS[1:4], 10000, replace=TRUE, prob=c(0.1, 0.2, 0.65, 0.05))
Каракал
Да, это намного симпатичнее. Моя просто грубая сила.
StasK
Я фактически проголосовал за это, потому что это показывает, как sample(,prob=)работает (по крайней мере, на польском языке это называется алгоритмом рулетки).