Simulieren Sie aus einer dynamischen Mischung von Verteilungen

7

Ich muss aus der folgenden Mischung von zwei Verteilungen probieren:

hβ(r)=c(β)[(1wm,τ(r))fβ0(r)+wm,τ(r)gϵ,σ(r)]

Dabei ist eine Normalisierungskonstante, die Gamma-Verteilung , die verallgemeinerte Pareto-Verteilung und ist die CDF der Cauchy-Verteilung : , die hier als Gewichts- / Mischfunktion fungiert und einen reibungslosen Übergang zwischen Gamma und Pareto ermöglicht (daher das Adjektiv "dynamisch", um die Mischung zu qualifizieren).c(β)fβ0gϵ,σwm,τ1/2+(1/π)arctan[(rm)/τ]

Die Gewichte ermöglichen eine einheitliche Mischung, bei der das Gamma den Großteil der Daten erfasst, und wenn wir uns den Extremen nähern, übernimmt das Pareto die Kontrolle. Der Ansatz stammt von Figressi et al. (2002) , und ich habe die in Vrac und Naveau (2007) vorgestellte Implementierung übernommen .

Ich habe die Parameter bzw. den Ort und die Skala des Cauchy-CDF, Form und Geschwindigkeit des Gammas und Form geschätzt und Skalierung der GPD nach dem Verfahren, das auf MLE basiert und in dem zweiten Artikel beschrieben ist, auf den verwiesen wird (R-Code finden Sie hier ), und jetzt möchte ich ein Beispiel aus . Da die Anteile jeder Komponente der Mischung nicht festgelegt sind, kann ich nicht einfach zufällig aus der einen oder anderen Verteilung (z. B. unter Verwendung der Funktionen oder R) eine Stichprobe ziehen, wie dies hier oder hier erfolgt . Wie soll ich vorgehen?β=(m,τ,γ,λ,ϵ,ξ)hβrgamma()rgpd()

Wenn ich den CDF der Mischung bestimmen könnte, könnte ich eine Inversionsprobe verwenden (U(0,1)). BEARBEITEN: Wie von Xi'an im zweiten Thread unten angegeben, gibt es keine geschlossene Lösung für die CDF.

EDIT: Implementierung einer der beiden Strategien in Xi'ans Antwort (Ablehnungsstichprobe) für meine Daten hier und Monte-Carlo-Ansatz zur Schätzung der Quantilfunktion der Mischung hier .

Antoine
quelle
2
Die Ablehnungsabtastung könnte hier gut funktionieren. Wenn sonst niemand kommt und es zuerst tut, schreibe ich später eine Antwort.
Dougal
Ihre Dichte ist genau definiert (vorausgesetzt, Sie können die Normalisierungskonstante berechnen) und ist eine Mischung im üblichen Sinne, jedoch nicht aus einem Pareto und einem Gamma. Es schreibt als die Summe von zwei Begriffen, jeder kann als Dichte renormiert werden, und die Normalisierungsfaktoren sind die Gewichte. Die beiden Komponenten der Mischung sind jedoch nicht Standard.
Xi'an

Antworten:

8

Wie von Dougal hervorgehoben , die Form Ihrer Zieldichte

hβ(r)(1wm,τ(r))fβ0(r)+wm,τ(r)gϵ,σ(r)
ist offen für Akzeptanz-Ablehnungs-Simulationen seit
(1- -wm,τ(r))fβ0(r)+wm,τ(r)Gϵ,σ(r)fβ0(r)+Gϵ,σ(r)=2{12fβ0(r)+12Gϵ,σ(r)}}
Daher simulieren aus der gleichmäßigen Mischung von Pareto fβ0 und Gamma Gϵ,σ und mit Wahrscheinlichkeit akzeptieren
(1- -wm,τ(r))fβ0(r)+wm,τ(r)Gϵ,σ(r)fβ0(r)+Gϵ,σ(r)
würde Ihnen eine genaue Ausgabe Ihrer Zieldichte zurückgeben.

Beachten Sie, dass das Originalpapier von Frigessi et al. enthält eine Möglichkeit zur Simulation aus der dynamischen Mischung auf Seite 6: mit Wahrscheinlichkeit1/.2 simulieren von fβ0 und mit Wahrscheinlichkeit 1/.2 von Gϵ,σ [was einer Simulation aus der geraden Mischung entspricht] und das Ergebnis mit Wahrscheinlichkeit akzeptieren1- -wm,τ(r) im ersten Fall und wm,τ(r)im zweiten Fall. Es ist unklar, welcher dieser Ansätze die höchste durchschnittliche Akzeptanzrate aufweist.

Hier ist ein kleines Experiment, das zeigt, dass die Akzeptanzraten vergleichbar sind:

#Frigessi et al example
beta=2
lambda=gamma(1.5)
mu=tau=1
xi=.5
sigma=1
#the target is 
target=function(x) 
(1-pcauchy((x-mu)/tau))*dweibull(x,shape=beta,scale=1/lambda)+pcauchy((x-mu)/tau)*dgpd(x,xi=xi,beta=sigma)[1]

T=1e4
u=sample(c(0,1),T,rep=TRUE)
x=u*rweibull(T,shape=beta,scale=1/lambda)+(1-u)*rgpd(T,xi=xi,beta=sigma)
#AR 1
ace1=mean(runif(T)<(u*(1-pcauchy((x-mu)/tau))+(1-u)*pcauchy((x-mu)/tau)))
#AR 2
ace2=mean(runif(T)<target(x)/(dweibull(x,shape=beta,scale=1/lambda)+dgpd(x,xi=xi,beta=sigma)[1]))

mit

> ace1
[1] 0.5173
> ace2
[1] 0.5473

Eine Alternative ist die Verwendung eines Metropolis-Hastings-Algorithmus. Zum Beispiel bei jeder Iteration der Markov-Kette,

  1. Wählen Sie das Pareto gegen die Gammakomponenten mit Wahrscheinlichkeiten 1- -wm,τ(xt- -1) und wm,τ(xt- -1);;
  2. Generieren Sie einen Wert y von der gewählten Komponente;
  3. Akzeptiere den Wert y wie xt=y mit Wahrscheinlichkeit
    (1- -wm,τ(y))fβ0(y)+wm,τ(y)Gϵ,σ(y)(1- -wm,τ(xt- -1))fβ0(xt- -1)+wm,τ(xt- -1)Gϵ,σ(xt- -1)
    ×(1- -wm,τ(y))fβ0(xt- -1)+wm,τ(y)Gϵ,σ(xt- -1)(1- -wm,τ(xt- -1))fβ0(y)+wm,τ(xt- -1)Gϵ,σ(y)
    sonst nimm xt=xt- -1

Der entsprechende R-Code ist unkompliziert

#MCMC style
propose=function(x,y){
#moving from x to y
target(y)*(pcauchy((y-mu)/tau,lowe=FALSE)*dweibull(x,shape=beta,scale=1/lambda)+pcauchy((y-mu)/tau)*dgpd(x,xi=xi,beta=sigma)[1:length(x)])/
(target(x)*(pcauchy((x-mu)/tau,lowe=FALSE)*dweibull(y,shape=beta,scale=1/lambda)+pcauchy((x-mu)/tau)*dgpd(y,xi=xi,beta=sigma)[1:length(x)]))}

x=seq(rgpd(1,xi=xi,beta=sigma),T)
for (t in 2:T){
  #proposal
  x[t]=rweibull(1,shape=beta,scale=1/lambda)
  if (runif(1)<pcauchy((x[t-1]-mu)/tau)) x[t]=rgpd(1,xi=xi,beta=sigma)
  #acceptance
  if (runif(1)>propose(x[t-1],x[t])) x[t]=x[t-1]}
ace3=length(unique(x))/T

und gibt eine höhere Akzeptanzrate

> ace3
[1] 0.877

Während die Anpassung mit der durch Akzeptieren-Zurückweisen erhaltenen Dichteschätzung identisch ist: Geben Sie hier die Bildbeschreibung ein

[Rote Kurve für die Accept-Reject-Probe und blaue Kurve für die MCMC-Probe, beide basierend auf 10⁴-Originalsimulationen]

Xi'an
quelle
Hervorragende Antwort, vielen Dank. Es tut mir leid, wenn ich langsam bin, aber in Bezug auf die Ablehnungsmethode, wie bestimmen Sie die Akzeptanzwahrscheinlichkeit (1/.M.mit dieser Notation ). Ich weiß, dass die Wahrscheinlichkeit, die Sie geschrieben haben, der Bereich unter der Umschlag- (oder Instrumental-) Verteilung istG(x) geteilt durch die Fläche unter der willkürlichen Verteilung f(x), so intuitiv macht es Sinn, aber mathematisch wissen wir das einfach f(x)<M.G(x) wo M.>1 und P.[u<f(x)/.(M.G(x))]]=1/.M. wo u~U.(0,1)
Antoine
Das ist das Schöne an Akzeptieren-Ablehnen: Wenn Sie binden können f(x)<M.G(x)müssen Sie nicht trennen M. von G vorausgesetzt, Sie können aus generieren G. Genau das passiert in der zweiten Gleichung meiner Antwort. Ich habe die interessierende Dichte mit 2 mal einer Mischung mit den Gewichten 1/2 und 1/2 begrenzt, die ich simulieren kann. Und dazu brauche ich nicht die Normalisierungskonstante der lhs.
Xi'an
2
Das ist definitiv sehr elegant. In meinem ersten Kommentar wurde mir klar, dass ich falsch lag: Bei der Akzeptanzwahrscheinlichkeit geht es nicht um Bereiche, sondern nur um Werte oder Längen. Wenn wir für jedes x eine vertikale Linie bei x zeichnen, ist die Akzeptanzwahrscheinlichkeit der Wert der willkürlichen Verteilung über den Wert der Hüllkurvenverteilung, der die Länge des Segments ist[0,f(x)]] (= f(x)) geteilt durch die Länge des Segments [0,G(x)]] (=G(x)). So sind Sie auf die in Ihrer dritten Gleichung beschriebene Wahrscheinlichkeit gekommen, oder?
Antoine
Dann probieren wir einfach gleichmäßig entlang der vertikalen Linie und akzeptieren oder lehnen mit dieser Wahrscheinlichkeit ab ... Dies ist in der Tat sehr elegant.
Antoine
Ja, dies ist im Wesentlichen die Intuition hinter Akzeptieren-Ablehnen!
Xi'an
1

Ich schlage vor, dass Sie die probabilistische Programmierung untersuchen. Grundsätzlich schreiben Sie Programme, die eher mit Wahrscheinlichkeitsverteilungen als mit (zufälligen) Variablen arbeiten. Dies macht es einfach, Funktionen zu definieren, die dynamische Verteilungsmischungen sind. Probabilistische Programmiersysteme mit vollem Funktionsumfang unterstützen zwar die statistische Inferenz nach Bayes, Ihre Anwendung benötigt sie jedoch nicht wirklich. In erster Linie benötigen Sie nur die Programmiersprache und die Markov Chain Monte Carlo (MCMC) -Löser, um Samples aus der von Ihrem Programm definierten Verteilung zu generieren.

Gute Einführungen und eine Liste der Ressourcen finden Sie im Folgenden:

Gute Tutorials zur probabilistischen Programmierung finden Sie auf der Website der Kirche, insbesondere das zweite "Einfache generative Modelle":

Untersuchen Sie abschließend STAN als Implementierungsplattform. Es gibt Versionen für R und Python. Auch hier benötigen Sie nur die generativen Modellfunktionen.

MrMeritology
quelle