Comment échantillonner à partir de ?

19

Je veux échantillonner selon une densité où et sont strictement positifs. (Motivation: cela pourrait être utile pour l'échantillonnage de Gibbs lorsque le paramètre de forme d'une densité gamma a une priorité uniforme.)

F(une)cuneune-1Γ(une)1(1,)(une)
c

Quelqu'un sait-il facilement échantillonner à partir de cette densité? Peut-être que c'est standard et juste quelque chose que je ne sais pas?

Je peux penser à un stupide algorithme d'échantillonnage de rejet qui fonctionnera plus ou moins (trouver le mode de , échantillon d'uniforme dans une grande boîte et rejeter si ), mais (i) ce n'est pas du tout efficace et (ii) sera trop gros pour qu'un ordinateur puisse le gérer facilement même modérément grand et . (Notez que le mode pour les grands et est approximativement à .) f ( a , u ) [ 0 , 10 a ] × [ 0 , f ( a ) ] u > f ( a ) f ( a ) c duneF(une,u)[0,dixune]×[0,F(une)]u>F(une)F(une)cd a = c dcune=c

Merci d'avance pour votre aide!

NF
la source
+1 bonne question. Je ne sais pas s'il existe une approche standard.
suncoolsu
Avez-vous déjà vérifié (des idées) dans les endroits "évidents", comme, par exemple, le texte de Devroye ?
cardinal
Oui, j'ai déjà essayé un certain nombre d'idées du texte de Devroye. Le a rendu difficile l'accès à la plupart d'entre eux, bien que ... la plupart des approches semblent nécessiter soit l'intégration (pour trouver le cdf), la décomposition en fonctions plus simples, soit la délimitation par des fonctions plus simples ... mais la Γ fonction rend toutes ces difficultés. Si quelqu'un a des idées sur où chercher des approches pour ces sous-problèmes - par exemple, où la fonction Γ apparaît-elle de manière "essentielle" comme ici (pas seulement comme constante de normalisation) dans les statistiques - cela pourrait être très utile pour moi ! Γ(une)ΓΓ
NF
Il y a une énorme différence entre le cas et c d 2 . Devez-vous couvrir ces deux cas? c<2c2
whuber
1
C'est vrai - merci. On peut supposer que . cd2
NF

Réponses:

21

L'échantillonnage de rejet fonctionnera exceptionnellement bien lorsque et est raisonnable pour c d exp ( 2 ) .cexp(5)cexp(2)

Pour simplifier un peu les mathématiques, soit , écrivez x = a et notez quek=cX=une

F(X)kXΓ(X)X

pour . Réglage x = u 3 / 2 donneX1X=u3/2

F(u)ku3/2Γ(u3/2)u1/2u

pour . Lorsque k exp ( 5 ) , cette distribution est extrêmement proche de la normale (et se rapproche à mesure que k grandit). Plus précisément, vous pouvezu1kexp(5)k

  1. Trouvez le mode de numériquement (en utilisant, par exemple, Newton-Raphson).F(u)

  2. Développez au deuxième ordre sur son mode.JournalF(u)

Cela donne les paramètres d'une distribution normale très approximative. Avec une grande précision, cette normale approximative domine sauf dans les queues extrêmes. (Lorsque k < exp ( 5 ) , vous devrez peut-être augmenter légèrement le pdf normal pour assurer la domination.)F(u)k<exp(5)

Ayant effectué ce travail préliminaire pour une valeur donnée de et ayant estimé une constante M > 1 (comme décrit ci-dessous), l'obtention d'une variable aléatoire est une question de:kM>1

  1. Tirez une valeur de la distribution normale dominante g ( u ) .ug(u)

  2. Si ou si une nouvelle variable uniforme X dépasse f ( u ) / ( M g ( u ) ) , retournez à l'étape 1.u<1XF(u)/(Mg(u))

  3. Set .X=u3/2

Le nombre prévu d'évaluations de raison des écarts entre g et f n'est que légèrement supérieur à 1. (Certaines évaluations supplémentaires se produiront en raison des rejets de variances inférieures à 1 , mais même lorsque k est aussi faible que 2, la fréquence de telles les occurrences sont petites.)FgF1k2

Tracé de f et g pour k = 5

Ce graphique montre les logarithmes de g et f en fonction de u pour . Parce que les graphiques sont si proches, nous devons inspecter leur ratio pour voir ce qui se passe:k=exp(5)

tracé du rapport de log

Ceci affiche le rapport logarithmique ; le facteur M = exp ( 0,004 ) a été inclus pour garantir que le logarithme est positif dans toute la partie principale de la distribution; c'est-à-dire pour assurer M g ( u ) f ( u ) sauf éventuellement dans des régions de probabilité négligeable. En rendant M suffisamment grand, vous pouvez garantir que M gJournal(exp(0,004)g(u)/F(u))M=exp(0,004)Mg(u)F(u)MMgdomine dans toutes les queues sauf les plus extrêmes (qui n'ont pratiquement aucune chance d'être choisies dans une simulation de toute façon). Cependant, plus M est grand, plus les rejets se produisent fréquemment. Lorsque k devient grand, M peut être choisi très près de 1 , ce qui n'entraîne pratiquement aucune pénalité.FMkM1

Une approche similaire fonctionne même pour , mais des valeurs assez grandes de M peuvent être nécessaires lorsque exp ( 2 ) < k < exp ( 5 ) , car f ( u ) est sensiblement asymétrique. Par exemple, avec k = exp ( 2 ) , pour obtenir un g raisonnablement précis, nous devons définir M = 1 :k>exp(2)Mexp(2)<k<exp(5)F(u)k=exp(2)gM=1

Tracer pour k = 2

La courbe rouge supérieure est le graphique de tandis que la courbe bleue inférieure est le graphique de log ( f ( u ) ) . L'échantillonnage de rejet de f par rapport à exp ( 1 ) g entraînera le rejet d' environ 2/3 de tous les tirages d'essai, triplant l'effort: toujours pas mal. La queue droite ( u > 10 ou x > 10 3 / deux ~ 30Journal(exp(1)g(u))Journal(F(u))Fexp(1)gu>dixX>dix3/230) sera sous-représentée dans l'échantillonnage de rejet (car n'y domine plus f ), mais cette queue comprend moins que exp ( - 20 ) 10 - 9 de la probabilité totale.exp(1)gFexp(-20)dix-9

Pour résumer, après un effort initial pour calculer le mode et évaluer le terme quadratique de la série de puissance de autour du mode - un effort qui nécessite au plus quelques dizaines d'évaluations de fonction - vous pouvez utiliser l'échantillonnage de rejet à un coût prévu compris entre 1 et 3 (ou plus) évaluations par variable. Le multiplicateur de coût tombe rapidement à 1 lorsque k = c d augmente au-delà de 5.F(u)k=c

Même lorsqu'un seul tirage de est nécessaire, cette méthode est raisonnable. Il prend tout son sens lorsque de nombreux tirages indépendants sont nécessaires pour la même valeur de k , car le surcoût des calculs initiaux est amorti sur de nombreux tirages.Fk


Addenda

@Cardinal a demandé, tout à fait raisonnablement, le soutien d'une partie de l'analyse de la main dans ce qui précède. En particulier, pourquoi la transformation faire la distribution à peu près normale?X=u3/2

À la lumière de la théorie des transformations de Box-Cox , il est naturel de rechercher une transformation de puissance de la forme (pour une constante α , espérons-le pas trop différente de l'unité) qui rendra une distribution "plus" normale. Rappelons que toutes les distributions normales sont simplement caractérisées: les logarithmes de leurs pdfs sont purement quadratiques, avec zéro terme linéaire et aucun terme d'ordre supérieur. Par conséquent, nous pouvons prendre n'importe quel pdf et le comparer à une distribution normale en étendant son logarithme en tant que série de puissance autour de son pic (le plus élevé). Nous recherchons une valeur de α qui fait (au moins) le troisièmeX=uαααla puissance s'évanouit, au moins approximativement: c'est le plus que l'on puisse raisonnablement espérer qu'un seul coefficient libre accomplira. Cela fonctionne souvent bien.

Mais comment maîtriser cette distribution particulière? En effectuant la transformation de puissance, son pdf est

F(u)=kuαΓ(uα)uα-1.

Prenez son logarithme et utilisez l'expansion asymptotique de Stirling de :Journal(Γ)

log(f(u))log(k)uα+(α1)Journal(u)-αuαJournal(u)+uα-Journal(2πuα)/2+cu-α

(pour les petites valeurs de , ce qui n'est pas constant). Cela fonctionne à condition que α soit positif, ce que nous supposerons être le cas (car sinon nous ne pouvons pas négliger le reste de l'expansion).cα

Calculez sa dérivée troisième (qui, lorsqu'elle est divisée par Sera le coefficient de la troisième puissance de u dans la série de puissance) et exploitez le fait qu'au sommet, la dérivée première doit être nulle. Cela simplifie considérablement la troisième dérivée, donnant (approximativement, parce que nous ignorons la dérivée de c )3!uc

12u-(3+α)α(2α(2α-3)u2α+(α2-5α+6)uα+12cα).

Lorsque n'est pas trop petit, u sera en effet grand au sommet. Parce que α est positif, le terme dominant dans cette expression est la puissance 2 α , que nous pouvons mettre à zéro en faisant disparaître son coefficient:kuα2α

2α-3=0.

Voilà pourquoi les fonctionne si bien: avec ce choix, le coefficient du terme cubique autour du pic se comporte comme u - 3 , qui est proche de exp ( - 2 k ) . Une fois que k dépasse 10 environ, vous pouvez pratiquement l'oublier, et il est raisonnablement petit, même pour k jusqu'à 2. Les puissances supérieures, à partir du quatrième, jouent de moins en moins un rôle lorsque k devient grand, car leurs coefficients augmentent proportionnellement plus petit aussi. Par ailleurs, les mêmes calculs (basés sur la dérivée seconde de l o g ( fα=3/2u-3exp(-2k)kkk à son apogée) montre que l'écart-type de cette approximation normale est légèrement inférieur à 2log(F(u)), avec l'erreur proportionnelle àexp(-k/2).23exp(k/6)exp(-k/2)

whuber
la source
(+1) Excellente réponse. Peut-être pourriez-vous développer brièvement la motivation de votre choix de variable de transformation.
cardinal
Belle addition. Cela fait une réponse très, très complète!
cardinal
11

J'aime beaucoup la réponse de @ whuber; il est susceptible d'être très efficace et a une belle analyse. Mais cela nécessite une compréhension approfondie de cette distribution particulière. Pour les situations où vous n'avez pas cette idée (donc pour différentes distributions), j'apprécie également l'approche suivante qui fonctionne pour toutes les distributions où le PDF est deux fois différenciable et que la dérivée seconde a un nombre fini de racines. Cela nécessite un peu de travail à configurer, mais ensuite vous avez un moteur qui fonctionne pour la plupart des distributions que vous pouvez lui lancer.

Fondamentalement, l'idée est d'utiliser une limite supérieure linéaire par morceaux au PDF que vous adaptez lorsque vous effectuez un échantillonnage de rejet. Dans le même temps, vous avez une baisse linéaire par morceauxà destination du PDF, ce qui vous évite d'avoir à évaluer le PDF trop fréquemment. Les limites supérieures et inférieures sont données par des accords et des tangentes au graphique PDF. La division initiale en intervalles est telle qu'à chaque intervalle, le PDF est soit tout concave, soit tout convexe; chaque fois que vous devez rejeter un point (x, y), vous subdivisez cet intervalle en x. (Vous pouvez également effectuer une subdivision supplémentaire en x si vous deviez calculer le PDF car la limite inférieure est vraiment mauvaise.) Cela rend les subdivisions particulièrement fréquentes lorsque les limites supérieures (et inférieures) sont mauvaises, vous obtenez donc une très bonne approximation de votre PDF essentiellement gratuitement. Les détails sont un peu difficile à obtenir à droite, mais j'ai essayé d'expliquer la plupart d'entre eux dans cette série de blogs messages - en particulierle dernier .

Ces messages ne discutent pas de ce qu'il faut faire si le PDF n'est pas limité, ni dans le domaine ni dans les valeurs; Je recommanderais la solution quelque peu évidente soit de faire une transformation qui les rend finis (ce qui serait difficile à automatiser) soit d'utiliser une coupure. Je choisirais la coupure en fonction du nombre total de points que vous prévoyez de générer, disons N , et je choisirais la coupure de sorte que la partie retirée ait moins de probabilité. (C'est assez facile si vous avez un formulaire fermé pour le CDF; sinon cela pourrait aussi être délicat.)1/(dixN)

Cette méthode est implémentée dans Maple comme méthode par défaut pour les distributions continues définies par l'utilisateur. (Divulgation complète - Je travaille pour Maplesoft.)


J'ai fait un exemple, générant 10 ^ 4 points pour c = 2, d = 3, en spécifiant [1, 100] comme plage initiale pour les valeurs:

graphique

Il y a eu 23 rejets (en rouge), 51 points "en probation" qui se situaient à l'époque entre la borne inférieure et le PDF réel, et 9949 points qui ont été acceptés après avoir vérifié uniquement les inégalités linéaires. C'est 74 évaluations du PDF au total, soit environ une évaluation PDF pour 135 points. Le rapport devrait s'améliorer à mesure que vous générez plus de points, car l'approximation s'améliore de plus en plus (et inversement, si vous ne générez que peu de points, le rapport est pire).

Erik P.
la source
Et en passant - si vous avez besoin d'évaluer le PDF uniquement très rarement parce que vous avez une bonne limite inférieure pour cela, vous pouvez vous permettre de prendre plus de temps pour cela, vous pouvez donc simplement utiliser une bibliothèque bignum (peut-être même MPFR?) Et évaluer la fonction Gamma en cela sans trop craindre de débordement.
Erik P.
(+1) C'est une belle approche. Merci de le partager.
whuber
Le problème de débordement est géré en exploitant les relations (simples) entre Gammas. L'idée est qu'après normalisation du pic autour de , les seuls calculs qui importent sont de la forme Γ ( exp ( c d ) ) / Γ ( x )x est assez proche de exp1Γ(exp(c))/Γ(X)Xexp(k)Γ12
whuber
@whuber re: Gammas: Ah oui - je vois que vous l'avez également suggéré ci-dessus. Merci!
Erik P.
3

Vous pouvez le faire en exécutant numériquement la méthode d'inversion, qui dit que si vous branchez des variables aléatoires uniformes (0,1) dans le CDF inverse, vous obtenez un tirage de la distribution. J'ai inclus un code R ci-dessous qui fait cela, et d'après les quelques vérifications que j'ai faites, cela fonctionne bien, mais c'est un peu bâclé et je suis sûr que vous pouvez l'optimiser.

Si vous n'êtes pas familier avec R, lgamma () est le journal de la fonction gamma; integr () calcule une intégrale 1-D définie; uniroot () calcule la racine d'une fonction en utilisant la bissection 1-D.

# density. using the log-gamma gives a more numerically stable return for 
# the subsequent numerical integration (will not work without this trick)
f = function(x,c,d) exp( x*log(c) + (x-1)*log(d) - lgamma(x) )

# brute force calculation of the CDF, calculating the normalizing constant numerically
F = function(x,c,d) 
{
   g = function(x) f(x,c,d)
   return( integrate(g,1,x)$val/integrate(g,1,Inf)$val )
}

# Using bisection to find where the CDF equals p, to give the inverse CDF. This works 
# since the density given in the problem corresponds to a continuous CDF. 
F_1 = function(p,c,d) 
{
   Q = function(x) F(x,c,d)-p
   return( uniroot(Q, c(1+1e-10, 1e4))$root )
}

# plug uniform(0,1)'s into the inverse CDF. Testing for c=3, d=4. 
G = function(x) F_1(x,3,4)
z = sapply(runif(1000),G)

# simulated mean
mean(z)
[1] 13.10915

# exact mean
g = function(x) f(x,3,4)
nc = integrate(g,1,Inf)$val
h = function(x) f(x,3,4)*x/nc
integrate(h,1,Inf)$val
[1] 13.00002 

# simulated second moment
mean(z^2)
[1] 183.0266

# exact second moment
g = function(x) f(x,3,4)
nc = integrate(g,1,Inf)$val
h = function(x) f(x,3,4)*(x^2)/nc
integrate(h,1,Inf)$val
[1] 181.0003

# estimated density from the sample
plot(density(z))

# true density 
s = seq(1,25,length=1000)
plot(s, f(s,3,4), type="l", lwd=3)

(1,10000)>100000c,

c

Macro
la source
1
La méthode est correcte, mais terriblement douloureuse! Combien d'évaluations de fonction pensez-vous être nécessaires pour une seule variable aléatoire? Milliers? Des dizaines de milliers?
whuber
c(c)XX
1
FuneJournal(c)-Journal(Γ(une))
C'est ce que je fais pour le calcul - cela n'évite toujours pas le débordement. Vous ne pouvez pas exposer un nombre supérieur à environ 500 sur un ordinateur. Cette quantité devient beaucoup plus grande que cela. Je veux dire "assez bien" en le comparant à l'échantillonnage de rejet mentionné par l'OP.
Macro
1
c