' X' R中的数字不是R.中的拒绝采样

时间:2018-05-08 18:36:54

标签: r numeric

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

1 个答案:

答案 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)

Histogram output