使用R语言qbinom与runif函数计算相对频率结果异常求助
R语言分位数二项式模拟中相对频率不符的问题
问题描述
使用R语言的分位数二项式函数qbinom和runif进行数值模拟以获取相对频率时,出现频数结果正常但相对频率不符合预期的情况:
已设置set.seed(123),执行以下代码得到正确的频数:
table(qbinom(runif(1000,0,1),6,0.2))
输出结果:
0 1 2 3 4 5 277 367 245 88 22 1
但执行以下代码计算相对频率时:
table(qbinom(runif(1000,0,1),6,0.2))/1000
得到的结果却与预期不符:
0 1 2 3 4 5 6 0.271 0.402 0.239 0.071 0.014 0.002 0.001
预期的相对频率应为频数除以1000的结果:
0 1 2 3 4 5 0.277 0.367 0.245 0.088 0.022 0.001
问题原因
核心问题在于两次调用runif(1000,0,1)是独立的随机数生成过程:
- 设置
set.seed(123)后,第一次调用runif(1000,0,1)会生成随机数流中的前1000个随机数,对应一组qbinom结果; - 第二次调用
runif(1000,0,1)会接着使用随机数流中接下来的1000个随机数,生成另一组完全不同的qbinom结果; - 两组不同的样本自然会得到不同的频数和相对频率,导致和预期的频数比例不符。
解决方法
先将生成的模拟样本存储到一个变量中,后续的频数统计和相对频率计算都基于同一个样本:
set.seed(123) # 先生成一次样本并保存 sim_samples <- qbinom(runif(1000, 0, 1), 6, 0.2) # 计算频数 table(sim_samples) # 计算相对频率 table(sim_samples)/1000
执行后,频数和相对频率会完全匹配预期结果:
频数输出:
0 1 2 3 4 5 277 367 245 88 22 1
相对频率输出:
0 1 2 3 4 5 0.277 0.367 0.245 0.088 0.022 0.001
内容的提问来源于stack exchange,提问作者Rodrigo Badilla
相关产品推荐
相关产品推荐

