计算百分位数? (或更一般地,评估由 2 个向量 x 和 y 在许多值 z 隐式定义的函数)

Calculate percentiles? (Or more generally, evaluate function implicitly defined by 2 vectors x and y at many values z)

假设您有一些向量 z 并且您计算 [f, x] = ecdf(z);,因此您的经验 CDF 可以用 stairs(x, f).

绘制

是否有一种简单的方法来计算 z 的所有百分位分数?

我可以这样做:

感觉应该有一个更简单、已经实现的方法来做到这一点...

f 为定义在值 x 处的 单调函数 ,您要为其计算值 p 处的反函数.在您的情况下 f 是单调的,因为它是 CDF;值 p 定义了所需的分位数。然后你可以简单地使用 interp1 来插入 x,被认为是 f 的函数,在值 p:

z = randn(1,1e5); % example data: normalized Gaussian distribution
[f, x] = ecdf(z); % compute empirical CDF
p = [0.5 0.9 0.95]; % desired values for quantiles
result = interp1(f, x, p);

在上述代码的示例 运行 中,这会产生

result =
   0.001706069265714   1.285514249607186   1.647546848952448

对于从数据z计算分位数p的具体情况,您可以直接使用quantile,从而避免计算经验值CDF:

result = quantile(z, p)

根据第一种方法中经验 CDF 的计算方式,结果可能会略有不同:

>> quantile(z, p)
ans =
   0.001706803588857   1.285515826972878   1.647582486507752

为了比较,上述示例(高斯分布)的理论值是

>> norminv(p)
ans =
                   0   1.281551565544601   1.644853626951472