Question:
Génération de nombres aléatoires en utilisant la distribution t ou la distribution laplace
user
2011-05-21 23:53:14 UTC
view on stackexchange narkive permalink

Je suis un débutant en statistique. Je termine ma thèse en algorithme évolutif. Je dois générer des nombres aléatoires à partir de la distribution T ou de la distribution Laplace. Comment puis-je faire cela?

Une explication simple et simple serait appréciée.

@crucified Un progiciel statistique en tête?
Je veux implémenter dans matlab
@cruc Matlab a une distribution t inverse: voir http://www.mathworks.com/help/toolbox/stats/tinv.html. Tout ce que vous faites est d'appliquer cette fonction à une variable aléatoire uniforme dans la plage (0,1).
Comme `tinv` fait partie de la boîte à outils Statistiques, vous devrez payer un supplément pour cela, sauf si vous êtes éligible pour une version étudiante, auquel cas elle fait partie du package.
** Rapide et sale **: `sqrt (n) * randn (1) / norm (randn (n, 1))` générera une variable $ t $ distribuée avec $ n $ degrés de liberté. C'est probablement le plus rapide à coder, mais certainement pas le plus rapide à exécuter, surtout si vous en avez besoin d'un très grand nombre.
Je ne sais pas trop pourquoi vous avez pris la peine de poser des questions sur la distribution Laplace, car elle vous indique explicitement comment les générer dans le lien que vous donnez dans votre question!
Cinq réponses:
#1
+9
Jonas
2011-05-22 01:47:24 UTC
view on stackexchange narkive permalink

Voici comment faire cela dans Matlab en utilisant TINV à partir de cette boîte à outils de statistiques:

 % # choisissez le degré de libertédf = 4; % # note que vous pouvez également choisir un tableau de df si nécessaire% # créer un vecteur de 100000 varibles aléatoires uniformément distribuésuni = rand (100000,1);% # rechercher les valeurs t correspondantesout = tinv (uni, df);  

Avec une version plus récente de Matlab, vous pouvez également simplement utiliser TRND pour créer directement les nombres aléatoires.

  out = trnd (100000, df);  

Voici l'histogramme de out enter image description here

EDIT Re: question fusionnée

Matlab n'a pas de fonction intégrée pour dessiner des nombres à partir d'une distribution Laplace. Cependant, il existe la fonction LAPRND de Matlab File Exchange qui fournit une implémentation bien écrite.

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

Réponse facile: utilisez R et obtenez des variables n pour une distribution $ t $ avec df degrés de liberté par rt (n, df) . Si vous n'utilisez pas R, vous pourrez peut-être écrire la langue que vous utilisez, et d'autres pourront peut-être dire précisément ce qu'il faut faire.

Si vous n'utilisez pas R ou un autre langage avec un générateur de nombres aléatoires intégré pour la distribution $ t $, mais que vous avez accès à la fonction quantile , $ Q $, pour la distribution $ t $ et vous pouvez générer une variable aléatoire uniforme $ U $ sur $ [0,1] $ alors $ Q (U) $ suit une distribution $ t $.

Sinon, jetez un œil à cette brève section de la page Wikipédia.

Veuillez pardonner mon ignorance. Je veux le faire dans matlab. Je devrai peut-être utiliser une distribution t avec des degrés de liberté allant de 1 à 30. Dans le wiki, une formule pour seulement 1, 2, 4 degrés de liberté est donnée. Existe-t-il une formule généralisée pour la fonction quantile? Pourriez-vous donner des formules pour d'autres nombres pairs de degrés de liberté?
@crucified, aucune forme fermée n'existera pour la fonction $ t $ quantile. Voir les références de G. W. Hill répertoriées [ici] (http://stat.ethz.ch/R-manual/R-patched/library/stats/html/TDist.html). Vous pouvez également obtenir le code source de [GSL] (http://www.gnu.org/software/gsl/) et rechercher les [fonctions appropriées] (http://www.gnu.org/software/gsl/ manuel / html_node / The-t_002ddistribution.html). Je n'ai pas regardé moi-même, mais c'est probablement assez facile à porter sur MATLAB.
@cardinal +1, d'autant plus qu'il existe des liaisons GSL pour Octave.
#3
+5
petrichor
2011-06-15 16:14:10 UTC
view on stackexchange narkive permalink

En regardant l'article de Wikipedia, j'ai écrit une fonction pour générer des variables aléatoires à partir de la distribution de Laplace. Le voici:

  function x = laplacernd (mu, b, sz)% LAPLACERND Générer des variables aléatoires laplaciennes%% x = LAPLACERND (mu, b, sz) génère des variables aléatoires à partir d'un Laplace% distribution ayant les paramètres mu et b. sz représente la taille des% de variables aléatoires renvoyées. Voir [1] pour la distribution de Laplace.%% [1] http://en.wikipedia.org/wiki/Laplace_distribution%% par Ismail Ari, 2011if nargin < 1% Égal à la distribution exponentielle mise à l'échelle de 1/2 mu = 0; endif nargin < 2 b = 1; endif nargin < 3 sz = 1; endu = rand (sz) - 0,5; x = mu - b * signe (u). * log (1-2 * abs (u));  

Et voici un extrait de code pour l'utiliser

  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 meilleure solution gratuite (la plus rapide à exécuter, pas la plus rapide à coder;) que j'ai trouvée dans Matlab était d'envelopper la bibliothèque MATHLIB_STANDALONE c de R avec une fonction mex. Cela vous donne accès au PRNG t-distribution de R. L'un des avantages de cette approche est que vous pouvez également utiliser la même astuce pour obtenir des variables d'une distribution t non centrale.

La deuxième meilleure solution gratuite était d'utiliser l'implémentation d'octave de trnd. Le portage à partir d'octave s'est avéré être plus de travail que d'envelopper du code c pour moi.

À mon goût, utiliser la génération uniforme via rand et l'inversion via tinv était beaucoup trop lent. YMMV.

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

Vous pouvez utiliser la même approche que celle décrite en réponse à votre question sur la génération de nombres aléatoires à partir d'une distribution t. Commencez par générer des nombres aléatoires uniformément distribués à partir de (0,1), puis appliquez la fonction de distribution cumulative inverse de la distribution de Laplace, qui est donnée dans l'article de Wikipédia auquel vous avez lié.

** NB: ** Ceci est une réponse à une deuxième question qui a ensuite été fusionnée avec la présente. Comme @mark999 le souligne correctement ici, les deux questions sont les mêmes sauf que l'une demande des variables de Laplace et l'original (celle-ci) demande des variables de Student t.
@whuber:, il peut donc être judicieux d'éditer cette question pour inclure la distribution Laplace.


Ce Q&R a été automatiquement traduit de la langue anglaise.Le contenu original est disponible sur stackexchange, que nous remercions pour la licence cc by-sa 3.0 sous laquelle il est distribué.
Loading...