【问题标题】:An algorithm in r about binomial random variablesr中关于二项式随机变量的算法
【发布时间】:2019-04-11 20:19:55
【问题描述】:

我有以下算法(基于this algorithm

  1. 生成U
  2. 定义 x=0,P=(1-p)^n 和 F=P
  3. 如果 U
  4. 定义 P=(n-x)pP/(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: 在 if (U 1 并且只使用第一个元素

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


【问题讨论】:

  • 好吧,你似乎从来没有在你的循环中使用i。这似乎有点奇怪。而U 似乎是一个向量,所以不清楚if(U&lt;FF) 是什么意思,因为U 中的任何值、部分值或所有值都可能小于FF,所以不清楚你想要什么.也许你的意思是if (U[i] &lt; FF[i])
  • @MrFlick 是的,这就是我的想法,将 U 视为一个 n 向量,因此在调用函数时输出将是 n 个二项式随机变量,但我想可以用 @987654332 来修复@函数

标签: r random simulation


【解决方案1】:

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

  1. 在 4 中应该是 P=(n-x) * p * P / ((x+1)*(1-p)) 所以 (1-p ) 是分母而不是分子。
  2. U 是一个随机数,但您使用runif(n) 创建了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

【讨论】:

  • 谢谢。我编译了代码,但总是返回 10,为什么?
  • 奇怪,我添加了一段关于如何调用这个函数的代码。有没有可能你用过n= 10p=1
  • 不,我用过n=10p=1/2,但我没看到你也修改了X&lt;-xbreakreturn(x)为什么?另外,我认为我做错了,应该是return(X) 而不是return(x)
  • 是的,你是对的。实际上你不需要Xx 就够了。
  • 只是输出值。您可以执行 X = x 和 return(X),也可以保存一行代码并简单地编写 return(x)。
猜你喜欢
  • 1970-01-01
  • 2019-08-26
  • 2013-04-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-17
  • 2019-09-09
  • 2018-08-29
相关资源
最近更新 更多