#r #conditional-statements
#r #условные операторы
Вопрос:
учитывая следующее:
N = 100
v = rep(c('a', 'b', 'c', 'd'), N/4)
Я хотел бы создать некоторый вектор, x
такой, x = 1
чтобы с вероятностью, обусловленной v
Таким образом, мы имели бы
P(x = 1 | v = 'a') = 0.8
P(x = 1 | v = 'b') = 0.6
P(x = 1 | v = 'c') = 0.4
P(x = 1 | v = 'd') = 0.1
x
должны иметь только значения 0
или 1
.
Ответ №1:
Вы можете выполнить выборку из равномерного распределения, а затем сравнить его с вашими ограничениями для генерации таких значений. Например
probs <- c(a=.8, b=.6, c=.4, d=.1)
x <- runif(N) < probs[v]
Например, при большем количестве выборок мы можем видеть, что получаем примерно те пропорции, которые мы ожидаем
set.seed(11)
N = 1000
v = rep(c('a', 'b', 'c', 'd'), N/4)
probs <- c(a=.8, b=.6, c=.4, d=.1)
x <- runif(N) < probs[v]
tapply(x, v, mean)
# a b c d
# 0.780 0.604 0.376 0.120
Ответ №2:
На самом деле вам не нужны буквы. Просто используйте вероятности:
set.seed(42)
N <- 100
v <- rep(c(.8, .6, .4, .1), N/4)
(x <- rbinom(100, 1, v))
# [1] 0 0 0 0 1 1 1 0 1 0 0 0 0 1 0 1 0 1 0 0 0 1 1 1 1 1 0 1 1 0 1 0 1 0 0 0 1
# [38] 1 1 0 1 1 0 1 1 0 1 0 0 0 0 0 1 0 0 0 1 1 0 0 1 0 1 0 0 1 0 0 1 1 0 0 1 1
# [75] 0 0 1 1 0 0 1 1 0 0 1 1 0 0 1 1 1 0 1 0 1 0 1 1 1 0
Это дает соотношение 1s для каждой группы по сравнению с вашими целями (.8, .6, .4, .1).:
rowSums(matrix(x, 4, 25))/25
# [1] 0.76 0.64 0.36 0.16
Ответ №3:
Вот способ, использующий rbinom
:
set.seed(2020)
N <- 10000
probs <- rep(c(a=.8, b=.6, c=.4, d=.1), N/4)
v <- rep(c('a', 'b', 'c', 'd'), N/4)
x <- sapply(probs, function(u) {rbinom(n = 1, size = 1, prob = u)})
tapply(x, v, mean)
a b c d
0.8048 0.6024 0.3896 0.0904