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

时间:2014-10-10 09:50:23

标签: r floating-point

我必须为两组大小为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%)。

我遇到了与rexp,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

1 个答案:

答案 0 :(得分:5)

R FAQ 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中的1份。这意味着:

> 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