'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)
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)