来自维基百科:
  分数的百分等级是其频率分布中与它相同或低于它的分数的百分比。
为了说明这一点,让我们创建一个分布,比如 a normal distribution,带有mean=2and 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)。
注意:我所解释的某些事情可能是迂回的和/或代码“可能/可能不”适用于其他一些发行版。这篇文章的目的只是用一个简单的例子来解释这个概念。
编辑:为了澄清@Dwin's一点,我尝试了与x = 1:10OP 的问题对应的相同代码,通过替换 x 的值使用相同的代码。
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)
