主要内容

本页翻译不是最新的。点击此处可查看最新英文版本。

prctile

数据集的百分位数

说明

P = prctile(A,p) 返回输入数据 A 在区间 [0,100] 中百分比 p 所对应的百分位数。

  • 如果 A 是向量,则 P 是标量或是与 p 长度相同的向量。P(i) 包含 p(i) 百分位数。

  • 如果 A 是矩阵,则 P 是行向量或矩阵,其中 P 的行数等于 length(p)P 的第 i 行包含 A 的每列的 p(i) 百分位数。

  • 如果 A 是多维数组,则 P 包含沿其大小不等于 1 的第一个数组维度计算的百分位数。

示例

P = prctile(A,p,"all") 返回 x 中所有元素的百分位数。

示例

P = prctile(A,p,dim) 沿维度 dim 进行运算。例如,如果 A 是矩阵,则 prctile(A,p,2) 对每行中的元素进行运算。

示例

P = prctile(A,p,vecdim) 沿在向量 vecdim 中指定的维度进行运算。例如,如果 A 是矩阵,则 prctile(A,p,[1 2])A 的所有元素进行运算,因为矩阵的每个元素都包含在由维度 1 和 2 定义的数组切片中。

示例

P = prctile(___,Method=method) 使用指定的方法计算百分位数。除了上述语法中的任何输入参量组合之外,还需要指定方法。

示例

示例

全部折叠

计算给定百分比的数据集的百分位数。

生成一个大小为 7 的数据集。

rng default % for reproducibility
A = randn(1,7)
A = 1×7

    0.5377    1.8339   -2.2588    0.8622    0.3188   -1.3077   -0.4336

计算 A 的元素的第 42 个百分位数。

P = prctile(A,42)
P = 
-0.1026

计算一个数组中所有值的百分位数。

创建一个 3×5×2 数组。

rng default % for reproducibility
A = randn(3,5,2)
A = 
A(:,:,1) =

    0.5377    0.8622   -0.4336    2.7694    0.7254
    1.8339    0.3188    0.3426   -1.3499   -0.0631
   -2.2588   -1.3077    3.5784    3.0349    0.7147


A(:,:,2) =

   -0.2050    1.4090   -1.2075    0.4889   -0.3034
   -0.1241    1.4172    0.7172    1.0347    0.2939
    1.4897    0.6715    1.6302    0.7269   -0.7873

计算 A 的所有元素的第 40 个和第 60 个百分位数。

P = prctile(A,[40 60],"all")
P = 2×1

    0.3307
    0.7213

P(1)A 的第 40 个百分位数,P(2)A 的第 60 个百分位数。

根据指定的百分比计算数据矩阵沿列和行的百分位数。

生成一个 5×5 数据矩阵。

A = (1:5)'*(2:6)
A = 5×5

     2     3     4     5     6
     4     6     8    10    12
     6     9    12    15    18
     8    12    16    20    24
    10    15    20    25    30

计算 A 的各列的第 25 个、第 50 个和第 75 个百分位数。

P = prctile(A,[25 50 75],1)
P = 3×5

    3.5000    5.2500    7.0000    8.7500   10.5000
    6.0000    9.0000   12.0000   15.0000   18.0000
    8.5000   12.7500   17.0000   21.2500   25.5000

矩阵 P 的每列包含矩阵 A 中对应列的三个百分位数。71217A 的第三列(元素为 4、8、12、16 与 20)的第 25 个、第 50 个及第 75 个百分位数。P = prctile(A,[25 50 75]) 返回相同的结果。

计算沿 A 的行的第 25 个、第 50 个和第 75 个百分位数。

P = prctile(A,[25 50 75],2)
P = 5×3

    2.7500    4.0000    5.2500
    5.5000    8.0000   10.5000
    8.2500   12.0000   15.7500
   11.0000   16.0000   21.0000
   13.7500   20.0000   26.2500

矩阵 P 的每行包含矩阵 A 中对应行的三个百分位数。2.7545.25A 的第一行(元素为 2、3、4、5 与 6)的第 25 个、第 50 个及第 75 个百分位数。

计算一个多维数组沿多个维度的百分位数。

创建一个 3×5×2 数组。

A = reshape(1:30,[3 5 2])
A = 
A(:,:,1) =

     1     4     7    10    13
     2     5     8    11    14
     3     6     9    12    15


A(:,:,2) =

    16    19    22    25    28
    17    20    23    26    29
    18    21    24    27    30

通过将维度 1 和 2 指定为运算维度,计算 A 的每页的第 40 个和第 60 个百分位数。

Ppage = prctile(A,[40 60],[1 2])
Ppage = 
Ppage(:,:,1) =

    6.5000
    9.5000


Ppage(:,:,2) =

   21.5000
   24.5000

Ppage(1,1,1)A 的第一页的第 40 个百分位数,Ppage(2,1,1)A 的第一页的第 60 个百分位数。

通过将维度 1 和 3 指定为运算维度,计算每个 A(:,i,:) 切片中元素的第 40 个和第 60 个百分位数。

Pcol = prctile(A,[40 60],[1 3])
Pcol = 2×5

    2.9000    5.9000    8.9000   11.9000   14.9000
   16.1000   19.1000   22.1000   25.1000   28.1000

Pcol(1,4)A(:,4,:) 中元素的第 40 个百分位数,Pcol(2,4)A(:,4,:) 中元素的第 60 个百分位数。

根据给定百分比计算 tall 列向量的精确和近似百分位数。

对 tall 数组执行计算时,MATLAB® 或者使用并行池(如果有 Parallel Computing Toolbox™,则默认使用并行池),或者使用本地 MATLAB 会话。要在有 Parallel Computing Toolbox 时使用本地 MATLAB 会话运行示例,请使用 mapreducer 函数更改全局执行环境。

mapreducer(0)

airlinesmall 数据集创建数据存储。将 NA" 值视为缺失数据,以便 datastoreNaN 值替换它们。指定使用 ArrTime 变量。

ds = datastore("airlinesmall.csv","TreatAsMissing","NA", ...
    "SelectedVariableNames","ArrTime");

基于数据存储创建一个 tall 表 tt,并将数据从 tall 表提取到 tall 向量 A 中。

tt = tall(ds)
tt =

  M×1 tall table

    ArrTime
    _______

      735  
     1124  
     2218  
     1431  
      746  
     1547  
     1052  
     1134  
       :
       :
A = tt{:,:}
A =

  M×1 tall double column vector

         735
        1124
        2218
        1431
         746
        1547
        1052
        1134
         :
         :

计算 A 的第 50 个精确百分位数。由于 A 是 tall 列向量且 p 是标量,因此 prctile 默认返回精确的百分位数值。

p = 50;
Pexact = prctile(A,p)
Pexact =

  tall double

    ?

Preview deferred. Learn more.

计算 A 的第 50 个近似百分位数。指定 "approximate" 方法以使用基于 T-Digest 的逼近算法计算百分位数。

Papprox = prctile(A,p,Method="approximate")
Papprox =

  M×N×... tall array

    ?    ?    ?    ...
    ?    ?    ?    ...
    ?    ?    ?    ...
    :    :    :
    :    :    :

Preview deferred. Learn more.

使用 gather 计算 tall 数组并将结果传入内存中。

[Pexact,Papprox] = gather(Pexact,Papprox)
Evaluating tall expression using the Local MATLAB Session:
- Pass 1 of 4: Completed in 0.64 sec
- Pass 2 of 4: Completed in 0.22 sec
- Pass 3 of 4: Completed in 0.36 sec
- Pass 4 of 4: Completed in 0.27 sec
Evaluation completed in 2 sec
Pexact = 
1522
Papprox = 
1.5220e+03

精确百分位数和近似百分位数的值在所示的四位数字上相同。

根据指定百分比计算 tall 矩阵沿不同维度的精确和近似百分位数。

对 tall 数组执行计算时,MATLAB® 或者使用并行池(如果有 Parallel Computing Toolbox™,则默认使用并行池),或者使用本地 MATLAB 会话。要在有 Parallel Computing Toolbox 时使用本地 MATLAB 会话运行示例,请使用 mapreducer 函数更改全局执行环境。

mapreducer(0)

创建一个 tall 矩阵 A,其中包含来自 airlinesmall 数据集且存储在 varnames 中的变量子集。有关从 tall 数组提取数据的步骤的详细信息,请参阅给定百分比的 tall 向量的百分位数

varnames = ["ArrDelay","ArrTime","DepTime","ActualElapsedTime"];
ds = datastore("airlinesmall.csv","TreatAsMissing","NA", ...
    "SelectedVariableNames",varnames);
tt = tall(ds);
A = tt{:,varnames}
A =

  M×4 tall double matrix

           8         735         642          53
           8        1124        1021          63
          21        2218        2055          83
          13        1431        1332          59
           4         746         629          77
          59        1547        1446          61
           3        1052         928          84
          11        1134         859         155
          :          :            :           :
          :          :            :           :

当沿非 1 的维度运算时,prctile 函数仅计算精确百分位数,以便它能够使用基于排序的算法(请参阅算法)高效计算,而不是使用基于 T-Digest 的逼近算法。

计算 A 沿第二个维度的第 25 个、第 50 个和第 75 个精确百分位数。

p = [25 50 75];
Pexact = prctile(A,p,2)
Pexact =

  M×N×... tall array

    ?    ?    ?    ...
    ?    ?    ?    ...
    ?    ?    ?    ...
    :    :    :
    :    :    :

Preview deferred. Learn more.

当函数沿第一个维度运算且 p 是百分比向量时,您必须使用基于 T-digest 的逼近算法计算百分位数。如果使用基于排序的算法计算 tall 数组第一个维度的百分位数,计算量会很大。

计算 A 沿第一个维度的第 25 个、第 50 个和第 75 个近似百分位数。由于默认维度是 1,因此无需为 dim 指定值。

Papprox = prctile(A,p,Method="approximate")
Papprox =

  M×N×... tall array

    ?    ?    ?    ...
    ?    ?    ?    ...
    ?    ?    ?    ...
    :    :    :
    :    :    :

Preview deferred. Learn more.

使用 gather 计算 tall 数组并将结果传入内存中。

[Pexact,Papprox] = gather(Pexact,Papprox);
Evaluating tall expression using the Local MATLAB Session:
- Pass 1 of 1: Completed in 1.4 sec
Evaluation completed in 1.9 sec

显示 A 沿第二个维度的第 25 个、第 50 个和第 75 个精确百分位数的前五行。

Pexact(1:5,:)
ans = 5×3
103 ×

    0.0305    0.3475    0.6885
    0.0355    0.5420    1.0725
    0.0520    1.0690    2.1365
    0.0360    0.6955    1.3815
    0.0405    0.3530    0.6875

矩阵 Pexact 的每行包含 A 中对应行的三个百分位数。30.5347.5688.5 分别是 A 中第一行的第 25 个、第 50 个和第 75 个百分位数。

显示 A 沿第一个维度的第 25 个、第 50 个和第 75 个近似百分位数。

Papprox
Papprox = 3×4
103 ×

   -0.0070    1.1149    0.9322    0.0700
         0    1.5220    1.3350    0.1020
    0.0110    1.9180    1.7400    0.1510

矩阵 Papprox 的每列包含 A 中对应列的三个百分位数。Papprox 的第一列包含 A 的第一列的百分位数。

输入参数

全部折叠

输入数组,指定为向量、矩阵或多维数组。

数据类型: double | single | duration

要计算其百分位数的百分比,指定为 0 到 100 之间的标量或标量向量。

示例: 25

示例: [25, 50, 75]

数据类型: double | single

沿其运算的维度,指定为正整数标量。如果不指定维度,则默认值是大小不等于 1 的第一个数组维度。

以输入矩阵 A 和由百分比 p 组成的向量为例:

  • P = prctile(A,p,1) 计算 A 中各列在百分比 p 的百分位数。

  • P = prctile(A,p,2) 计算 A 中各行在百分比 p 的百分位数。

维度 dim 指示 P 中与 p 长度相同的维度。

数据类型: double | single | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64

要沿其运算的维度组成的向量,指定为正整数向量。每个元素代表输入数据的一个维度。

输出 P 在最小指定运算维度中的大小等于 p 的长度。Pvecdim 中指定的其他运算维度中的大小为 1。Pvecdim 中未指定的所有维度中的大小保持与输入数据相同。

假设有一个 2×3×3 输入数组 A 和百分比 pprctile(A,p,[1 2]) 将返回一个 length(p)×1×3 数组,因为 1 和 2 是运算维度且 min([1 2]) = 1。返回的数组的每页包含 A 的对应页中元素的百分位数。

数据类型: double | single | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64

计算百分位数的方法,指定为以下值之一:

  • "midpoint" - 通过使用排序的中点算法计算百分位数。

    在 R2025a 之前的版本中: 对此方法使用 "exact"

  • "inclusive" - 通过使用排序的算法计算百分位数,该算法将第 0 个和第 100 个百分位数包含在数据边界内。 (自 R2025a 起)

  • "exclusive" - 通过使用排序的算法计算百分位数,该算法将第 0 个和第 100 个百分位数排除在数据边界外。 (自 R2025a 起)

  • "approximate" - 通过使用 T-Digest 的算法计算近似百分位数(适用于 doublesingle 输入数组)。

有关百分位数计算的详细信息,请参阅算法

详细信息

全部折叠

算法

对于 n 元素向量 A,当您选择除 "approximate" 之外的任何方法时,prctile 函数使用基于排序的算法计算百分位数。

  1. A 中的排序元素根据选定方法映射到百分位数,如下表中所述。

    百分位数Method

    "midpoint"

    在 R2025a 之前的版本中: "exact"

    "inclusive" (自 R2025a 起)

    "exclusive" (自 R2025a 起)

    第一个排序元素的百分位数50/n0100/(n+1)
    第二个排序元素的百分位数150/n100/(n−1)200/(n+1)
    第三个排序元素的百分位数250/n200/(n−1)300/(n+1)
    ............
    k 个排序元素的百分位数50(2k−1)/n100(k−1)/(n−1)100k/(n+1)
    ............
    第 (n−1) 个排序元素的百分位数50(2n−3)/n100(n−2)/(n−1)100(n−1)/(n+1)
    n 个排序元素的百分位数50(2n−1)/n100100n/(n+1)

    例如,如果 A[6 3 2 10 1],则百分位数如下表所示。

    百分位数Method

    "midpoint"

    在 R2025a 之前的版本中: "exact"

    "inclusive" (自 R2025a 起)

    "exclusive" (自 R2025a 起)

    1 的百分位数10050/3
    2 的百分位数3025100/3
    3 的百分位数505050
    6 的百分位数7075200/3
    10 的百分位数90100250/3

  2. prctile 函数使用线性插值计算 A 的第一个和最后一个排序元素之间的百分比的百分位数。有关详细信息,请参阅线性插值

    例如,如果 A[6 3 2 10 1],则:

    • 对于中点方法,第 40 个百分位数是 2.5

      在 R2025a 之前的版本中: 对于精确方法,第 40 个百分位数是 2.5

    • 对于包含方法,第 40 个百分位数是 2.6 (自 R2025a 起)

    • 对于排除方法,第 40 个百分位数是 2.4 (自 R2025a 起)

  3. prctile 函数将 A 中元素的最小值或最大值赋给该范围之外的百分比对应的百分位数。

    例如,如果 A[6 3 2 10 1],则对于中点方法和排除方法,第 5 个百分位数是 1 (自 R2025a 起)

    在 R2025a 之前的版本中: 例如,如果 A[6 3 2 10 1],则对于精确方法,第 5 个百分位数是 1

prctile 函数将 NaN 值视为缺失值并将其删除。

参考

[1] Langford, E. “Quartiles in Elementary Statistics”, Journal of Statistics Education. Vol. 14, No. 3, 2006.

[2] Dunning, T., and O. Ertl. “Computing Extremely Accurate Quantiles Using T-Digests.” August 2017.

扩展功能

全部展开

版本历史记录

在 R2006a 之前推出

全部展开

另请参阅

| |