如何在R中按逐次不同概率用sample函数生成0-1序列?
解决R中按逐元素概率采样0/1的问题
首先纠正你代码里的两个基础错误:
- R中创建向量要用
c(),不是括号,正确的概率向量定义是:
myprob <- c(0.58, 0.51, 0.48, 0.46, 0.62)
- 你误用了
sample()函数的参数逻辑:sample()的prob参数是指定待采样集合中每个元素的权重,而非每次采样的独立概率分布。当你传入长度为10的prob=c(1-myprob, myprob)时,会和待采样集合c(1,0)的长度不匹配,导致逻辑混乱;同时replace=F是无放回采样,最多只能取2个值,完全不符合生成5个独立样本的需求。
正确的两种实现方法
方法1:用rbinom()(推荐,更高效简洁)
伯努利分布(0/1采样)正好匹配你的需求:rbinom()的prob参数可以直接传入向量,每个元素对应一次采样取1的概率。代码如下:
# 生成5个0/1值,第i个值取1的概率是myprob[i],取0的概率是1-myprob[i] Y <- rbinom(n = length(myprob), size = 1, prob = myprob)
方法2:用sapply()循环调用sample()
如果坚持用sample(),可以对每个概率单独采样再合并结果:
Y <- sapply(myprob, function(p) { # 每次按(1-p, p)的概率采样0和1 sample(c(0, 1), size = 1, prob = c(1-p, p)) })
验证结果
你可以多次运行代码,查看采样结果是否符合预期概率:比如重复10000次采样后,统计每个位置取1的频率,应该接近myprob的对应值:
replicates <- replicate(10000, rbinom(n=5, size=1, prob=myprob)) rowMeans(replicates) # 输出应该接近:0.58, 0.51, 0.48, 0.46, 0.62
内容的提问来源于stack exchange,提问作者Yen-chin Wang
相关产品推荐
相关产品推荐

