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-Maddala
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.
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:
- Le MCMC n'est pas approprié pour ce type d'échantillonnage
- 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)
- Je n'utilise pas correctement l'algorithme Metropolis
- Mes tests de distribution ne sont pas corrects, car je n'ai pas d'échantillon indépendant.
dsinmad
prend trois paramètres ou est-ce que je manque quelque chose.Réponses:
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
Générer un X à partir d'un Singh-Maddala, et
générer un Y à partir d'une log-normale ayant une moyenne qui est une fraction du X généré.
la source
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 !!!
la source