2013-03-12 122 views

回答

11

参见?RNGkind。缺省值是反相的算法:

normal.kind可以是 “Kinderman-拉梅奇”, “越野车Kinderman-拉梅奇”(未 为set.seed), “阿伦斯-迪特”, “箱穆勒”, “反转” (默认为 )或“用户提供”。 (关于反演,请参阅 qnorm中的参考文献。)在1.7.1 (现在称为“Buggy”)之前版本中使用的Kinderman-Ramage发生器有几个近似误差,只应使用 复制旧结果。 “Box-Muller”生成器是 有状态的,因为法线对是按顺序生成和返回的。 只要选择了状态(即使它是当前的正常发生器 )并且更改了种类,状态也会重置。

您可以通过

RNGkind(normal.kind = "Box-Muller") 

改变算法,可以找到什么是目前通过观察RNGkind()[2]设置。

+0

谢谢,你知道吗,如果mvtnorm包使用rnorm函数来生成标准正态分布随机数? – Klaus 2013-03-12 19:50:08

+0

@Klaus是的,'mvtnorm'的'rmvnorm'使用相同的'rnorm'函数。 – 2013-03-12 20:03:42

+0

他们使用默认选项? – Klaus 2013-03-12 20:06:32

6

其他答案已经足够,但留给我更多的问题;特别是我没有看到文档中的任何地方* "Inversion"算法在地球上是什么,所以我潜入source code,这也给出了起源于其他可能算法的论文的学术参考,以找出究竟做了什么。

case INVERSION: 
#define BIG 134217728 /* 2^27 */ 
    /* unif_rand() alone is not of high enough precision */ 
    u1 = unif_rand(); 
    u1 = (int)(BIG*u1) + unif_rand(); 
    return qnorm5(u1/BIG, 0.0, 1.0, 1, 0); 

因此,似乎在基部默认"Inversion"算法生成一个很长的浮点数,然后将其发送到qnorm5函数,它是用于正常分布的CDF函数。

至于qnorm5功能是如何工作的(假设没有为普通CDF也不逆CDF没有封闭的形式),我没有多少运气破裂似乎是源代码here,但他们提供进一步的学术参考文献,即Beasley, J. D. and S. G. Springer (1977)Wichura, M.J. (1988);前者通常用于CDF的小分位数,后者用于大型(大约z>7)。

注意到(截止撰写本文)此算法似乎是shared by the Julia language,它也共享R使用的qnorm5代码也可能是有趣的。 *公平地说,回顾起来,Wichura在?qnorm中被提及,上面引用了它。我认为,在这篇文章中仍然有必要说明一些事情。

+0

谢谢!我正在寻找这个答案! – 2017-07-09 00:16:27