鉴于我的例子中的一些数据,我必须从后验分布中抽样(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