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-Maddala
con i parametri , , e è log-normale con log-mean come una frazione di 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.
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:
- MCMC non è appropriato per questo tipo di campionamento
- MCMC non può convergere, per motivi teorici (la funzione di distribuzione non soddisfa le proprietà richieste, qualunque esse siano)
- Non uso correttamente l'algoritmo Metropolis
- I miei test di distribuzione non sono corretti, poiché non ho un campione indipendente.
dsinmad
accetta tre parametri o mi sto perdendo qualcosa.