使用MCMC Metropolis-Hastings算法在R

使用MCMC Metropolis-Hastings算法在R,r,statistics,bayesian,sampling,mcmc,R,Statistics,Bayesian,Sampling,Mcmc,我对使用基于Metropolis-Hastings算法的MCMC技术采样后验分布(因此采用贝叶斯方法)非常陌生。 我正在使用R中的mcmc库进行此操作。我的分布是多维的。为了检查此metro算法是否适用于多维分布,我在多维student-t分布(包mvtnorm,函数dmvt)上成功地进行了此操作。 现在我想把同样的东西应用到我的多元分布(2个变量x和y),但它不起作用;我得到一个错误:X[,1]中的错误:维数不正确 这是我的密码: library(mcmc) library(mvtnorm)

我对使用基于Metropolis-Hastings算法的MCMC技术采样后验分布(因此采用贝叶斯方法)非常陌生。 我正在使用R中的mcmc库进行此操作。我的分布是多维的。为了检查此metro算法是否适用于多维分布,我在多维student-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 
库(mcmc)
图书馆(mvtnorm)

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

我这样运行它,它会导致其他问题(
X[2]/X[1]
对于初始化来说是NaN),但这与您的特定可能性模型有更多关系,超出了您的问题范围