R中多项二项随机数模拟异常:结果矩阵为何出现缺失值?
咱们来一步步拆解你遇到的问题——那些稀疏矩阵里的“点”其实是**缺失值(NA)**的占位符,之所以出现大量这类情况,是因为代码里存在好几处逻辑和参数错误,咱们逐一看:
1. 参数被意外覆盖,模拟逻辑完全错位
你的函数定义是mult_binom<-function(n),但函数第一行直接写了n=1000,这会把你调用时传入的n=6直接覆盖成1000,完全违背了你原本“总试验次数为6”的设定。而且循环里的for(i in 1:n)是循环1000次,但每次循环里的rbinom(n,3,1/3)又生成了1000个X1,相当于一次循环就生成了1000组数据,逻辑完全混乱。
2. 二项分布的核心参数写错
步骤1要求生成X1~Bin(6,1/3),但你写的是rbinom(n,3,1/3):
- 第一个参数是生成随机数的个数,单次模拟应该写
1,而不是n; - 第二个参数是二项分布的试验次数
size,应该是6而不是3。
同样,步骤2里的Bin(6-x1, 1/2),你写的是rbinom(n-X1,3,...),这里n已经被改成1000了,n-X1会变成一个完全不符合要求的大数,而且size参数也错写成了3。
3. 概率计算出现低级笔误
步骤3的概率是(1/3)/(1-1/3-1/3)=1,但你写的是(1/3)/(1-(1/3)-(1-3)),这里(1-3)是-2,分母变成了1 - 1/3 + 2 = 8/3,计算出来的概率大于1,这会让rbinom函数直接生成NA(二项分布的概率必须在0到1之间),这也是缺失值的主要来源之一。
4. 矩阵赋值逻辑错误
你创建了random_vectors<-Matrix(0,n,3)(此时n=1000),但循环里每次把arr<-c(X1,X2,X3)(三个长度1000的向量合并成长度3000的向量),然后用for(j in 1:n)把arr[j]赋值给random_vectors[j],这相当于只给矩阵的前1000个元素赋值,剩下的区域都是无效值,稀疏矩阵就会把这些内容显示成点。
我帮你把代码调整成符合步骤要求的版本,同时用普通矩阵(不需要稀疏矩阵,因为模拟结果都是非负整数,没有大量零值):
mult_binom <- function(N = 1000, total_trials = 6) { # N是重复模拟的次数,total_trials是总试验次数(对应步骤里的6) random_vectors <- matrix(0, nrow = N, ncol = 3) for(i in 1:N) { # 步骤1:生成X1 ~ Bin(6, 1/3) X1 <- rbinom(1, size = total_trials, prob = 1/3) # 步骤2:生成X2|X1 ~ Bin(6-X1, (1/3)/(2/3)) = Bin(6-X1, 1/2) X2 <- rbinom(1, size = total_trials - X1, prob = 1/2) # 步骤3:生成X3|X1,X2 ~ Bin(6-X1-X2, 1),其实直接计算剩余值更高效 X3 <- total_trials - X1 - X2 # 把当前组的值赋值到矩阵的第i行 random_vectors[i, ] <- c(X1, X2, X3) } return(random_vectors) } # 调用示例:生成1000组符合要求的随机数 result <- mult_binom(N = 1000, total_trials = 6) # 查看前6组结果 head(result)
说明:步骤3的概率是1,所以可以直接用X3 <- total_trials - X1 - X2代替rbinom,因为剩下的试验次数必然全是X3,这样代码更高效。
内容的提问来源于stack exchange,提问作者user9802913

