如何在数据框中的一列值中生成随机均匀分布,而不必为所述列中的每个值重复?

How to generate random uniform distribution down a column of values in a dataframe without having to repeat for every value in said column?

我需要使用 runif 命令创建基于均匀分布的随机变量。我有一列值,最大值和最小值将基于这些值。我想知道是否有一种方法可以将 runif 应用到列的下方,而不必为值列中的每个值重复该过程?不能使用其他的。我们正在使用 rnormrunif 等,因此不允许使用其他统计信息。

例如:

set.seed(1234)
values <- (30, 45, 80, 90, 80)
var_1 <- runif(5, 30*(.5), 30*(1.25))
var_2 <- runif(5, 45*(.5), 45*(1.25))
var_3 <- runif(5, 80*(.5), 80*(1.25))
var_4 <- runif(5, 90*(.5), 90*(1.25))
var_5 <- runif(5, 80*(.5), 80*(1.25))

这基本上是我必须要做的,但只是它是一个比五个观察值更大的数据框。我还必须生成比 5 个更多的随机数。我希望有一种方法可以加快该过程,这样我就不需要为数据报中的每一行重复 var_3 <- runif 部分。如果有帮助,我可以将数据框的列转换为具有单列和多行的矩阵。最后,我将从这些随机生成的数字中抽样以执行 Monte Carlo 模拟。

我假设某些 apply 函数可以工作,但我仍然不确定 apply 系列中的任何东西是如何工作的。我查看了一些已经发布的答案,但答案有点让我头疼,我无法像最初认为的那样改变它们来帮助我。

像这样:

set.seed(1234)
values <- c(30, 45, 80, 90, 80)

mat <- sapply(values, function(x) runif(5, x*(.5), x*(1.25)))

colnames(mat) <- values

mat

> mat
           30       45       80        90       80
[1,] 15.79778 33.49176 82.79809 106.63342 84.65663
[2,] 27.71421 27.73334 46.04614 108.84509 94.95845
[3,] 21.30580 26.88622 97.01830  63.84305 99.67589
[4,] 19.59442 37.19917 47.30907  53.33430 96.54164
[5,] 18.00913 23.80419 53.17940  98.80833 69.16812

这是使用逆概率积分变换的另一种选择:

set.seed(1234)
values <- c(30, 45, 80, 90, 80)
n <- length(values)
m <- 10L
t(values * t((1.25 - 0.5) * matrix(runif(m*n), m, n) + 0.5))

OP 分布的 CDF 是 F(x) = 1 / (1.25 - 0.5) * ( x - 0.5 )。 因此,F^{-1}(u) = (1.25 - 0.5) * u + 0.5.

我们生成标准均匀随机变量,并使用此 F^{-1}(u) 使用逆 PIT 将其转换为所需的分布。

这两个 t 操作是 i) 用于通过 values 轻松缩放和 ii) 以确保输出采用相同的格式。

参考:

  1. 逆变换采样,维基百科,https://en.wikipedia.org/wiki/Inverse_transform_sampling