我有以下算法
步骤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,]
我没想到这个结果。
为什么有点?
我做错了什么?
您的实施中存在多个错误。最重要的一点是rbinom
的第一个参数不是二项分布中的参数n
,而是你想要生成的随机数的数量。
这是我的解决方案。我的功能只返回实验。然后我使用replicate返回多个(在我的情况下为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
创建一个矩阵。