Domanda:
Generazione di numeri casuali utilizzando la distribuzione t o la distribuzione laplace
user
2011-05-21 23:53:14 UTC
view on stackexchange narkive permalink

Sono un principiante in statistica. Sto completando la mia tesi in Algoritmo evolutivo. Devo generare alcuni numeri casuali dalla distribuzione T o dalla distribuzione Laplace. Come posso farlo?

Sarebbe apprezzata una spiegazione facile e semplice.

@crucified Qualche pacchetto statistico in mente?
Voglio implementare in matlab
@cruc Matlab ha una distribuzione t inversa: vedere http://www.mathworks.com/help/toolbox/stats/tinv.html. Tutto quello che devi fare è applicare questa funzione a una variabile casuale uniforme nell'intervallo (0,1).
Dato che "tinv" fa parte del toolbox delle statistiche, dovresti pagare un extra per questo, a meno che tu non sia idoneo per una versione per studenti, nel qual caso fa parte del pacchetto.
** Rapido e sporco **: `sqrt (n) * randn (1) / norm (randn (n, 1))` genererà una variabile distribuita $ t $ con $ n $ gradi di libertà. Questo è probabilmente il più veloce da programmare, ma certamente non il più veloce da eseguire, soprattutto se ne hai bisogno di un numero molto elevato.
Non sono del tutto sicuro del motivo per cui ti sei preso la briga di chiedere informazioni sulla distribuzione di Laplace, poiché ti dice esplicitamente come generarli nel link che fornisci nella tua domanda!
Cinque risposte:
#1
+9
Jonas
2011-05-22 01:47:24 UTC
view on stackexchange narkive permalink

Ecco come farlo in Matlab utilizzando TINV dalla casella degli strumenti delle statistiche:

 % # scegli il grado di libertàdf = 4; % # nota che puoi anche scegliere un array di df se necessario% # crea un vettore di 100.000 variabili casuali distribuite uniformemente: rand (100000,1);% # cerca i valori t corrispondentiout = tinv (uni, df);  

Con una versione più recente di Matlab, puoi anche usare semplicemente TRND per creare direttamente i numeri casuali.

  out = trnd (100000, df);  

Ecco l'istogramma di out enter image description here

EDIT Re: merged question

Matlab non ha una funzione incorporata per estrarre numeri da una distribuzione di Laplace. Tuttavia, esiste la funzione LAPRND di Matlab File Exchange che fornisce un'implementazione ben scritta.

#2
+6
NRH
2011-05-22 00:05:30 UTC
view on stackexchange narkive permalink

Risposta semplice: usa R e ottieni n variabili per una distribuzione $ t $ con df gradi di libertà di rt (n, df) codice>. Se non usi R, forse puoi scrivere quale lingua usi e altri potrebbero essere in grado di dire esattamente cosa fare.

Se non usi R o un altro linguaggio con un generatore di numeri casuali incorporato per la distribuzione $ t $, ma hai accesso alla funzione quantile , $ Q $, per $ t $ -distribuzione e puoi generare una variabile casuale uniforme $ U $ su $ [0,1] $ quindi $ Q (U) $ segue una $ t $ -distribuzione.

Altrimenti dai un'occhiata a questa breve sezione nella pagina di Wikipedia.

Per favore perdona la mia ignoranza. Voglio farlo in matlab. Potrei dover usare la distribuzione t con gradi di libertà che vanno da 1 a 30. In wiki, viene fornita la formula per solo 1, 2, 4 gradi di libertà. Esiste una formula generalizzata per la funzione quantile? Potreste fornire formule per altri numeri pari di gradi di libertà?
@crucified, non esisterà alcuna forma chiusa per la funzione $ t $ quantile. Vedi i riferimenti di G. W. Hill elencati [qui] (http://stat.ethz.ch/R-manual/R-patched/library/stats/html/TDist.html). Puoi anche ottenere il codice sorgente per [GSL] (http://www.gnu.org/software/gsl/) e cercare le [funzioni appropriate] (http://www.gnu.org/software/gsl/ manual / html_node / The-t_002ddistribution.html). Non ho guardato me stesso, ma probabilmente è abbastanza facile portarlo su MATLAB.
@cardinal +1, soprattutto dato il fatto che esistono attacchi GSL per Octave.
#3
+5
petrichor
2011-06-15 16:14:10 UTC
view on stackexchange narkive permalink

Guardando l'articolo di Wikipedia, ho scritto una funzione per generare variabili casuali dalla distribuzione di Laplace. Eccolo:

  funzione x = laplacernd (mu, b, sz)% LAPLACERND Genera variabili casuali laplaciane%% x = LAPLACERND (mu, b, sz) genera variabili casuali da un Laplace% distribuzione avente parametri mu e b. sz sta per la dimensione della% di variabili casuali restituite. Vedere [1] per la distribuzione di Laplace.%% [1] http://en.wikipedia.org/wiki/Laplace_distribution%% di Ismail Ari, 2011 se nargin < 1% uguale alla distribuzione esponenziale scalata di 1/2 mu = 0; endif nargin < 2 b = 1; endif nargin < 3 sz = 1; endu = rand (sz) - 0,5; x = mu - b * segno (u). * log (1-2 * abs (u));  

Ed ecco uno snippet di codice per usarlo

  clc, clearmu = 30; b = 2; sz = [50000 1]; x = laplacernd ( mu, b, sz); hist (x, 100)  

Laplace distribution

#4
+4
shabbychef
2011-05-23 22:29:07 UTC
view on stackexchange narkive permalink

La soluzione gratuita migliore (più veloce da eseguire, non più veloce da programmare;) che ho trovato in Matlab è stata quella di racchiudere la libreria c MATHLIB_STANDALONE di R con una funzione mex. Questo ti dà accesso alla distribuzione t PRNG di R. Un vantaggio di questo approccio è che puoi anche usare lo stesso trucco per ottenere variabili da una distribuzione t non centrale.

La seconda migliore soluzione gratuita era usare l'implementazione di ottava di trnd. Il porting dall'ottava si è rivelato essere più faticoso del wrapping del codice c per me.

Per i miei gusti, utilizzare la generazione uniforme tramite rand e l'inversione tramite tinv era troppo lento. YMMV.

#5
+2
mark999
2011-05-22 11:22:49 UTC
view on stackexchange narkive permalink

Puoi utilizzare lo stesso approccio descritto in risposta alla tua domanda sulla generazione di numeri casuali da una distribuzione t. Prima genera numeri casuali distribuiti uniformemente da (0,1) e poi applica la funzione di distribuzione cumulativa inversa della distribuzione di Laplace, che è data nell'articolo di Wikipedia a cui ti sei collegato.

** NB: ** Questa è una risposta ad una seconda domanda che è stata successivamente fusa con quella attuale. Come @mark999 sottolinea correttamente qui, le due domande sono le stesse tranne che una chiede le varianti di Laplace e l'originale (questa) chiede le variabili di Student.
@whuber: potrebbe avere senso, quindi, modificare questa domanda per includere la distribuzione di Laplace.


Questa domanda e risposta è stata tradotta automaticamente dalla lingua inglese. Il contenuto originale è disponibile su stackexchange, che ringraziamo per la licenza cc by-sa 3.0 con cui è distribuito.
Loading...