генерировать случайный вектор в R на основе значений других векторов, вероятность

#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