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