使用MCMC从已知密度的双变量分布中抽样
我尝试使用R中的Metropolis算法从二元密度进行模拟,但是没有运气。密度可以表示为 ,其中是Singh-Maddala分布p (X ,ÿ)p(X,ÿ)p(x,y)p (ÿ| x)p(x)p(ÿ|X)p(X)p(y|x)p(x)p (x )p(X)p(x) p(x)=aqxa−1ba(1+(xb)a)1+qp(x)=aqxa−1ba(1+(xb)a)1+qp(x)=\dfrac{aq x^{a-1}}{b^a (1 + (\frac{x}{b})^a)^{1+q}} 参数,q,b和p(y | x)是对数正态的,其中log-mean是x的分数,而log-sd是常数。为了测试我的样本是否是我想要的样本,我查看了x的边际密度,其应为p(x)。我尝试了R包MCMCpack,mcmc和dream中的不同Metropolis算法。我舍弃了老化,使用细化处理,使用了大小不超过100万的样本,但是由此产生的边际密度从来不是我提供的那种。aaaqqqbbbp(y|x)p(y|x)p(y|x)xxxxxxp(x)p(x)p(x) 这是我使用的代码的最终版本: 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) …