计算百分位数? (或更一般地,评估由 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
的所有百分位分数?
我可以这样做:
- 遍历
z
,即针对 z
的每个条目 z(i)
- 通过排序向量
x
进行二分搜索以查找 z(i)
所在的位置。 (找到索引 j
使得 x(j) = z(i))
- 求出对应的值
f(j)
感觉应该有一个更简单、已经实现的方法来做到这一点...
设 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
假设您有一些向量 z
并且您计算 [f, x] = ecdf(z);
,因此您的经验 CDF 可以用 stairs(x, f)
.
是否有一种简单的方法来计算 z
的所有百分位分数?
我可以这样做:
- 遍历
z
,即针对z
的每个条目z(i)
- 通过排序向量
x
进行二分搜索以查找z(i)
所在的位置。 (找到索引j
使得 x(j) = z(i)) - 求出对应的值
f(j)
- 通过排序向量
感觉应该有一个更简单、已经实现的方法来做到这一点...
设 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