我使用ecdf()
函数从一些随机样本中计算经验累积密度函数(ECDF):
set.seed(0)
X = rnorm(100)
P = ecdf(X)
现在P
给了ECDF,我们可以绘制它:
plot(P)
abline(h = 0.6, lty = 3)
我的问题是:如何找到样本值x
,例如P(x) = 0.6
,即ECDF的0.6分位数,或x坐标ECDF与h = 0.6
的交叉点?
答案 0 :(得分:3)
在下文中,我不会使用ecdf()
,因为我们自己很容易获得经验累积密度函数(ECDF)。
首先,我们按升序对样本X
进行排序:
X <- sort(X)
这些样本的ECDF采用函数值:
e_cdf <- 1:length(X) / length(X)
然后我们可以通过以下方式绘制ECDF:
plot(X, e_cdf, type = "s")
abline(h = 0.6, lty = 3)
现在,我们正在寻找X
的第一个值,即P(X) >= 0.6
。这只是:
X[which(e_cdf >= 0.6)[1]]
# [1] 0.2290196
由于我们的数据是从标准正态分布中采样的,因此理论分位数为
qnorm(0.6)
# [1] 0.2533471
所以我们的结果非常接近。
由于 CDF的逆是分位数函数(例如,pnorm()
的逆是qnorm()
),可以猜测ECDF的逆是样本分位数,i ,e,反ecdf()
是quantile()
。事实并非如此!
ECDF是阶梯/阶梯函数,它没有逆。如果我们围绕y = x
旋转ECDF,则生成的曲线不是数学函数。 因此,样本分位数与ECDF无关。。
对于n
个排序样本,样本分位数函数实际上是(x, y)
的线性插值函数,其中包含:
seq(0, 1, length = n)
; 我们可以通过以下方式定义我们自己的样本分位数函数版本
my_quantile <- function(x, prob) {
if (is.unsorted(x)) x <- sort(x)
n <- length(x)
approx(seq(0, 1, length = n), x, prob)$y
}
让我们进行测试:
my_quantile(x, 0.6)
# [1] 0.2343171
quantile(x, prob = 0.6, names = FALSE)
# [1] 0.2343171
请注意,结果与我们从X[which(e_cdf >= 0.6)[1]]
获得的结果不同。
正是出于这个原因,我在答案中拒绝使用quantile()
。