2013-03-12 21 views

risposta

11

Vedere ?RNGkind. L'impostazione predefinita è un algoritmo di inversione:

normal.kind può essere "Kinderman-Ramage", "Buggy Kinderman-Ramage" (non per set.seed), "Ahrens-Dieter", "Box-Muller", "inversione" (il valore predefinito di ) o "fornito dall'utente". (Per l'inversione, vedere il riferimento in qnorm.) Il generatore di Kinderman-Ramage utilizzato nelle versioni precedenti alla 1.7.1 (ora chiamato "Buggy") presentava diversi errori di approssimazione e dovrebbe essere utilizzato solo per la riproduzione dei vecchi risultati solo per . Il generatore "Box-Muller" è stateful poiché le coppie di normali vengono generate e restituite in sequenza. Lo stato viene ripristinato ogni volta che viene selezionato (anche se è il generatore normale corrente) e quando il tipo viene modificato.

È possibile modificare l'algoritmo da

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

È possibile trovare ciò che è attualmente impostato, cercando in RNGkind()[2].

+0

grazie, lo sai, se la funzione rnorm viene utilizzata dal pacchetto mvtnorm per generare numeri casuali distribuiti standard normali? – Klaus

+0

@Klaus yes, 'mvtnorm''s' rmvnorm' usa la stessa funzione 'rnorm'. –

+0

usano l'opzione predefinita? – Klaus

6

L'altra risposta è sufficiente, ma mi ha lasciato qualche domanda in più; in particolare, non ho visto da nessuna parte nella documentazione * cosa diavolo è l'algoritmo "Inversion", quindi mi sono tuffato nel source code, che fornisce anche riferimenti accademici ai documenti che originano gli altri possibili algoritmi, per capire cosa si sta facendo esattamente .

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); 

Così sembra alla base l'algoritmo predefinito "Inversion" genera un numero punto molto lungo galleggiante, quindi li invia alla funzione qnorm5 che è funzione CDF per la distribuzione normale.

Per quanto riguarda il funzionamento della funzione di qnorm5 (dato non v'è alcuna forma chiusa per il CDF normale né inverso CDF), non ho avuto molta fortuna fessurazione quello che sembra essere il codice sorgente here, ma lo fanno dare ulteriore accademico riferimenti, ovvero Beasley, J. D. and S. G. Springer (1977) e Wichura, M.J. (1988); il primo è tipicamente usato per piccoli quantili del CDF e il secondo per grandi (z>7 o giù di lì).

Potrebbe anche essere interessante notare che (al momento della stesura di questo documento) questo algoritmo sembra essere shared by the Julia language, che condivide anche il codice qnorm5 utilizzato da R.

* Per correttezza, in retrospettiva, Wichura è menzionato in ?qnorm a cui si fa riferimento in precedenza. Comunque, vale la pena di precisare le cose in questa discussione, penso.

+0

Grazie! Stavo cercando questa risposta! –

Problemi correlati