Campionamento dalla distribuzione bivariata con densità nota usando MCMC


9

Ho provato a simulare da una densità bivariata usando gli algoritmi Metropolis in R e non ho avuto fortuna. La densità può essere espressa come , dove è distribuzione Singh-Maddalap(x,y)p(y|x)p(x)p(x)

p(x)=aqxa1ba(1+(xb)a)1+q

con i parametri , , e è log-normale con log-mean come una frazione diaqbp(y|x)x e log-sd una costante. Per verificare se il mio campione è quello che voglio, ho osservato la densità marginale di , che dovrebbe essere p ( x ) . Ho provato diversi algoritmi Metropolis dai pacchetti R MCMCpack, mcmc e dream. Ho scartato il burn-in, usato il diradamento, usato campioni con dimensioni fino a un milione, ma la densità marginale risultante non è mai stata quella che ho fornito.xp(x)

Ecco l'edizione finale del mio codice che ho usato:

logvrls <- function(x,el,sdlog,a,scl,q.arg) {
    if(x[2]>0) {
         dlnorm(x[1],meanlog=el*log(x[2]),sdlog=sdlog,log=TRUE)+
         dsinmad(x[2],a=a,scale=scl,q.arg=q.arg,log=TRUE)
    }
    else -Inf    
}

a <- 1.35
q <- 3.3
scale <- 10/gamma(1 + 1/a)/gamma(q - 1/a)*  gamma(q) 

Initvrls <- function(pars,nseq,meanlog,sdlog,a,scale,q) {
    cbind(rlnorm(nseq,meanlog,sdlog),rsinmad(nseq,a,scale,q))
}

library(dream)
aa <- dream(logvrls,
        func.type="logposterior.density",
        pars=list(c(0,Inf),c(0,Inf)),
        FUN.pars=list(el=0.2,sdlog=0.2,a=a,scl=scale,q.arg=q),
        INIT=Initvrls,
        INIT.pars=list(meanlog=1,sdlog=0.1,a=a,scale=scale,q=q),
        control=list(nseq=3,thin.t=10)
        )

Ho optato per un pacchetto da sogno, dal momento che campiona fino alla convergenza. Ho verificato se ho i risultati corretti in tre modi. Utilizzando la statistica KS, confrontando i quantili e stimando i parametri della distribuzione Singh-Maddala con la massima probabilità dal campione risultante:

ks.test(as.numeric(aa$Seq[[2]][,2]),psinmad,a=a,scale=scale,q.arg=q)

lsinmad <- function(x,sample)
    sum(dsinmad(sample,a=x[1],scale=x[2],q.arg=x[3],log=TRUE))
 optim(c(2,20,2),lsinmad,method="BFGS",sample=aa$Seq[[1]][,2])

 qq <- eq(0.025,.975,by=0.025)   
 tst <- cbind(qq,
              sapply(aa$Seq,function(l)round(quantile(l[,2],qq),3)),
              round(qsinmad(qq,a,scale,q),3))
 colnames(tst) <- c("Quantile","S1","S2","S3","True")

 library(ggplot2)
 qplot(x=Quantile,y=value,
       data=melt(data.frame(tst),id=1), 
       colour=variable,group=variable,geom="line")

Quando guardo i risultati di questi confronti, la statistica di KS rifiuta quasi sempre l'ipotesi nulla che il campione provenga dalla distribuzione Singh-Maddala con i parametri forniti. I parametri stimati con la massima verosimiglianza a volte si avvicinano ai suoi valori reali, ma di solito troppo lontani dalla zona di comfort, per accettare che la procedura di campionamento sia andata a buon fine. Idem per i quantili, i quantili empirici non sono troppo lontani, ma troppo lontani.

La mia domanda è: cosa sto facendo di sbagliato? Le mie stesse ipotesi:

  1. MCMC non è appropriato per questo tipo di campionamento
  2. MCMC non può convergere, per motivi teorici (la funzione di distribuzione non soddisfa le proprietà richieste, qualunque esse siano)
  3. Non uso correttamente l'algoritmo Metropolis
  4. I miei test di distribuzione non sono corretti, poiché non ho un campione indipendente.

Nel link di distribuzione Singh-Maddala , il pdf ha due parametri: {c, k}, ma la funzione R dsinmadaccetta tre parametri o mi sto perdendo qualcosa.
csgillespie,

Spiacenti, il link di Wikipedia cita la formula sbagliata, a prima vista sembrava ok quando stavo componendo la domanda. Non ho trovato un link pronto, quindi ho appena inserito la formula nella domanda.
mpiktas,

Risposte:


3

Penso che l'ordine sia corretto, ma le etichette assegnate a p (x) e p (y | x) erano sbagliate. Il problema originale afferma che p (y | x) è log-normale e p (x) è Singh-Maddala. Così è

  1. Genera una X da un Singh-Maddala e

  2. generare una Y da un log-normale avente una media che è una frazione della X generata.


3

In realtà, non dovresti fare MCMC, poiché il tuo problema è molto più semplice. Prova questo algoritmo:

Passaggio 1: Genera una X da Log Normal

Passaggio 2: mantenendo fissa questa X, genera una Y dal Singh Maddala.

Ecco! Campione Pronto !!!


Suppongo che intendevi invertire i passaggi. Ma se questo è così semplice, perché abbiamo bisogno del campionamento di Gibbs?
mpiktas,

1
No, intendevo i passaggi 1 e 2 nell'ordine in cui ho scritto. Dopotutto, la distribuzione di y è specificata in base a X, quindi è necessario generare una X prima di Y. Per quanto riguarda il campionamento di Gibbs, questa è una soluzione più complicata intesa per problemi più complicati. Il tuo, come lo descrivi, è piuttosto diretto, IMHO.
Mohit,

1
p(y|X)p(X|y)p(X)
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.