簡體   English   中英

根據其他向量的值,概率在 R 中生成隨機向量

[英]generate random vector in R based on values of other vectors, probability

鑒於以下情況:

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應該只有值01

您可以從均勻分布中采樣,然后將其與您的截止值進行比較以生成此類值。 例如

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 

你並不真正需要這些字母。 只需使用概率:

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

與您的目標 (.8, .6, .4, .1) 相比,這給出了每組 1 的比例:

rowSums(matrix(x, 4, 25))/25
# [1] 0.76 0.64 0.36 0.16

這是使用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 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM