在R中生成数字

时间:2011-12-04 04:11:54

标签: r median mean

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

或者更一般地说,是否有算法?

4 个答案:

答案 0 :(得分:8)

有无数的解决方案。

近似算法:

  1. 生成低于中位数
  2. 的n / 2个数字
  3. 生成高于中位数
  4. 的n / 2个数字
  5. 添加所需的中位数并检查
  6. 添加一个足够重量的数字以满足您的平均值 - 您可以解决
  7. 假设您希望中位数为零且平均值为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获取上面的表达式。

答案 1 :(得分:3)

对于看起来相当“正常”的一组数据,您可以使用@ 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)))
     ) 

答案 2 :(得分:1)

请注意第一个答案的第一句话。除非你知道你想要的底层发行版,否则你无法做到。一旦了解了该分布,就会有许多标准的R函数,例如runifrnormrchisq。你可以创建一个arb。 dist sample函数。

答案 3 :(得分:0)

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

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

E.g:

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