如何计算R中给定分位数的概率?

如何计算R中给定分位数的概率?,r,probability,R,Probability,使用R,计算采样分布中给定概率的分位数是很简单的: x <- rnorm(1000, mean=4, sd=2) quantile(x, .9) # results in 6.705755 然而,因为这是根据完全正态分布计算概率,而不是样本x,所以它并不完全准确 是否有一个函数本质上与分位数()相反?一些基本上可以让我做与pnorm()相同的事情,但是有一个示例?大概是这样的: backwards_quantile(x, 5) 我找到了ecdf()函数,但无法找到一种方法使其产生一个单

使用R,计算采样分布中给定概率的分位数是很简单的:

x <- rnorm(1000, mean=4, sd=2)
quantile(x, .9) # results in 6.705755
然而,因为这是根据完全正态分布计算概率,而不是样本
x
,所以它并不完全准确

是否有一个函数本质上与
分位数()相反?一些基本上可以让我做与
pnorm()
相同的事情,但是有一个示例?大概是这样的:

backwards_quantile(x, 5)

我找到了
ecdf()
函数,但无法找到一种方法使其产生一个单一的概率而不是一个完整的等式对象。

ecdf
返回一个函数:您需要应用它

f <- ecdf(x)
f( quantile(x,.91) )
# Equivalently:
ecdf(x)( quantile(x,.91) )

f为了方便起见,此功能有助于:

quantInv <- function(distr, value) ecdf(distr)(value)
set.seed(1)
x <- rnorm(1000, mean=4, sd=2)
quantInv(x, c(4, 5, 6.705755))
[1] 0.518 0.685 0.904

quantInv你自己或多或少都有答案。当你想写作的时候

backwards_quantile(x, 5)
只要写

ecdf(x)(5)
这对应于类型为1的分位数()的倒数。但是,如果您需要其他类型(我支持NIST标准,对应于Excel的Percentile.exc,即type=6),您还有更多的工作要做

在后一种情况下,考虑使用哪种方法。例如,如果您只想绘制它,那么请考虑

yVals<-seq(0,1,0.01)
plot(quantile(x,yVals,type=6))
例如,它在x的极值之间使用二进制搜索:

inverse_quantile<-function(x,y,d=0.01,type=1) {
  A<-min(x)
  B<-max(x)
  k<-(log((B-A)/d)/log(2))+1
  P=0.5
  for (i in 1:k) {
    P=P+ifelse((quantile(x,P,type=type)<y),2^{-i-1},-2^{-i-1})
  }
  P
}


inverse\u quantile在原始帖子中显示的示例中,您实际上必须运行
ecdf(x)(5)
,才能找到给定的
x
的5分位数(大约0.697)。
quantile(x,P,type=6) = 5
inverse_quantile<-function(x,y,d=0.01,type=1) {
  A<-min(x)
  B<-max(x)
  k<-(log((B-A)/d)/log(2))+1
  P=0.5
  for (i in 1:k) {
    P=P+ifelse((quantile(x,P,type=type)<y),2^{-i-1},-2^{-i-1})
  }
  P
}

inverse_quantile<-function(x,5,d=0.00001,type=4)