rexp_k <- function(a,b) {
y <- runif(1)
u <- runif(1)
a <- 2.5
b <- 3.5
f <- (y^(a-1))*((1-y)^(b-1))
g <- dunif(y)
M <- ((a-1)/(a+b-2))^(a-1)*(1-((a-1)/(a+b-2)))^(b-1)
if (M*u <= f/g) {
return (y)
}
}
a <- 2.5
b <- 3.5
beta_samples <- replicate(10, rexp_k(a,b))
hist(beta_samples, probability = T)
所以当我尝试在最后一行绘制直方图时,它给出了一个错误,说x不是数字。 我试图在R中进行拒绝抽样。
答案 0 :(得分:0)
运行示例会给出一个列表输出。
这就是replicate()
的标准输出。
您获得了NULL
个值,因为您的函数并不总是返回值。
由于您只返回数字和NULL值,并且因为您还需要unlist()
,所以您只需使用unlist()
即可。
> beta_samples
[[1]]
[1] 0.2615192
[[2]]
[1] 0.5856312
[[3]]
[1] 0.4794066
[[4]]
NULL
[[5]]
[1] 0.3697637
[[6]]
NULL
[[7]]
[1] 0.5003103
[[8]]
NULL
[[9]]
NULL
[[10]]
NULL
在unlist()
之后,列表中的NULL值将被删除。
如果它们是NA
或字符值,则不会出现这种情况,但对于您而言,它会做到这一点。
> unlist(beta_samples)
[1] 0.2615192 0.5856312 0.4794066 0.3697637 0.5003103
您可以使用这些绘制直方图。
hist(unlist(beta_samples), probability = T)