Échantillonnage à partir d'une distribution bivariée avec une densité connue en utilisant MCMC

9

J'ai essayé de simuler à partir d'une densité bivariée utilisant les algorithmes de Metropolis dans R et je n'ai pas eu de chance. La densité peut être exprimée comme , où est la distribution de Singh-Maddalap(X,y)p(y|X)p(X)p(X)

p(X)=uneqXune-1bune(1+(Xb)une)1+q

avec les paramètres , , et est log-normal avec log-mean comme fraction de et log-sd une constante. Pour tester si mon échantillon est celui que je veux, j'ai regardé la densité marginale de , qui devrait être . J'ai essayé différents algorithmes Metropolis des packages R MCMCpack, mcmc et dream. J'ai jeté le burn-in, utilisé l'amincissement, utilisé des échantillons d'une taille pouvant atteindre un million, mais la densité marginale résultante n'a jamais été celle que j'ai fournie.uneqbp(y|X)XXp(X)

Voici l'édition finale de mon code que j'ai utilisé:

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

Je me suis installé sur le package de rêve, car il échantillonne jusqu'à la convergence. J'ai testé si j'ai les bons résultats de trois manières. En utilisant la statistique KS, en comparant les quantiles et en estimant les paramètres de la distribution de Singh-Maddala avec une probabilité maximale à partir de l'échantillon résultant:

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

Lorsque je regarde les résultats de ces comparaisons, la statistique KS rejette presque toujours l'hypothèse nulle selon laquelle l'échantillon provient de la distribution de Singh-Maddala avec les paramètres fournis. Les paramètres estimés du maximum de vraisemblance se rapprochent parfois de leurs vraies valeurs, mais sont généralement trop éloignés de la zone de confort pour accepter que la procédure d'échantillonnage a réussi. Idem pour les quantiles, les quantiles empiriques ne sont pas trop loin, mais trop loin.

Ma question est ce que je fais mal? Mes propres hypothèses:

  1. Le MCMC n'est pas approprié pour ce type d'échantillonnage
  2. MCMC ne peut pas converger, pour des raisons théoriques (la fonction de distribution ne satisfait pas aux propriétés requises, quelles qu'elles soient)
  3. Je n'utilise pas correctement l'algorithme Metropolis
  4. Mes tests de distribution ne sont pas corrects, car je n'ai pas d'échantillon indépendant.
mpiktas
la source
Dans le lien de distribution Singh-Maddala , le pdf a deux paramètres - {c, k}, mais la fonction R dsinmadprend trois paramètres ou est-ce que je manque quelque chose.
csgillespie
Désolé, le lien wikipedia cite la mauvaise formule, cela avait l'air correct à première vue, lorsque je composais la question. Je n'ai pas trouvé de lien prêt, alors j'ai simplement mis la formule dans la question.
mpiktas

Réponses:

3

Je pense que l'ordre est correct, mais les étiquettes attribuées à p (x) et p (y | x) étaient fausses. Le problème d'origine indique que p (y | x) est log-normal et p (x) est Singh-Maddala. Alors c'est

  1. Générer un X à partir d'un Singh-Maddala, et

  2. générer un Y à partir d'une log-normale ayant une moyenne qui est une fraction du X généré.

Jan Galkowski
la source
3

En fait, vous ne devriez pas faire de MCMC, car votre problème est tellement plus simple. Essayez cet algorithme:

Étape 1: générer un X à partir de Log Normal

Étape 2: En gardant ce X fixe, générez un Y à partir du Singh Maddala.

Voilà! Échantillon prêt !!!

Mohit
la source
Je suppose que vous vouliez dire que les étapes étaient inversées. Mais si c'est si simple, pourquoi avons-nous besoin d'un échantillonnage de Gibbs?
mpiktas
1
Non, je voulais dire les étapes 1 et 2 dans l'ordre que j'ai écrit. Après tout, la distribution de y est spécifiée conditionnellement à X, vous devez donc générer un X avant Y. Comme pour l'échantillonnage de Gibbs, c'est une solution plus compliquée destinée à des problèmes plus compliqués. Le vôtre, comme vous le décrivez, est assez simple, à mon humble avis.
Mohit
1
p(y|X)p(X|y)p(X)