Muestreo de distribución bivariada con densidad conocida utilizando MCMC

9

Traté de simular a partir de una densidad bivariada usando algoritmos Metropolis en R y no tuve suerte. La densidad se puede expresar como , donde es la distribución de Singh-Maddalap ( y | x ) p ( x ) p ( x )p(x,y)p(y|x)p(x)p(x)

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

con los parámetros , , y es log-normal con log-mean como una fracción de , y log-sd es una constante. Para probar si mi muestra es la que quiero, miré la densidad marginal de , que debería ser . Probé diferentes algoritmos de Metrópolis de los paquetes R MCMCpack, mcmc y dream. Descarté el quemado, usé adelgazamiento, usé muestras con un tamaño de hasta un millón, pero la densidad marginal resultante nunca fue la que proporcioné.q b p ( y | x ) x x p ( x )aqbp(y|x)xxp(x)

Aquí está la edición final de mi código que utilicé:

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)
        )

Me he decidido por el paquete soñado, ya que muestra hasta la convergencia. He probado si tengo los resultados correctos de tres maneras. Usando la estadística KS, comparando cuantiles y estimando los parámetros de distribución de Singh-Maddala con la máxima probabilidad de la muestra resultante:

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")

Cuando miro los resultados de estas comparaciones, la estadística KS casi siempre rechaza la hipótesis nula de que la muestra proviene de la distribución Singh-Maddala con los parámetros suministrados. Los parámetros estimados de máxima probabilidad a veces se acercan a sus valores reales, pero generalmente están demasiado lejos de la zona de confort, para aceptar que el procedimiento de muestreo fue exitoso. Lo mismo ocurre con los cuantiles, los cuantiles empíricos no están demasiado lejos, sino demasiado lejos.

Mi pregunta es ¿qué estoy haciendo mal? Mis propias hipótesis:

  1. MCMC no es apropiado para este tipo de muestreo
  2. MCMC no puede converger, debido a razones teóricas (la función de distribución no satisface las propiedades requeridas, cualesquiera que sean)
  3. No uso el algoritmo Metropolis correctamente
  4. Mis pruebas de distribución no son correctas, ya que no tengo una muestra independiente.
mpiktas
fuente
En el enlace de distribución Singh-Maddala , el pdf tiene dos parámetros: {c, k}, pero la función R dsinmadtoma tres parámetros o me falta algo.
csgillespie
Lo sentimos, el enlace de wikipedia cita la fórmula incorrecta, parecía estar bien a primera vista, cuando estaba redactando la pregunta. No encontré un enlace listo, así que solo puse la fórmula en la pregunta.
mpiktas

Respuestas:

3

Creo que el orden es correcto, pero las etiquetas asignadas a p (x) y p (y | x) estaban equivocadas. El problema original establece que p (y | x) es log-normal y p (x) es Singh-Maddala. Entonces, es

  1. Generar una X a partir de una Singh-Maddala, y

  2. generar una Y a partir de un log-normal que tiene una media que es una fracción de la X generada.

Jan Galkowski
fuente
3

De hecho, no debe hacer MCMC, ya que su problema es mucho más simple. Prueba este algoritmo:

Paso 1: generar una X desde el registro normal

Paso 2: Manteniendo esta X fija, genera una Y desde Singh Maddala.

Voilà! Muestra lista !!!

Mohit
fuente
Supongo que te referías a los pasos invertidos. Pero si esto es tan simple, ¿por qué necesitamos el muestreo de Gibbs?
mpiktas
1
No, me refería a los pasos 1 y 2 en el orden que escribí. Después de todo, la distribución de y se especifica condicional en X, por lo que debe generar una X antes de Y. En cuanto al muestreo de Gibbs, esa es una solución más complicada destinada a problemas más complicados. El suyo, como lo describe, es bastante sencillo, en mi humilde opinión.
Mohit
1
Usaría el muestreo de Gibbs cuando conozca y , pero no si conoce el marginalp ( x | y ) p ( x )p(y|x)p(x|y)p(x)
probabilidadislogica