在 R 中生成范围为 [1, 3] 的正态分布随机变量

Min*_*ark 0 r normal-distribution

我想生成一个范围为 [1, 3] 的正态分布随机变量。

具体来说,我尝试了以下 R 代码:

x1 <- runif(100, 1, 2)
x2 <- rnorm(100, 0, 0.3)

V <- 1 + x1 + x2
Run Code Online (Sandbox Code Playgroud)

然后,V服从正态分布(以 为条件x1)并且大致集中在 [1, 3] 上。

但是,我想让V范围为 [1, 3]。也就是说,所有元素都应该在 [1, 3] 中,而不是粗略地在 [1, 3] 中:

min(V)
[1] 1
max(V)
[1] 3
Run Code Online (Sandbox Code Playgroud)

我不知道该怎么办。有完成这项任务的技术吗?

All*_*ron 5

由于任何正态分布的支持都是整个实数轴,因此获得所需内容的唯一方法是抽取样本,然后将其归一化到指定的范围内。正如 r2evans 指出的那样,任何此类方法都存在理论上的问题。然而,它的一个简单实现是

rnorm_limits <- function(n, min = 1, max = 3) {
  x <- rnorm(n)
  x <- (max - min) * x/diff(range(x))
  return(x - min(x) + min)
}
Run Code Online (Sandbox Code Playgroud)

测试,我们有:

set.seed(1)

hist(rnorm_limits(100))
Run Code Online (Sandbox Code Playgroud)

当然,范围将与指定的完全相同:

range(rnorm_limits(100))
#> [1] 1 3
Run Code Online (Sandbox Code Playgroud)