在R中,我如何生成平均值为X且中位数为Y(至少接近)的N个数字。
或者更一般地说,是否有算法?
答案 0 :(得分:8)
有无数的解决方案。
近似算法:
假设您希望中位数为零且平均值为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函数,例如runif
,rnorm
,rchisq
。你可以创建一个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