3

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

或者更一般地说,有没有一种算法呢?

4

4 回答 4

8

有无数种解决方案。

近似算法:

  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上面的表达式。

于 2011-12-04T04:15:48.170 回答
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)))
     ) 
于 2011-12-04T08:31:56.483 回答
1

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

于 2011-12-04T14:15:13.490 回答
0

如果您对限制没问题X < 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
于 2011-12-06T02:25:25.490 回答