gpt4 book ai didi

R 生成的随机数少于 rnorm、rexp、rpois 和 runif 指定的随机数

转载 作者:行者123 更新时间:2023-12-02 01:03:01 24 4
gpt4 key购买 nike

我必须为大小为 N 的向量的两组生成随机数。

一组的概率为 p,另一组的概率为 q = 1-p。(例如,对于 p=0.5 的 1000 人,我必须从一个分布生成 500 个随机数,从另一个分布生成 500 个)。由于这是一个模拟,我必须在其中改变“p”,所以我编写了如下生成代码:

group1 = rnorm(n = N*p)
group2 = rnorm(n = N*q) # 1st method
group2 = rnorm(n = (N - N*p)) # 2nd method

使用上述两种方法,R 在 group2 的几行中生成的随机数比应有的少一个(第一种方法约 35% 的行,第二种方法约 12% 的行)。

我也遇到了与 reexp、rpois 和 runif 相同的错误。

下面是两种方法的快照,供您引用。

#### EXAMPLE SCRIPT #####

N = 1000
p1 = seq(0.01, 0.99, 0.001)
q1 = 1 - p1


### FIRST METHOD ###

X = data.frame()
for (i in 1:length(p1))
{
X[i, 1] = p1[i]
X[i, 2] = q1[i]
X[i, 3] = length(runif((N * X[i, 1])))
X[i, 4] = length(runif((N * X[i, 2])))
X[i, 5] = X[i, 4] + X[i, 3]
}

table(X[, 5] == 1000) # column three + coulmn four should sum to 1000


### SECOND METHOD ###

Y = data.frame()
for (i in 1:length(p1))
{
Y[i, 1] = p1[i]
Y[i, 2] = q1[i]
Y[i, 3] = length(runif((N * Y[i, 1])))
Y[i, 4] = length(runif((N - N * Y[i, 1])))
Y[i, 5] = Y[i, 3] + Y[i, 4]
}

table(Y[, 5] == 1000) # column three + coulmn four should sum to 1000

最佳答案

R 常见问题解答 7.31 - 舍入误差 - 您的特定问题归结为:

> p=0.32
> p*1000 + (1-p)*1000
[1]1000

嗯,看起来是正确的。但真的是这样吗?

> (p*1000 + (1-p)*1000) == 1000
[1] FALSE

没有。为什么不?错到什么程度了?

> (p*1000 + (1-p)*1000) - 1000
[1] -1.136868e-13

10^-13 的一部分。这意味着:

> length(runif(1000*p))
[1] 320
> length(runif(1000*(1-p)))
[1] 679

因为:

> as.integer(1000*p)
[1] 320
> as.integer(1000*(1-p))
[1] 679

加起来是 999。有关浮点近似值的详细信息,请参阅 R FAQ 7.31

解决方案是在处理计数时尽可能使用整数。

> Np = as.integer(1000*p)
> length(runif(Np))
[1] 320
> length(runif(1000-Np))
[1] 680

而不是将 q 计算为 1-p 并将其乘以 N 来尝试得到 1000-N*p.

关于R 生成的随机数少于 rnorm、rexp、rpois 和 runif 指定的随机数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26296576/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com