0

次のスコアとパーセンタイル ランクを指定して、R で分布を生成したいと思います。

x <- 1:10
PercRank <- c(1, 7, 12, 23, 41, 62, 73, 80, 92, 99)

PercRank = 1たとえば、データの 1% にvalue/score <= 1(x の最初の値) があることを示します。同様にPercRank = 7、データの 7% にvalue/score <= 2などがあることを示します。

根底にあるディストリビューションを見つける方法を知りません。pdfこれだけの情報から、基になるディストリビューションを取得する方法についてのガイダンスを得ることができれば幸いです。

4

3 に答える 3

9

ウィキペディアから:

スコアのパーセンタイル ランクは、度数分布内のスコアと同じかそれよりも低いスコアのパーセンテージです。

これを説明するために、後で (コードを) テストできるようにnormal distribution、 とmean=2を含む分布を作成してみましょう。sd=2

# 1000 samples from normal(2,2)
x1 <- rnorm(1000, mean=2, sd=2)

percentile rankさて、投稿で言及したのと同じものを取り上げましょう。これを 100 で割り、累積確率を表します。

cum.p <- c(1, 7, 12, 23, 41, 62, 73, 80, 92, 99)/100

scoresそして、これらのパーセンタイルに対応する値 ( ) は?

# generating values similar to your x.
x <- c(t(quantile(x1, cum.p)))
> x
 [1] -2.1870396 -1.4707273 -1.1535935 -0.8265444 -0.2888791  
         0.2781699  0.5893503  0.8396868  1.4222489  2.1519328

これは、データの 1% が -2.18 未満であることを意味します。データの 7% は -1.47 未満などです。これで、xand cum.p(あなたの に相当PercRank) が得られました。x1これが正規分布でなければならないという事実を忘れましょう。diffそれがどのような分布であるかを調べるために、n 番目と (n-1) 番目の要素の差を取ることを使用して、累積確率から実際の確率を取得しましょう。

prob <- c( cum.p[1], diff(cum.p), .01)
> prob
# [1] 0.01 0.06 0.05 0.11 0.18 0.21 0.11 0.07 0.12 0.07 0.01

あとは、x の間隔ごとに、たとえば 100 (任意の数) のサイズのサンプルを生成し、(x[1]:x[2], x[2]:x[3] ...)最後に、この膨大なデータから必要な数のポイント (たとえば、10000) をサンプリングするだけです。 )、上記の確率で。

これは次の方法で実行できます。

freq <- 10000 # final output size that we want

# Extreme values beyond x (to sample)
init <- -(abs(min(x)) + 5) 
fin  <- abs(max(x)) + 5

ival <- c(init, x, fin) # generate the sequence to take pairs from
len <- 100 # sequence of each pair

s <- sapply(2:length(ival), function(i) {
    seq(ival[i-1], ival[i], length.out=len)
})
# sample from s, total of 10000 values with probabilities calculated above
out <- sample(s, freq, prob=rep(prob, each=len), replace = T)

これで、分布から 10000 個のサンプルが得られました。様子を見てみましょう。これは、平均 = 2、sd = 2 の正規分布に似ているはずです。

> hist(out)

法線距離

> c(mean(out), sd(out))
# [1] 1.954834 2.170683

mean = 1.95との正規分布 (ヒストグラムから)sd = 2.17 (~ 2)です。

注: 私が説明したことのいくつかは、回り道であったり、コードが他のディストリビューションで動作する可能性があります。この投稿のポイントは、単純な例を使用して概念を説明することでした。

編集:ポイントを明確にするために、OPの質問に対応する同じコードを、xの値を置き換えて@Dwin's同じコードで試しました。x = 1:10

cum.p <- c(1, 7, 12, 23, 41, 62, 73, 80, 92, 99)/100
prob <- c( cum.p[1], diff(cum.p), .01)
x <- 1:10

freq <- 10000 # final output size that we want

# Extreme values beyond x (to sample)
init <- -(abs(min(x)) + 1) 
fin  <- abs(max(x)) + 1

ival <- c(init, x, fin) # generate the sequence to take pairs from
len <- 100 # sequence of each pair

s <- sapply(2:length(ival), function(i) {
    seq(ival[i-1], ival[i], length.out=len)
})
# sample from s, total of 10000 values with probabilities calculated above
out <- sample(s, freq, prob=rep(prob, each=len), replace = T)

> quantile(out, cum.p) # ~ => x = 1:10
# 1%     7%    12%    23%    41%    62%    73%    80%    92%    99% 
# 0.878  1.989  2.989  4.020  5.010  6.030  7.030  8.020  9.050 10.010 

> hist(out)

hist_OPs_data

于 2013-01-27T15:28:29.433 に答える
1

ヘルプページの関数ecdfの逆として言及されている関数が必要だと思います..quantile?quantile

# construct your vector containing the data
PercRank <- c(1, 7, 12, 23, 41, 62, 73, 80, 92, 99)

# construct an empirical cumulative distribution function
# which is really just the `inverse` of `quantile
Fn <- ( ecdf( PercRank ) )
# note that the `ecdf` function returns a function itself.

# calculate what percent of `PercRank` is below these integers..
Fn( 0 )
Fn( 1 )
Fn( 2 )
Fn( 3 )
Fn( 6 )
Fn( 7 )
Fn( 8 )


# re-construct your `x` vector using PercRank
Fn( PercRank ) * 10
于 2013-01-27T14:51:45.580 に答える
-1

これにより、指定した機能を持つデータセットが生成されます。より多くの「ランダム性」が必要な場合は、パーセンタイル スパンの範囲内で乱数を減算してrep、無名関数内で結果を得ることができます。

   > mapply( function(x,y) rep(x, each=y), (x),  diff(c(PercRank, 100) ) )
[[1]]
[1] 1 1 1 1 1 1

[[2]]
[1] 2 2 2 2 2

[[3]]
 [1] 3 3 3 3 3 3 3 3 3 3 3

[[4]]
 [1] 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4

[[5]]
 [1] 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5

[[6]]
 [1] 6 6 6 6 6 6 6 6 6 6 6

[[7]]
[1] 7 7 7 7 7 7 7

[[8]]
 [1] 8 8 8 8 8 8 8 8 8 8 8 8

[[9]]
[1] 9 9 9 9 9 9 9

[[10]]
[1] 10
于 2013-01-27T16:36:25.977 に答える