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

Matlab 计算百分位数?(或者更一般地说,在多个值z处计算由2个向量x和y隐式定义的函数),matlab,statistics,percentile,Matlab,Statistics,Percentile,假设你有一些向量z,你计算[f,x]=ecdf(z),因此可以使用楼梯(x,f)绘制经验CDF 是否有一种简单的方法来计算z的所有百分位分数 我可以这样做: 循环通过z,即针对z的每个条目z(i) 通过排序向量x进行二进制搜索,以查找z(i)的位置。(查找索引j,使x(j)=z(i)) 找到相应的值f(j) 感觉应该有一种更简单的、已经实现的方法来实现这一点…让f成为一个单调函数在x处定义,对于它,您要计算p处的反函数。在你的例子中,f是单调的,因为它是CDF;值p定义了所需的分位数。然

假设你有一些向量
z
,你计算
[f,x]=ecdf(z),因此可以使用
楼梯(x,f)
绘制经验CDF

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

我可以这样做:

  • 循环通过
    z
    ,即针对
    z的每个条目
    z(i)
    • 通过排序向量
      x
      进行二进制搜索,以查找
      z(i)
      的位置。(查找索引
      j
      ,使x(j)=z(i))
    • 找到相应的值
      f(j)

感觉应该有一种更简单的、已经实现的方法来实现这一点…

f
成为一个单调函数
x
处定义,对于它,您要计算
p
处的反函数。在你的例子中,
f
是单调的,因为它是CDF;值
p
定义了所需的分位数。然后,您可以简单地使用插值
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
的特定情况,您可以直接使用,从而避免计算经验CDF:

result = quantile(z, p)
根据第一种方法中经验CDF的计算方式,结果可能略有不同:

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

为了进行比较,上述示例(高斯分布)的理论值如下

>> norminv(p)
ans =
                   0   1.281551565544601   1.644853626951472