![](/img/trans.png)
[英]How to estimate the density (empirical pdf) from quantiles (the empirical CDF) in R
[英]How to find quantiles of an empirical cumulative density function (ECDF)
在下文中,我将不使用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的倒数猜测为样本分位数,即,逆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()
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.