You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 05:18:13