【发布时间】:2019-10-10 19:09:09
【问题描述】:
我有一个概率向量。有了概率,我想为每个概率在 (0,1) 之间抽取一个样本。
例如prob_of_one表示抽到1((1-prob_of_one)是抽到0的概率)。
data.frame(prob_of_one = c(runif(100)),desire_column = NA)
如何在不使用for-loop 的情况下通过抽样获得 0 或 1 值?
【问题讨论】:
我有一个概率向量。有了概率,我想为每个概率在 (0,1) 之间抽取一个样本。
例如prob_of_one表示抽到1((1-prob_of_one)是抽到0的概率)。
data.frame(prob_of_one = c(runif(100)),desire_column = NA)
如何在不使用for-loop 的情况下通过抽样获得 0 或 1 值?
【问题讨论】:
请记住,rbinom 接受向量参数,包括它的概率。因此,您只需要说:
rbinom(100,size=1,prob=prob_of_one)
我知道你没有问,但记住 R 的回收规则是可以使用的,所以如果你想要 2 组 100 在同一个向量中,你可以说
rbinom(200,size=1,prob=prob_of_ones)
如果您的概率向量的长度可以整除 100,它也会起作用。下面给出了当概率 1 重复 (1/3,1/5) 50 次时的平局。
rbinom(100,size=1,prob=c(1/3,1/5))
## transform
c1<-function(n=100) {
dd <- data.frame(prob_of_one = runif(n))
transform(dd, draw = ifelse(runif(length(prob_of_one))<prob_of_one, 1, 0))
}
##rbinom
c2<-function(n=100){
set.seed(101)
prob_of_one=runif(n)
rbinom(n,size=1,prob=prob_of_one)
}
> benchmark(transform_method=c1(100),my_method=c(100),replications=1000) %>% kable
| |test | replications| elapsed|relative | user.self| sys.self| user.child| sys.child|
|:--|:----------------|------------:|-------:|:--------|---------:|--------:|----------:|---------:|
|2 |my_method | 1000| 0.00|NA | 0.00| 0| NA| NA|
|1 |transform_method | 1000| 0.47|NA | 0.47| 0| NA| NA|
【讨论】:
您可以通过仅在 0 和 1 之间绘制一个随机数来做到这一点。如果随机数小于“1 的概率”,则绘制 1,否则绘制 0。例如
set.seed(101)
dd <- data.frame(prob_of_one = runif(100))
transform(dd, draw = ifelse(runif(length(prob_of_one))<prob_of_one, 1, 0))
这是有效的,因为如果您有 1 等于 0.9 的概率,并且您从均匀 (0,1) 分布中随机抽取,则 90% 的时间它将小于 0.9。
【讨论】: