不使用R中的内置函数生成几何变量

不使用R中的内置函数生成几何变量,r,R,我正在学习R,刚刚开始模拟不同的概率分布。我试图从几何分布中生成一个随机变量。我不愿意在R中使用内置函数rgeom来做同样的事情。在其他方法中,我决定使用以下结果: 几何分布是获得一次成功所需的伯努利试验次数的概率分布 我编写了生成一个贝努利变量的函数,名为ber,其中p为成功概率 现在要生成一个几何变量,我可以运行一个循环(我在这里使用了一个repeat循环)并连续生成一个贝努利变量,检查它是否成功,依此类推 我是这样做的: geom<-function(p) { x<-1

我正在学习R,刚刚开始模拟不同的概率分布。我试图从几何分布中生成一个随机变量。我不愿意在R中使用内置函数
rgeom
来做同样的事情。在其他方法中,我决定使用以下结果:

几何分布是获得一次成功所需的伯努利试验次数的概率分布

我编写了生成一个贝努利变量的函数,名为
ber
,其中
p
为成功概率

现在要生成一个几何变量,我可以运行一个循环(我在这里使用了一个
repeat
循环)并连续生成一个贝努利变量,检查它是否成功,依此类推

我是这样做的:

geom<-function(p)
{
    x<-1
    repeat
    {
        if(ber(p)==1) break
        x<-x+1
    }
    return(x)
}
我想做什么,我被困在哪里: 我想用一种矢量化的方法代替这个
repeat
loop方法来生成一个几何变量,但我似乎已经没有办法实现这一点了。这里非常欢迎任何帮助/建议和提示

注1:至于我为什么定义了一个新函数
geom(p)
,我最初计划生成的不是一个而是许多(比如
n
)几何变量。我认为这样定义一个函数,然后使用
replicate
函数来生成更多类似的变量,并且具有相同的成功概率更容易


注2:如果我以前的一些帖子看起来很相似,我真的很抱歉(从某种意义上说,我是
R
的新手,我仍然在学习向量化方法。

没有使用循环,您可以利用几何随机变量具有可逆累积分布函数这一事实,并使用。几何变量版本的CDF(第一次成功的次数,而不是在第一次成功之前计算失败次数的版本)为:

对于x,我们可以这样求解:

x = log(1-F(x))/(log(1-p))
要使用反向采样,我们需要取其上限,使其离散:

geom <- function(n,p) {
  ceiling(log(runif(n))/log(1-p))
}
编辑时一种更符合您当前所拥有的方法是创建一个完整的随机变量向量,将所有变量初始化为
0
,并保持变量索引列表仍处于“活动”状态,即实验仍在等待成功。在每个步骤中,将1添加到这些活动变量中,并以概率
1-p
在下一步骤中保持一些指数的活动:

geom2 <- function(n,p) {
  nums <- numeric(n)
  active <- 1:n
  k <- n
  while(k > 0){
    nums[active] <- nums[active]+1
    active <- active[runif(k) <= 1-p]
    k = length(active)
  }
  nums
}

geom2不错的一个。。。但是有没有办法将我的方法转换成矢量化方法呢?我真的很想知道that@DebarthaPaul我添加了第二种方法,它似乎更接近您所做的。
geom <- function(n,p) {
  ceiling(log(runif(n))/log(1-p))
}
> set.seed(42)
> geom(10,1/6)
 [1]  1  1  7  2  3  4  2 11  3  2
> mean(geom(100000,1/6))
[1] 6.00359
geom2 <- function(n,p) {
  nums <- numeric(n)
  active <- 1:n
  k <- n
  while(k > 0){
    nums[active] <- nums[active]+1
    active <- active[runif(k) <= 1-p]
    k = length(active)
  }
  nums
}