2011-12-04 86 views
3

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

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

回答

8

有无数的解决方案。

近似算法:

  1. 生成N/2号低于中位数
  2. 产生N个位数
  3. 以上/ 2号添加你需要的位数和检查
  4. 添加一个号码有足够的重量以满足你的意思 - 你可以解决这个问题

假设你想要一个中位数为零,平均值为二十:

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获得上述表达式。

3

对于一组数据看起来还算“正常”,你可以用修正系数法通过@德克 - 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))) 
    ) 
1

重视第一个答案的第一句话。除非你知道你想要什么底层发行版,否则你不能这样做。一旦知道该分配,就有许多标准的R函数,例如runif,rnorm,rchisq。你可以创建一个arb。与sample函数。

+0

是啊。所陈述的问题完全没有明确说明,因此不是非常有用。 –

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