我正在尝试使用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)
任何帮助将不胜感激,谢谢!
答案 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
会发生什么?这是故意的吗?现在它被忽略,直到添加另一个语句。