![](/img/trans.png)
[英]Generate a random matrix in R with m columns and n rows where rows sum to 1
[英]Generate N random integers that sum to M in R
我想生成N
随机正整数,总和为M
我希望在均值为M/N
且标准差较小的正态分布附近选择随机正整数(可以将其设置为约束吗?)。
最后,您将如何概括该答案以生成N个随机正数(不仅是整数)?
我发现了其他相关问题,但无法确定如何将其答案应用于这种情况: https : //stats.stackexchange.com/questions/59096/generate-three-random-numbers-that-sum-to-1-输入
规范化。
rand_vect <- function(N, M, sd = 1, pos.only = TRUE) {
vec <- rnorm(N, M/N, sd)
if (abs(sum(vec)) < 0.01) vec <- vec + 1
vec <- round(vec / sum(vec) * M)
deviation <- M - sum(vec)
for (. in seq_len(abs(deviation))) {
vec[i] <- vec[i <- sample(N, 1)] + sign(deviation)
}
if (pos.only) while (any(vec < 0)) {
negs <- vec < 0
pos <- vec > 0
vec[negs][i] <- vec[negs][i <- sample(sum(negs), 1)] + 1
vec[pos][i] <- vec[pos ][i <- sample(sum(pos ), 1)] - 1
}
vec
}
对于连续版本,只需使用:
rand_vect_cont <- function(N, M, sd = 1) {
vec <- rnorm(N, M/N, sd)
vec / sum(vec) * M
}
rand_vect(3, 50)
# [1] 17 16 17
rand_vect(10, 10, pos.only = FALSE)
# [1] 0 2 3 2 0 0 -1 2 1 1
rand_vect(10, 5, pos.only = TRUE)
# [1] 0 0 0 0 2 0 0 1 2 0
rand_vect_cont(3, 10)
# [1] 2.832636 3.722558 3.444806
rand_vect(10, -1, pos.only = FALSE)
# [1] -1 -1 1 -2 2 1 1 0 -1 -1
只是想出了一种算法,以均匀分布的方式生成N个大于或等于k的随机数,其和为S。 我希望它会在这里有用!
首先,生成介于k和S-k(N-1)之间的N-1个随机数。 按降序对它们进行排序。 然后,对于所有x i ,其中i <= N-2,应用x'i = x i -x i + 1 + k,并且x'N -1 = x N-1 (使用两个缓冲区)。 第N个数字只是S减去所有获得的数量之和。 这具有为所有可能的组合给出相同概率的优点。 如果您想使用正整数,则k = 0(或者可能是1?)。 如果需要实数,请对连续RNG使用相同的方法。 如果您的数字是整数,则可能会担心它们是否等于k。 最好的祝愿!
说明:通过取出其中一个数字,当在(N-1)-空间中表示一个第N个有效数字的所有值组合时,它形成一个单纯形,该空间位于(N-1)-立方体( (N-1)立方体,由随机值范围描述)。 生成它们之后,我们必须将N立方体中的所有点映射到单纯形中的点。 为此,我使用了一种三角剖分方法,该方法涉及所有可能的坐标降序排列。 通过对值进行排序,我们正在映射所有(N-1)! 仅限于其中之一。 我们还必须转换和缩放数字矢量,以使所有坐标都位于[0,1]中,方法是减去k并将结果除以S-kN。 让我们命名新坐标y i 。
然后,我们通过乘以原始基础的逆矩阵来应用转换,如下所示:
/ 1 1 1 \ / 1 -1 0 \
B = | 0 1 1 |, B^-1 = | 0 1 -1 |, Y' = B^-1 Y
\ 0 0 1 / \ 0 0 1 /
这给Y” 我 = Y I - ýI + 1。 当我们重新缩放坐标,我们得到:X 'I = Y' 我 (S -千牛)+ K = Y 我 (S -千牛) - Ÿi + 1的 (S -千牛)+ K =(X I - k)的-(x i + 1 -k)+ k = x i -x i + 1 + k,因此具有上述公式。 这适用于除最后一个元素以外的所有元素。
最后,我们应该考虑到这种变换引入概率分布的失真。 实际上,如果我错了,请纠正我,应用于第一个单纯形以获得第二个单纯形的变换不应更改概率分布。 这是证明。
在任何一点上的概率增加是该点周围局部区域的体积增加,因为该区域的大小趋于零,然后除以单纯形的总体积增加。 在这种情况下,两个体积是相同的(只是取基向量的行列式)。 如果区域体积的线性增加始终等于1,则概率分布将相同。我们可以将其计算为变换向量V'= B -1 V相对于V的导数的转置矩阵的行列式,当然是B -1 。
该行列式的计算非常简单,给出的值为1,这意味着这些点不会以任何方式失真,这会使某些点比其他点更容易出现。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.