来自R的Metropolis Hastings的后验分布样本

时间:2017-06-28 21:57:08

标签: r algorithm

鉴于我的例子中的一些数据,我必须从后验分布中抽样(a,b)

我必须应用 Metropolis Hastings算法,以便从后验分布中推导出(a,b)的值,然后估算它们的均值。

在下面的算法中,我使用了作为提议分布的双变量标准法线。

我的问题是,由于后验分布中的exp,算法会收敛到(0,0)

有人能帮我找到算法中的任何错误吗?我已经用R编写了算法。

library('MASS')

library("tmvtnorm")



#Posterior distribution#
#p(a,b|x,y)= prod ((exp(a+b*x))^y)/(1+exp(a+b*x))* exp(-exp(a/β)) 
*exp(15.043)#


#damages#
y=c(1,1,1,1,0,0,0,0,0,0,0,0,1,1,0,0,0,1,0,0,0,0,0)

#temperatures#
x=c(53,57,58,63,66,67,67,67,68,69,70,70,70,70,72,73,75,75,76,76,78,79,81)

β=6078083.56 

S=0
s= matrix(data = c(1,0,0,1), nrow = 2, ncol = 2, byrow = FALSE)
m=c(0,0)

z=0
z=matrix(c(rep(0,20000)),nrow=10000,ncol=2) #z=(a,b)#

for(i in 2:10000)
{

w=rmvnorm(1,mean=m,sigma=s) #Proposol-distibution#
u=runif(1,0,1)

k=dmvnorm(z[i-1,],mean=m,sigma=s)
f=dmvnorm(w,mean=m,sigma=s)

l=prod(((1+exp(z[i-1,1]+z[i-1,2]*x))*
(exp(w[1]+w[2]*x))^y)/((1+exp(w[1]+w[2]*x))*(exp(z[i-1,1]+z[i-1,2]*x))^y))

q=exp(exp(-(w[1]/β))-exp(-(z[i-1,1]/β)))  

a1=k/f
a2=a1*l*q
h=min(1,a2)
if(u<=h)
{z[i,]=w}

else 
    z[i,]=z[i-1,]
}


a_bar=sum(z[,1])/10000
b_bar=sum(z[,2])/10000

0 个答案:

没有答案