Wie von Dougal hervorgehoben , die Form Ihrer Zieldichte
hβ(r)∝(1−wm,τ(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,
- Wählen Sie das Pareto gegen die Gammakomponenten mit Wahrscheinlichkeiten 1 -wm , τ(xt - 1) und wm , τ(xt - 1);;
- Generieren Sie einen Wert y von der gewählten Komponente;
- 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:
[Rote Kurve für die Accept-Reject-Probe und blaue Kurve für die MCMC-Probe, beide basierend auf 10⁴-Originalsimulationen]