使用Metropolis的马尔可夫链蒙特卡罗的样本[i-1]未填充到for循环中?

使用Metropolis的马尔可夫链蒙特卡罗的样本[i-1]未填充到for循环中?,r,for-loop,montecarlo,markov-chains,R,For Loop,Montecarlo,Markov Chains,我试图在R中生成一个函数,用于基于Metropolis算法的马尔可夫链蒙特卡罗采样。函数需要接受一个目标密度函数(PDF)、一个建议下一步的函数、一个起点和要计算的步骤数作为参数。输出应该是长度等于步数的向量 问题是,我在尝试使用该函数时收到多个警告: rnorm(1,x,0.5)中的:生产的NAs 我认为问题可能在于我试图定义当前步骤的方式:samples[I-1]没有返回值。我不知道这是为什么。我已将samples[1]设置为输入函数的起点,然后对于I in 2:samples.n,samp

我试图在R中生成一个函数,用于基于Metropolis算法的马尔可夫链蒙特卡罗采样。函数需要接受一个目标密度函数(PDF)、一个建议下一步的函数、一个起点和要计算的步骤数作为参数。输出应该是长度等于步数的向量

问题是,我在尝试使用该函数时收到多个警告: rnorm(1,x,0.5)中的
:生产的NAs

我认为问题可能在于我试图定义当前步骤的方式:
samples[I-1]
没有返回值。我不知道这是为什么。我已将
samples[1]
设置为输入函数的起点,然后对于
I in 2:samples.n
samples[I-1]
应返回上一个值,不是吗

我已经尝试过单独使用函数
provide
,效果很好。这使我相信问题在于for循环中函数
provide
的输入
samples[i-1]

PDF.beta <- function(x) dbeta(x, 12, 6)

propose <- function(x) rnorm(1, x, 0.5)

MCMC.sample <- function(target.PDF, prop.func, startx, samples.n) {
  samples <- numeric()
  samples[1] <- startx
  for(i in 2:samples.n)
    {
    proposed.step <- prop.func(samples[i-1])
    ifelse(runif(1) < target.PDF(proposed.step)/target.PDF(samples[i-1]),
      samples[i] <- proposed.step,
      samples[i] <- samples[i-1])
  }
  return(samples)
}


beta.MCMC <- MCMC.sample(target.PDF = PDF.beta, prop.func = propose, startx = 4, samples.n = 1000)

PDF.beta发布正确答案以确保完整性

主要的问题是
samples
的长度不合适,但我最终重写了部分函数,因为它似乎没有很好地定义当
target.PDF(proposed.step)/target.PDF(samples[I-1])
return
NaN

MCMC.sample <- function(target.PDF, prop.func, startx, samples.n) {
  samples <- numeric(length=samples.n)
  samples[1] <- startx
  for(i in 2:(samples.n)) {
    proposed.step <- prop.func(samples[i-1])
    target.r <- runif(1) < target.PDF(proposed.step)/target.PDF(samples[i-1])
    samples[i] <- ifelse(
      is.na(target.r) | target.r,
      proposed.step, 
      samples[i-1])
  }
  samples
}

set.seed(1)
beta.MCMC <- MCMC.sample(PDF.beta, propose, 4, 1000)

plot(beta.MCMC, type="l")

MCMC.sample在我看来,问题在于当目标分布商的分母非常小时,商就非常大。处理此问题的方法是,当例程生成大于1.0的商(即分母非常小)时,使用
if
语句将商设置为1.0,然后生成随机数。

samples
的长度为1,应为
samples.n+1
。尝试将
MCMC.sample
正文的第一行替换为
samples,非常感谢!!!这是救命恩人。我最后只使用了
示例True,但第一个不是示例,对吗?或者你可以把这算是磨合。