2013-03-12 115 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