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

时间:2012-02-03 04:46:57

标签: r probability

使用R,计算采样分布中给定概率的分位数是微不足道的:

x <- rnorm(1000, mean=4, sd=2)
quantile(x, .9) # results in 6.705755

但是,我找不到一种简单的方法来反演计算样本x中给定分位数的概率。我最接近的是使用pnorm()与创建样本时使用的平均值和标准差相同:

pnorm(5, mean=4, sd=2) # results in 0.6914625

但是,因为这是从完全正态分布而不是样本x计算概率,所以它并不完全准确。

是否存在基本上与quantile()相反的函数?什么基本上让我做pnorm()同样的事情,但有一个样本?像这样:

backwards_quantile(x, 5)

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

3 个答案:

答案 0 :(得分:16)

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

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

答案 1 :(得分:1)

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

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

答案 2 :(得分:1)

您或多或少都有答案。当你想写

backwards_quantile(x, 5)

只写

ecdf(x)(5)

这对应于type = 1的分位数()的倒数。但是,如果要使用其他类型(我更喜欢NIST标准,对应于Excel的Percentile.exc,它是type = 6),则您还有更多工作要做。

在后一种情况下,请考虑将要使用的用途。例如,如果您只想绘制它,请考虑

yVals<-seq(0,1,0.01)
plot(quantile(x,yVals,type=6))

但是,如果您希望单个值的倒数(如5),那么您需要编写一个求解函数来找到使之产生的P。

quantile(x,P,type=6) = 5

例如,这在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
}

因此,如果您希望集合5的类型4的四分位数精度为0.00001,则可以这样写

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