ウィキペディアから:
スコアのパーセンタイル ランクは、度数分布内のスコアと同じかそれよりも低いスコアのパーセンテージです。
これを説明するために、後で (コードを) テストできるように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 未満などです。これで、x
and 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)
