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 )
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 )
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:
- MCMC no es apropiado para este tipo de muestreo
- MCMC no puede converger, debido a razones teóricas (la función de distribución no satisface las propiedades requeridas, cualesquiera que sean)
- No uso el algoritmo Metropolis correctamente
- Mis pruebas de distribución no son correctas, ya que no tengo una muestra independiente.
fuente
dsinmad
toma tres parámetros o me falta algo.Respuestas:
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
Generar una X a partir de una Singh-Maddala, y
generar una Y a partir de un log-normal que tiene una media que es una fracción de la X generada.
fuente
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 !!!
fuente