r - R中多个二项式随机数的模拟
问题描述
我有以下算法
Step 1. 生成 X1=x1~Bin(6,1/3)
Step 2. 生成 X2|X1=x1~Bin(6-x1,(1/3)/(1-1/3))
Step 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)
}
调用函数 asmult_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
来自二项分布的参数,而是您要生成的随机数的数量。
这是我的解决方案。我的函数只在实验中返回。然后我使用复制返回多个(在我的情况下为 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
not 创建一个矩阵Matrix
。
推荐阅读
- airflow - 气流任务没有开始日期、结束日期和持续时间
- mysql - 在 mysql select 语句中的 mysql 过程中使用“”,但出现 Invalid column name 错误
- flutter - Dart (Flutter) 中的常量构造函数
- xpath - XPath“和”混淆
- linux - ioctl 与 Linux 中的内核模块
- python - Python脚本在anaconda3上运行时不在cmd上运行
- java - 试图创建一个输出所有可能的字母 AD 组合的程序
- java - 为什么 Spring State Machine PersistStateChangeListener 组件有时不在同一线程中执行?
- javascript - reactcodesandbox 不同行为输入不失焦点
- regex - 正则表达式查找不在列表中的单词