使用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()
函数,但无法找到一种方法来使它产生单个概率而不是完整的方程式对象。
答案 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)