使用MCMC Metropolis-Hastings algo在R中对多个后验分布进行采样

时间:2016-06-21 14:25:30

标签: r statistics bayesian sampling mcmc

我使用基于Metropolis-Hastings算法的MCMC技术对后验分布(因此贝叶斯方法)进行采样是相当新的。 我在R中使用mcmc库。我的发行版是多维的。为了检查这个地铁算法是否适用于多元分布,我在多维学生t分布(包mvtnorm,函数dmvt)上成功地做到了。 现在我想对我的多变量分布(2个变量x和y)应用相同的东西,但它不起作用;我收到一个错误:X [,1]出错:维数不正确

这是我的代码:

library(mcmc)
library(mvtnorm)
my.seed <- 123

logprior<-function(X,...)
{
      ifelse( (-50.0 <= X[,1] & X[,1]<=50.0) & (-50.0 <= X[,2] & X[,2]<=50.0), return(0), return(-Inf))
}

logpost<-function(X,...)
{
      log.like <- log( exp(-((X[,1]^2 + X[,2]^2 - 4)/10 )^2) * sin(4*atan(X[,2]/X[,1])) )
      log.prior<-logprior(X)
      log.post<-log.like + log.prior # if flat prior, the posterior distribution is the likelihood one
      return (log.post)
}

x <- seq(-5,5,0.15)
y <- seq(-5,5,0.15)
X<-cbind(x,y)

#out <- metrop(function(X) dmvt(X, df=3, log=TRUE), 0, blen=100, nbatch=100) ; this works
out <- metrop(function(X) logpost(X), c(0,0), blen=100, nbatch=100)
out <- metrop(out)
out$accept 

所以我尝试尊重与MWE相同的格式,但是当我收到之前提到的错误时它仍然不起作用。 另一件事是,将logpost应用于X可以很好地工作。

提前感谢您的帮助,最好

1 个答案:

答案 0 :(得分:0)

metrop函数传递各个样本,因此将简单的向量传递给logpost,而不是矩阵(X是矩阵)。因此,解决方案是将X[,1]X[,2]分别更改为X[1]X[2]

我是这样运行的,它会导致其他问题(X[2]/X[1]是用于初始化的NaN),但这与您的特定似然模型有更多关系,并且不在您的问题范围之内。 / p>