【发布时间】:2018-09-29 23:01:45
【问题描述】:
我正在尝试在 R 中实现随机游走 Metropolis-Hastings 算法。我使用了自定义函数 logit 和 invlogit 来应用和撤消 logit 函数。我还使用正态分布来添加随机噪声。鉴于这两个事实,一旦你对变换后的参数 + 随机噪声使用逆变换,建议分布不再是对称的,这就是为什么我随后将校正项 log(yt*(1 - yt)) - log(xt*(1 - xt)) 应用于接受概率。
我的问题是,似乎有两种方法可以在 R 中实现此算法。如果这两种方法相等,那么,据我所知,在计算 acceptanceRate 时,我应该得到相等的值。然而,事实并非如此,这让我相信一种实现有缺陷(有错误),而另一种则没有。
但是,另外两种可能性是(1)两种方式都不正确或(2)两种方式都是正确的,我误解了一些东西。我是 R 编码的新手,我仍然无法理解为什么两个实现之间的 acceptanceRate 的值存在这些偏差。
注意:我感兴趣的具体问题是为什么我在两个实现之间得到不同的 acceptanceRate 值。
实施 1
log.posterior <- function(p) (12+p)*log(p) + (9-p)*log(1-p)
B <- 10000 ## number of realisations we want to have
chain <- rep(0, B+1) ## vector to hold realisations
chain[1] <- 0.5 ## initial value
num.accept <- 0 ## keep track on how often we accept proposals
for(i in 1:B){
xt <- chain[i] ## current point
logit <- function(p) log(p/(1-p))
invlogit <- function(lo) 1/(1 + exp(-lo))
yt <- invlogit(rnorm(1, mean = logit(xt), sd = 0.45)) ## proposal
lapt <- log.posterior(yt) - log.posterior(xt) + log(yt*(1 - yt)) - log(xt*(1 - xt)) ## acceptance probability on the log scale)
if( runif(1) <= exp(lapt) ){
chain[i+1] <- yt ## accept proposal if runif(1) is less or equal to the acceptance probility
num.accept <- num.accept + 1 ## proposal was accepted
}else
chain[i+1] <- xt ## reject proposal
}
acceptanceRate <- num.accept/B
看看实现 1 如何使用yt <- invlogit(rnorm(1, mean = logit(xt), sd = 0.45))?一切都是积累和共同完成的。
实施 2
log.posterior <- function(p) (12+p)*log(p) + (9-p)*log(1-p)
B <- 10000 ## number of realisations we want to have
chain <- rep(0, B+1) ## vector to hold realisations
chain[1] <- 0.5 ## initial value
num.accept <- 0 ## keep track on how often we accept proposals
for(i in 1:B){
xt <- chain[i] ## current point
logit <- function(p) log(p/(1-p))
xt <- logit(xt)
yt <- xt + rnorm(1, mean = 0, sd = 0.45) ## proposal
invlogit <- function(lo) 1/(1 + exp(-lo))
xt <- invlogit(xt)
yt <- invlogit(yt)
lapt <- log.posterior(yt) - log.posterior(xt) + log(yt*(1 - yt)) - log(xt*(1 - xt)) ## acceptance probability on the log scale)
if( runif(1) <= exp(lapt) ){
chain[i+1] <- yt ## accept proposal if runif(1) is less or equal to the acceptance probility
num.accept <- num.accept + 1 ## proposal was accepted
}else
chain[i+1] <- xt ## reject proposal
}
acceptanceRate <- num.accept/B
请注意,实现 2 将所有内容分解为单独的部分,按顺序进行。
【问题讨论】:
-
太宽泛了…………
-
这是题外话。投票结束。
-
@ThePointer 我可以建议你重新打开上一个问题。我想展示一些优化,这也可能有助于解决您的简历问题。
-
@MauritsEvers 我已取消删除它。有人投票关闭它,所以我认为最好删除它。感谢您的帮助。
-
@Euler_Salter 我看了你的问题。自从我发布这篇文章以来,我还没有接触过这个主题,所以我不记得有什么地方可以帮助你。我能做的最好的就是给你的问题一个赞成票。我希望我能提供更多帮助。
标签: r algorithm statistics simulation bayesian