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

Yan*_*ang 3 statistics r distribution

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

set.seed(0)
X = rnorm(100)
P = ecdf(X)
Run Code Online (Sandbox Code Playgroud)

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

plot(P)
abline(h = 0.6, lty = 3)
Run Code Online (Sandbox Code Playgroud)

心电图

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

李哲源*_*李哲源 5

在下文中,我将不使用ecdf(),因为我们自己很容易获得经验累积密度函数(ECDF)。

首先,我们X按升序对样本进行排序:

X <- sort(X)
Run Code Online (Sandbox Code Playgroud)

这些样本的ECDF取函数值:

e_cdf <- 1:length(X) / length(X)
Run Code Online (Sandbox Code Playgroud)

然后,我们可以通过以下方式绘制ECDF:

plot(X, e_cdf, type = "s")
abline(h = 0.6, lty = 3)
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

现在,我们正在寻找的第一个值X,例如P(X) >= 0.6。这只是:

X[which(e_cdf >= 0.6)[1]]
# [1] 0.2290196
Run Code Online (Sandbox Code Playgroud)

由于我们的数据是从标准正态分布中采样的,因此理论分位数为

qnorm(0.6)
# [1] 0.2533471
Run Code Online (Sandbox Code Playgroud)

因此,我们的结果非常接近。


延期

由于CDF的倒数是分位数函数(例如,pnorm()is 的倒数qnorm()),因此可以将ECDF的倒数猜测为样本分位数,即,反数ecdf()quantile()。这不是真的!

ECDF是阶梯/步函数,它没有逆函数。如果我们绕ECDF旋转y = x,则所得曲线不是数学函数。因此,样本分位数与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
  }
Run Code Online (Sandbox Code Playgroud)

让我们进行测试:

my_quantile(x, 0.6)
# [1] 0.2343171

quantile(x, prob = 0.6, names = FALSE)
# [1] 0.2343171
Run Code Online (Sandbox Code Playgroud)

请注意,结果与我们得到的结果不同X[which(e_cdf >= 0.6)[1]]

出于这个原因,我拒绝quantile()在答案中使用。