R中多个二项式随机数的仿真

时间:2019-04-19 15:03:25

标签: r algorithm random statistics simulation

我有以下算法

第1步:生成X1 = x1〜Bin(6,1 / 3)

第2步。生成X2 | X1 = x1〜Bin(6-x1,(1/3)/(1-1 / 3))

第3步。生成X3 | X1 = x1,X2 = x2〜Bin(6-x1-x2,(1/3)/(1-1 / 3-1 / 3))

步骤4。重复步骤1-3 N次。

这是我在R中实现此算法的方法:

mult_binom<-function(n) #n=6
{
  n=1000
  random_vectors<-Matrix(0,n,3)

  for(i in 1:n){

    X1<-rbinom(n,3,1/3) 

    X2<-rbinom(n-X1,3,(1/3)/(1-(1/3)))

    X3<-rbinom(n-X1-X2,3,(1/3)/(1-(1/3)-(1-3)))


    arr<-c(X1,X2,X3)


  }
  for(j in 1:n){

    random_vectors[j]<-arr[j]
  }
  return(random_vectors)
}

将函数调用为mult_bin(6)会产生一个相似矩阵,如下所示

1000 x 3 sparse Matrix of class "dgCMatrix"

  [1,] 1 . .
  [2,] 1 . .
  [3,] 1 . .
  [4,] 2 . .
  [5,] 1 . .
  [6,] 1 . .
  [7,] 1 . .
  [8,] . 3 .

,并持续到[1000,]

我没想到会有这个结果。

为什么点在那里?

我做错了什么?

1 个答案:

答案 0 :(得分:3)

您的实现中存在几个错误。最重要的是,rbinom的第一个参数不是二项式分布中的参数n,而是您要生成的随机数的数量。

这是我的解决方案。我的函数仅在实验时返回。然后,我使用复制返回多个(以我的情况为5个)实验的结果:

myfun <- function(){

  x1 <- rbinom(1, 6, 1/3) 
  x2 <- rbinom(1, 6 - x1, (1/3)/(1-(1/3)))
  x3 <- rbinom(1, 6 - x1 - x2, (1/3)/(1-(1/3)-(1/3)))

  return(c(X1 = x1, X2 = x2, X3 = x3))  
}

    set.seed(1)
    replicate(5, myfun())
   [,1] [,2] [,3] [,4] [,5]
X1    1    4    4    0    3
X2    2    0    1    2    1
X3    3    2    1    4    2

在此输出中,每一列都是一个实验的结果。您会看到数字总和为6。 还要注意,我用set.seed设置了一个随机种子。这样可以确保您的结果可重复。

在输出中出现点是因为您使用Matrix包来创建Matrix对象,而不是使用“常规”矩阵。通常,您使用matrix而不是Matrix创建矩阵。

相关问题