如何找到经验累积密度函数(ECDF)的分位数

时间:2016-07-23 01:33:09

标签: r statistics distribution

我使用ecdf()函数从一些随机样本中计算经验累积密度函数(ECDF):

set.seed(0)
X = rnorm(100)
P = ecdf(X)

现在P给了ECDF,我们可以绘制它:

plot(P)
abline(h = 0.6, lty = 3)

ecdf

我的问题是:如何找到样本值x,例如P(x) = 0.6,即ECDF的0.6分位数,或x坐标ECDF与h = 0.6的交叉点?

1 个答案:

答案 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)

enter image description here

现在,我们正在寻找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)的线性插值函数,其中包含:

  • x值为seq(0, 1, length = n);
  • y值是分类样本。

我们可以通过以下方式定义我们自己的样本分位数函数版本

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()