Come campionare da ?


19

Voglio campionare secondo una densità dove e sono strettamente positivi. (Motivazione: questo potrebbe essere utile per il campionamento di Gibbs quando il parametro di forma di una densità Gamma ha un precedente uniforme.)

f(a)cada1Γ(a)1(1,)(a)
cd

Qualcuno sa campionare facilmente da questa densità? Forse è standard e solo qualcosa che non conosco?

Posso pensare a uno stupido algoritmo di campionamento del rifiuto che funzionerà più o meno (trova la modalità di , sample dall'uniforme in una grande scatola e rifiuta se ), ma (i) non è affatto efficiente e (ii) sarà troppo grande per essere gestito facilmente da un computer anche con moderazione grandi c e d . (Notare che la modalità per grandi c e d è approssimativamente a a = cd .) f ( a , u ) [ 0 , 10 a ] × [ 0 , f ( a ) ] u > f ( a ) f ( a ) c d c d a = c daf(a,u)[0,10a]×[0,f(a)]u>f(a)f(a)cdcdun'=cd

Grazie in anticipo per qualsiasi aiuto!


+1 buona domanda. Non sono sicuro che esista un approccio standard.
suncoolsu,

Hai già controllato (per idee) in luoghi "ovvi", come, ad esempio, il testo di Devroye ?
cardinale il

Sì, ho già provato alcune idee dal testo di Devroye. Il Γ(un') ha reso difficile arrivare ovunque con la maggior parte di loro, sebbene ... la maggior parte degli approcci sembra richiedere l'integrazione (per trovare il cdf), la scomposizione in funzioni più semplici o il delimitazione da funzioni più semplici. ma la funzione Γ rende tutto ciò difficile. Se qualcuno ha idee su dove cercare approcci a questi sottoproblemi - ad esempio, dove altro la funzione Γ si presenta in un modo "essenziale" come qui (non solo come una costante normalizzante) nelle statistiche - che potrebbe essere molto utile per me!
NF,

C'è un'enorme differenza tra il caso cd<2 e cd2 . Devi coprire entrambi questi casi?
whuber

1
È vero, grazie. Possiamo supporre che cd2 .
NF,

Risposte:


21

Il campionamento del rifiuto funzionerà eccezionalmente bene quando cdexp(5) ed è ragionevole per cdexp(2) .

Per semplificare un po 'la matematica, lascia che , scrivi e nota chex = ak=cdx=a

f(x)kxΓ(x)dx

per . L'impostazione dàx = u 3 / 2x1x=u3/2

f(u)ku3/2Γ(u3/2)u1/2du

per te . Quando , questa distribuzione è estremamente vicina a Normale (e si avvicina man mano che diventa più grande). In particolare, puoik exp ( 5 )u1kexp(5)k

  1. Trova numericamente la modalità di (usando, ad esempio, Newton-Raphson).f(u)

  2. Espandi al secondo ordine sulla sua modalità.logf(u)

Ciò produce i parametri di una distribuzione Normale strettamente approssimativa. Ad alta precisione, questa Normale approssimativa domina tranne nelle code estreme. (Quando , potrebbe essere necessario aumentare leggermente il PDF normale per garantire il dominio.)k < exp ( 5 )f(u)k<exp(5)

Avendo svolto questo lavoro preliminare per un dato valore di e aver stimato un costante (come descritto di seguito), ottenere una variabile casuale è una questione di:M > 1kM>1

  1. Disegna un valore dalla distribuzione Normale dominante .g ( u )ug(u)

  2. Se o se una nuova variazione uniforme supera , tornare al passaggio 1.X f ( u ) / ( M g ( u ) )u<1Xf(u)/(Mg(u))

  3. Impostare .x=u3/2

Il numero atteso di valutazioni di causa delle discrepanze tra e è solo leggermente superiore a 1. (Alcune valutazioni aggiuntive si verificheranno a causa di rifiuti di variate inferiori a , ma anche quando è basso quanto la frequenza di tale le occorrenze sono piccole.)g f 1 k 2fgf1k2

Grafico di f e g per k = 5

Questo grafico mostra i logaritmi di g ed f come funzione di u per . Poiché i grafici sono così vicini, dobbiamo esaminare il loro rapporto per vedere cosa sta succedendo:k=exp(5)

grafico del rapporto di registro

Visualizza il rapporto di registro ; il fattore di stato incluso per assicurare che il logaritmo sia positivo in tutta la parte principale della distribuzione; cioè, per assicurare salvo possibilmente in regioni di probabilità trascurabile. Rendendo sufficientemente grande, puoi garantire che domini in tutte le code tranne quelle più estreme (che comunque non hanno praticamente alcuna possibilità di essere scelte in una simulazione). Tuttavia, più grande è la , più spesso si verificheranno rigetti. Man mano che diventa grande, può essere scelto molto vicino aM = exp ( 0.004 ) M g ( u ) f ( u ) M M g f M k M 1log(exp(0.004)g(u)/f(u))M=exp(0.004)Mg(u)f(u)MMgfMkM1, che non comporta praticamente alcuna penalità.

Un approccio simile funziona anche per , ma potrebbero essere necessari valori abbastanza grandi di quando , perché è notevolmente asimmetrico. Ad esempio, con , per ottenere un ragionevolmente accurato dobbiamo impostare :M exp ( 2 ) < k < exp ( 5 ) f ( u ) k = exp ( 2 ) g M = 1k>exp(2)Mexp(2)<k<exp(5)f(u)k=exp(2)gM=1

Trama per k = 2

La curva rossa superiore è il grafico di mentre la curva blu superiore è il grafico di . Il campionamento del rifiuto di rispetto a causerà il rifiuto di circa 2/3 di tutte le estrazioni di prova, triplicando lo sforzo: ancora non male. La coda destra ( o ) sarà sottorappresentata nel campionamento del rifiuto (perché non domina più lì), ma quella coda comprende meno di della probabilità totale.log ( f ( u ) ) f exp ( 1 ) g u > 10 x > 10 3 / 2 ~ 30 exp ( 1 ) g f exp ( - 20 ) ~ 10 - 9log(exp(1)g(u))log(f(u))fexp(1)gu>10x>103/230exp(1)gfexp(20)109

Riassumendo, dopo uno sforzo iniziale per calcolare la modalità e valutare il termine quadratico delle serie di potenze di attorno alla modalità, uno sforzo che richiede al massimo poche decine di valutazioni delle funzioni, è possibile utilizzare il campionamento del rifiuto a un costo previsto compreso tra 1 e 3 (circa) valutazioni per variabile. Il moltiplicatore di costi scende rapidamente a 1 quando aumenta oltre 5.k = c df(u)k=cd

Anche quando è necessaria una sola estrazione da , questo metodo è ragionevole. Si presenta da solo quando sono necessari molti sorteggi indipendenti per lo stesso valore di , poiché il sovraccarico dei calcoli iniziali viene ammortizzato in molti sorteggi.kfk


appendice

@Cardinal ha chiesto, abbastanza ragionevolmente, il supporto di alcune delle analisi che agitano a mano in avanti. In particolare, perché la trasformazione dovrebbe rendere la distribuzione approssimativamente normale?x=u3/2

Alla luce della teoria delle trasformazioni di Box-Cox , è naturale cercare una trasformazione del potere della forma (per una costante , si spera non troppo diversa dall'unità) che renderà "più" una distribuzione Normale. Ricordiamo che tutte le distribuzioni normali sono semplicemente caratterizzate: i logaritmi dei loro pdf sono puramente quadratici, con termine lineare zero e nessun termine di ordine superiore. Pertanto possiamo prendere qualsiasi pdf e confrontarlo con una distribuzione normale espandendo il suo logaritmo come una serie di potenze attorno al suo picco (più alto). Cerchiamo un valore di che renda (almeno) il terzo α αx=uαααil potere svanisce, almeno approssimativamente: questo è il massimo che possiamo ragionevolmente sperare che un singolo coefficiente libero realizzi. Spesso funziona bene.

Ma come gestire questa particolare distribuzione? Dopo aver effettuato la trasformazione del potere, il suo pdf è

f(u)=kuαΓ(uα)uα1.

Prendi il suo logaritmo e usa l'espansione asintotica di Stirling di :log(Γ)

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

(per piccoli valori di , che non è costante). Questo funziona a condizione che sia positivo, cosa che supponiamo sia il caso (altrimenti non potremo trascurare il resto dell'espansione).cα

Calcolare la derivata terza (che, se diviso da , Sarà il coefficiente di terza potenza di nella serie potenza) e sfruttare il fatto che in corrispondenza del picco, la derivata prima deve essere zero. Questo semplifica notevolmente la terza derivata, dando (approssimativamente, perché stiamo ignorando la derivata di )u c3!uc

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

Quando non è troppo piccola, sarà davvero grande al culmine. Poiché è positivo, il termine dominante in questa espressione è il potere , che possiamo impostare a zero facendo svanire il suo coefficiente:kuα2α

2α3=0.

Ecco perché funziona così bene: con questa scelta, il coefficiente del termine cubico attorno al picco si comporta comeα=3/2 , che è vicino a. Una volta chesupera i 10 o giù di lì, puoi praticamente dimenticartene, ed è ragionevolmente piccolo anche perfino a 2. I poteri superiori, dal quarto in poi, svolgono sempre meno un ruolo man mano chediventa grande, perché i loro coefficienti crescono anche proporzionalmente più piccolo. Per inciso, gli stessi calcoli (basati sulla seconda derivata dial suo apice) mostrano che la deviazione standard di questa approssimazione normale è leggermente inferiore au3exp(2k)kkklog(f(u))23exp(k/6), con l'errore proporzionale a .exp(k/2)


(+1) Ottima risposta. Forse potresti ampliare brevemente la motivazione della scelta della variabile di trasformazione.
cardinale

Bella aggiunta. Questo rende una risposta molto, molto completa!
cardinale

11

Mi piace molto la risposta di @ whuber; è probabile che sia molto efficiente e abbia una bella analisi. Ma richiede una profonda comprensione di questa particolare distribuzione. Per le situazioni in cui non si ha tale intuizione (quindi per diverse distribuzioni), mi piace anche il seguente approccio che funziona per tutte le distribuzioni in cui il PDF è due volte differenziabile e che la seconda derivata ha finitamente molte radici. Richiede parecchio lavoro da configurare, ma in seguito hai un motore che funziona per la maggior parte delle distribuzioni che puoi provare.

Fondamentalmente, l'idea è quella di utilizzare un limite superiore lineare a tratti al PDF che si adatta mentre si esegue il campionamento del rifiuto. Allo stesso tempo hai un lineare lineare a tratti inferioreassociato al PDF che impedisce di valutare il PDF troppo frequentemente. I limiti superiore e inferiore sono dati da accordi e tangenti al grafico PDF. La divisione iniziale in intervalli è tale che su ogni intervallo, il PDF è tutto concavo o tutto convesso; ogni volta che devi rifiutare un punto (x, y) suddividi quell'intervallo in x. (Puoi anche fare una suddivisione aggiuntiva in x se devi calcolare il PDF perché il limite inferiore è veramente cattivo.) Ciò rende le suddivisioni particolarmente frequenti dove i limiti superiore (e inferiore) sono cattivi, quindi ottieni davvero un buon approssimazione del tuo PDF essenzialmente gratis. I dettagli sono un po 'complicati da ottenere, ma ho cercato di spiegare la maggior parte di essi in questa serie di post sul blog , in particolarel'ultimo .

Quei post non discutono di cosa fare se il PDF non ha limiti né nel dominio né nei valori; Consiglierei la soluzione un po 'ovvia di fare una trasformazione che li rende finiti (che sarebbe difficile automatizzare) o di usare un taglio. Vorrei scegliere il taglio in base al numero totale di punti che ci si aspetta di generare, dire N , e scegliere il taglio in modo che la parte rimossa abbia una probabilità inferiore a . (Questo è abbastanza facile se hai un modulo chiuso per il CDF; altrimenti potrebbe anche essere complicato.)1/(10N)

Questo metodo è implementato in Maple come metodo predefinito per le distribuzioni continue definite dall'utente. (Informativa completa - Lavoro per Maplesoft.)


Ho eseguito un esempio, generando 10 ^ 4 punti per c = 2, d = 3, specificando [1, 100] come intervallo iniziale per i valori:

grafico

C'erano 23 rifiuti (in rosso), 51 punti "in libertà vigilata" che erano all'epoca tra il limite inferiore e il PDF effettivo e 9949 punti che erano stati accettati dopo aver verificato solo le disuguaglianze lineari. Sono 74 valutazioni del PDF in totale, o circa una valutazione PDF per 135 punti. Il rapporto dovrebbe migliorare man mano che generi più punti, poiché l'approssimazione migliora sempre meglio (e viceversa, se generi solo pochi punti, il rapporto è peggiore).


E comunque - se hai bisogno di valutare il PDF solo molto di rado perché hai un buon limite inferiore, puoi permetterti di impiegare più tempo, quindi puoi semplicemente usare una libreria bignum (forse anche MPFR?) E valutare la funzione Gamma in ciò senza troppa paura di tracimazione.
Erik P.

(+1) Questo è un approccio simpatico. Grazie per averlo condiviso.
whuber

1Γ(exp(cd))/Γ(X)Xexp(K)Γ12
whuber

@whuber re: Gammas: Ah sì - vedo che lo avevi suggerito anche sopra. Grazie!
Erik P.

3

È possibile farlo eseguendo numericamente il metodo di inversione, che dice che se si inseriscono variabili casuali uniformi (0,1) nel CDF inverso, si ottiene un sorteggio dalla distribuzione. Ho incluso sotto un codice R che lo fa, e dai pochi controlli che ho fatto, funziona bene, ma è un po 'sciatto e sono sicuro che potresti ottimizzarlo.

Se non hai familiarità con R, lgamma () è il registro della funzione gamma; integrate () calcola un integrale 1-D definito; uniroot () calcola una radice di una funzione usando la bisection 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,d

cd


1
Il metodo è corretto, ma terribilmente doloroso! Quante valutazioni di funzione pensi siano necessarie per una singola variabile casuale? Migliaia? Decine di migliaia?
whuber

cd(cd)XX

1
fun'log(cd)-log(Γ(un'))

Questo è ciò che faccio per il calcolo: non evita ancora il trabocco. Non è possibile esponere un numero maggiore di circa 500 su un computer. Quella quantità diventa molto più grande di quella. Intendo "abbastanza bene" confrontandolo con il campionamento di rifiuto dell'OP menzionato.
Macro

1
cd
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.