3

Rで、平均がXで中央値がY(少なくともに近い)のN個の数値を生成するにはどうすればよいですか。

または、おそらくもっと一般的に、これのためのアルゴリズムはありますか?

4

4 に答える 4

8

解決策は無数にあります。

近似アルゴリズム:

  1. 中央値より下にn/2の数値を生成します
  2. 中央値より上にn/2の数値を生成します
  3. 必要な中央値を追加して確認します
  4. あなたの平均を満たすのに十分な重みを持つ1つの数を追加します-あなたはそれを解くことができます

中央値がゼロで平均が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ます。あなたはarbを作成することができます。関数との距離。rnormrchisqsample

于 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 に答える