R中的Metropolis-Hastings算法:正确的结果?

时间:2016-10-30 12:47:19

标签: r markov-chains

我的Metropolis-Hastings问题具有静态二项分布,所有提议分布q(i,j)均为0.5。参考图和直方图,算法应该如此清晰地以0.5为中心,从二项分布的概率?

pi <- function(x, n, p){
# returning value from binomial distribution
    result <- (factorial(n) / (factorial(x) * factorial(n - x))) * 
        p^x * (1 - p)^(n - x)
    return(result)
}


metropolisAlgorithm <- function(n, p, T){
# implementation of the algorithm
# @n,p binomial parameters
# @T number of time steps
    X <- rep(runif(1),T)
    for (t in 2:T) {
        Y <- runif(1)
        alpha <- pi(X[t - 1], n, p) / pi(Y, n, p)
        if (runif(1) < alpha) X[t] <- Y
        else X[t] < X[t - 1]
    }
    return(X)
}

# calling M-H algorithm and plotting result
test <- metropolisAlgorithm(40,0.5,5000)
par(mfrow=c(2,1))
plot(test, type = "l")
hist(test, breaks = 40)

enter image description here

1 个答案:

答案 0 :(得分:3)

你有3个问题:

1)您似乎想要模拟二项分布,因此随机游走应该在delimiter范围内的整数而不是1:n范围内的实数。

2)你在计算[0,1]

时切换了分子和分母

3)你在alpha中输了一个拼写错误。

修复这些并稍微清理你的代码(包括使用X[t] < X[t - 1]函数@ZheyuanLi建议)产生:

dbinom

典型输出(完全合理):

enter image description here