【问题标题】:How to calculate random numbers in R如何计算R中的随机数
【发布时间】:2015-02-16 17:07:37
【问题描述】:

我有一个 26 列的矩阵。每行的值总和为1:

           [,1]       [,2]       [,3]       [,4]       [,5]       [,6]       [,7]      [,8]       [,9]      [,10]      [,11]
[1,] 0.02105263 0.01052632 0.01052632 0.04210526 0.01052632 0.06315789 0.03157895 0.1789474 0.07368421 0.07368421 0.02105263
[2,] 0.00000000 0.01176471 0.01176471 0.00000000 0.01176471 0.18823529 0.09411765 0.1764706 0.15294118 0.07058824 0.01176471
[3,] 0.00000000 0.00000000 0.02941176 0.01470588 0.04411765 0.11764706 0.05882353 0.2058824 0.07352941 0.08823529 0.00000000
          [,12]      [,13]      [,14] [,15]      [,16]      [,17]      [,18]      [,19]      [,20]      [,21]      [,22]
[1,] 0.04210526 0.04210526 0.05263158     0 0.03157895 0.02105263 0.00000000 0.04210526 0.01052632 0.05263158 0.02105263
[2,] 0.00000000 0.01176471 0.00000000     0 0.03529412 0.01176471 0.04705882 0.04705882 0.02352941 0.01176471 0.00000000
[3,] 0.02941176 0.02941176 0.02941176     0 0.05882353 0.01470588 0.02941176 0.02941176 0.02941176 0.01470588 0.00000000
          [,23]      [,24]      [,25]      [,26]
[1,] 0.06315789 0.03157895 0.03157895 0.02105263
[2,] 0.05882353 0.02352941 0.00000000 0.00000000
[3,] 0.02941176 0.01470588 0.00000000 0.05882353

我想替换这些值以组成一些新数据。这意味着将一行中的每个值随机更改为 +- 5% 范围内的值,同时仍将行和加起来为 1。

因此,在第 2 列中,第 6 个值当前为 0.18,而在新数据中,它应该介于 0.171 和 0.189 之间(加上 5%)。

或者,列中的值应仅从正态分布中提取,但不应与原始值相差太大。对于像 0.18 这样的大值以及较小的值,可能更多。

如果值为 0,最好随机决定它应该保持在 0 还是增加 5% 或 10% 之间的范围(以 0.0001 之类的初始值作为初始值)。

有没有简单的方法可以做到这一点?

【问题讨论】:

    标签: r random normal-distribution


    【解决方案1】:

    嗯,您要做的第一件事就是能够生成新数字。可以使用rnorm() 完成。您可以为其提供平均值和标准差。平均值应该为零,sd 大约在 0.02 左右。这将导致绝大多数生成的数字在原始数字的 0.05 范围内。

    之后,您希望重新缩放回 1 的行和,这很容易通过将所有值除以整行的总和来实现。

    > (a <- 1:10)
     [1]  1  2  3  4  5  6  7  8  9 10
    > (a <- a / sum(a))
     [1] 0.01818182 0.03636364 0.05454545 0.07272727 0.09090909 0.10909091 0.12727273 0.14545455 0.16363636 0.18181818
    > (a <- a + rnorm(10, 0, 0.02))
     [1] 0.01293189 0.06799608 0.03552480 0.08015437 0.07834294 0.07845255 0.11692691 0.13262836 0.15728399 0.16228330
    > sum(a)
    [1] 0.9225252
    > sum(a / sum(a))
    [1] 1
    > a <- a / sum(a)
    

    我会让你弄清楚如何消除负数和 5% 或 10% 的增长。但这些是您需要的工具。

    【讨论】:

      【解决方案2】:

      让您的数据集是一个名为data 的矩阵,然后data * matrix(runif(prod(dim(data)),.95,1.05),nrow=nrow(data)) 将为您提供所有+/- 5% 的数据。

      如果您不想要负值,您可以将其全部包装在 abs() 中,因为如果一个值可以移动 5% 并且为负数,那么绝对值将始终在原始值的 5% 以内。

      如果您想从没有 0 值开始,那么第一步是 data = data[which(data&lt;=0)] = 0.001

      【讨论】:

        猜你喜欢
        • 2017-12-20
        • 2019-03-18
        • 1970-01-01
        • 2021-03-22
        • 2018-08-29
        • 2021-04-26
        • 1970-01-01
        • 1970-01-01
        • 2018-09-25
        相关资源
        最近更新 更多