使用rbinom生成随机数但从范围中排除0

时间:2017-05-10 08:02:45

标签: r random

我需要使用rbinom生成随机数,但我需要在范围内排除0。

我该怎么做?

我想要类似的东西:

k <- seq(1, 6, by = 1)

binom_pdf = dbinom(k, 322, 0.1, log = FALSE)

但我需要获取所有相关数据集,因为如果我执行以下操作:

binom_ran = rbinom(100, 322, 0.1)

我得到的值从0到100。

有什么方法可以解决这个问题吗?

由于

2 个答案:

答案 0 :(得分:3)

假设我们有固定的参数:

  • n :生成值的数量
  • s :实验的大小
  • p :成功的可能性

     # Generate initial values
       U<-rbinom(n,s,p)
       # Number and ubication of zero values
         k<-sum(U==0)
         which.k<-which(U==0)
    
     # While there is still a zero, . . . generate new numbers
       while(k!=0){
         U[which.k]<-rbinom(k,s,p)
           k<-sum(U==0)
           which.k<-which(U==0)
         # Print how many zeroes are still there
           print(k)
     }
    
    # Print U (without zeroes)
      U
    

答案 1 :(得分:1)

除了命中和未命中方法之外,如果你想从二项式的条件分布中取样,假设成功的数量至少为1,你可以计算条件分布,然后直接从中取样。

如果X是带参数pn的二项式,则很容易理解,那么

P(X = x | X > 0) = P(X = x)/(1-p)

因此以下功能将起作用:

rcond.binom <- function(k,n,p){
  probs <- dbinom(1:n,n,p)/(1-p)
  sample(1:n,k,replace = TRUE,prob = probs)
}

如果您要使用相同的np多次调用上述函数,那么您可以预先计算向量probs并只需使用函数的最后一行你需要它。

我还没有对它进行基准测试,但我怀疑当k很小,p不太接近0时n时,最好采用这种方式。 }较大,但对于较大的k较大,p较接近0,n较小,则上述情况可能更为可取。