![](/img/trans.png)
[英]R runif and rnorm producing same random numbers with vector operation
[英]R generates fewer random numbers than specified with rnorm, rexp, rpois and runif
我必须为两组大小为N的向量生成随机数。
一组的概率为p,另一组的概率为q = 1-p。 (例如,对于1000个p = 0.5的群体,我必须从分布中生成500个随机数,而从另一个分布中生成500个)。 由于这是一个模拟,因此我必须改变“ p”,因此我编写了代码以生成如下代码:
group1 = rnorm(n = N*p)
group2 = rnorm(n = N*q) # 1st method
group2 = rnorm(n = (N - N*p)) # 2nd method
使用上述两种方法,R生成的随机数要比第2组的几行少(第一种方法的行大约为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
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
1 ^在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
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.