繁体   English   中英

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

[英]How to find quantiles of an empirical cumulative density function (ECDF)

我使用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分位数,或ECDF与h = 0.6的交点的x坐标?

在下文中,我将不使用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) 的线性插值函数 ,其中:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM