【问题标题】:Generate numbers in R在 R 中生成数字
【发布时间】:2011-12-06 10:25:25
【问题描述】:

在 R 中,我如何生成 N 个平均值为 X 和中位数为 Y(至少接近)的数字。

或者更笼统地说,有没有这样的算法?

【问题讨论】:

    标签: r median mean


    【解决方案1】:

    有无数种解决方案。

    近似算法:

    1. 在中位数以下生成 n/2 个数字
    2. 生成高于中位数的 n/2 个数字
    3. 添加所需的中位数并检查
    4. 添加一个具有足够权重的数字来满足您的均值 - 您可以解决此问题

    假设您想要中位数为 0 和平均值为 20 的示例:

    R> set.seed(42)
    R> lo <- rnorm(10, -10); hi <- rnorm(10, 10)
    R> median(c(lo,0,hi))
    [1] 0                         # this meets our first criterion
    R> 22*20 - sum(c(lo,0,hi))    # (n+1)*desiredMean - currentSum
    [1] 436.162                   # so if we insert this, we the right answer
    R> mean(c(lo,0,hi,22*20 - sum(c(lo,0,hi))))
    [1] 20                        # so we meet criterion two
    R> 
    

    因为desiredMean times (n+1) 必须等于sum(currentSet) + x,所以我们求解x 得到上面的表达式。

    【讨论】:

      【解决方案2】:

      对于一组看起来相当“正常”的数据,您可以使用@Dirk-Eddelbuettel 概述的校正因子方法,但使用您的自定义值来生成一组围绕您的平均值的数据:

      X = 25
      Y = 25.5
      N = 100
      set.sd = 5 # if you want to set the standard deviation of the set.
      
      set <- rnorm(N, Y, set.sd) # generate a set around the mean
      set.left <- set[set < X] # take only the left half
      set <- c(set.left, X + (X - set.left)) # ... and make a copy on the right.
      
      # redefine the set, adding in the correction number and an extra number on the opposite side to the correction: 
      set <- c(set, 
           X + ((set.sd / 2) * sign(X - Y)),
           ((length(set)+ 2) * Y) 
           - sum(set, X + ((set.sd / 2) * sign(X - Y)))
           ) 
      

      【讨论】:

        【解决方案3】:

        请注意第一个答案的第一句话。除非你知道你想要什么样的底层分布,否则你做不到。一旦您了解了该分布,就会有许多标准的 R 函数,例如 runifrnormrchisq。您可以创建套利。 dist 与 sample 函数。

        【讨论】:

        • 是的。所述问题完全没有明确说明,因此不是非常有用。
        【解决方案4】:

        如果您对 X &lt; Y 的限制没有问题,那么您可以拟合对数正态分布。对数正态很方便地具有均值和中值的封闭形式。

        rmm <- function(n, X, Y) rlnorm(n, log(Y), sqrt(2*log(X/Y)))
        

        例如:

        z <- rmm(10000, 3, 1)
        mean(z)
        # [1] 2.866567
        median(z)
        # [1] 0.9963516
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2021-01-10
          • 1970-01-01
          • 2021-10-27
          • 1970-01-01
          • 2018-12-11
          • 1970-01-01
          • 2019-11-20
          相关资源
          最近更新 更多