首页 > 解决方案 > 带有概率向量的随机抽奖

问题描述

我有一个概率向量。有了概率,我想为每个概率在 (0,1) 之间抽取一个样本。

例如,prob_of_one表示绘制了 1((1-prob_of_one) 是绘制了 0 的概率)。

data.frame(prob_of_one = c(runif(100)),desire_column = NA)

如何在不使用的情况下通过采样获得 0 或 1 值for-loop

标签: rrandom

解决方案


请记住,它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|

推荐阅读