'x' 在 R 中不是数字。R 中的拒绝采样

'x' is not numeric in R. Rejection sampling in R

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 中进行拒绝抽样。

运行 你的例子给出了一个列表输出。 这就是 replicate() 的标准输出。

您得到 NULL 个值,因为您的函数并不总是 return 个值。

因为你只有 return 数值和 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)