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