关于二项式随机变量的r算法

时间:2019-04-11 20:19:55

标签: r random simulation

我有以下算法(基于this algorithm

  1. 生成U
  2. 定义x = 0,P =(1-p)^ n和F = P
  3. 如果U
  4. 定义P =(n-x) p P /(x + 1)(1-p),F = F + P和x = x + 1
  5. 回到步骤3。

据我所知,在r上将是

varBinom<-function(n,p)
{
  U<-runif(n)
  x<-0
  P<-(1-p)^n
  FF<-P

  for(i in 1:n)
  {
    if(U<FF)
    {
      X<-x
      break
    }
    P<-(n-x)*p*P/(x+1)*(1-p)
    FF<-FF+P
    x<-x+1
  }
  return(x)
}

但是,在编译代码时,我收到十条警告消息,他们都说:

  

警告消息:1:如果(U 1   并且只会使用第一个元素

为什么会这样? 我该如何修复代码?


enter image description here

1 个答案:

答案 0 :(得分:1)

我认为您犯了两个小错误。

  1. 在4中应为P =(nx)* p * P / (x + 1)*(1-p)因此(1-p )位于分母中而不位于分子中。
  2. U是一个随机数,但是您使用n创建了runif(n)个不同的随机数。这也是您收到警告的原因。

因此,这是经过纠正的算法:

varBinom<-function(n, p)
{
  U <- runif(1)
  x <- 0
  P <- (1-p)^n
  FF <- P

  for(i in 1:n)
  {
    if(U<FF) return(x)
    P <- (n-x) * p * P/((x+1)*(1-p))
    FF <- FF+P
    x <- x+1
  }
  return(x)
}

调用15次后,结果如下:

set.seed(1)
replicate(15, varBinom(10, 1/2))
[1] 4 4 5 7 4 7 7 6 6 3 4 4 6 5 6