如何在R中的向量中保存循环的迭代值?

时间:2015-10-19 18:14:24

标签: r algorithm vector

我正在尝试使用metropolis算法生成随机数,但我无法使其工作,因为它不能保存我需要的100,000个样本。如何将样本保存在c()中?

这就是我所拥有的:

funct <- function(x) { dnorm(x,-2,1) * 1/3 + dnorm(x,2,1) * 2/3 }

samples <- c()
x = 0
random_walk_std = 1
delta = rnorm( 1, mean = 0, sd = 1 ) 

while( length(samples) < 100000)
{
  xp = x + delta
  r = funct(xp)/funct(x)

  if( r>=1 ){

    x <- xp
    samples 

    samples =samples + 1
  }

  else if (r<=1){

    s = runif(1, min=0, max=1)

    if( s<=r ){

      x <- xp
      x[samples] = samples + 1

       samples[x] =samples + 1
    }
   }
  end
}

hist( samples, probability=TRUE, col=gray(.9), lwd=2, main="" )
curve( funct(x), add=T, lwd=2)

任何帮助将不胜感激,谢谢!

1 个答案:

答案 0 :(得分:1)

通过一些代码编辑,请检查此结果与预期输出:

set.seed(111)
while( length(samples) < 100)
{
  xp = x + delta
  r = funct(xp)/funct(x)

  if( r>=1 ){

    x <- xp
    samples <- c(samples, x) 
  }

  else if (r<=1){

    s = runif(1, min=0, max=1)

    if( s<=r ){

      x <- xp
      samples <- c(samples, x)
    }
   }
}


samples
#   [1]  0.2083592  0.4167183  0.6250775  0.8334367  1.0417958  1.2501550  1.4585142
#   [8]  1.6668733  1.8752325  2.0835917  2.2919508  2.5003100  2.7086692  2.9170283
#  [15]  3.1253875  3.3337467  3.5421058  3.7504650  3.9588242  4.1671833  4.3755425

您的代码有一些控制流不一致。您检查if( r>=1 )然后检查if (r<=1),您应该指定您希望1属于哪种情况。最后,检查if( s<=r )s > r会发生什么?这是故意的吗?现在它被忽略,直到添加另一个语句。