【问题标题】:Random draws with a vector of probabilities带有概率向量的随机抽奖
【发布时间】: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 值?

【问题讨论】:

    标签: r random


    【解决方案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|
    

    【讨论】:

      【解决方案2】:

      您可以通过仅在 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。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-03-10
        • 2018-07-11
        • 1970-01-01
        • 2013-12-18
        • 1970-01-01
        • 2020-07-13
        • 2013-07-09
        相关资源
        最近更新 更多