Main Content

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

rmoutliers

检测并删除数据中的离群值

说明

示例

B = rmoutliers(A)A 的数据中检测并删除离群值。

  • 如果 A 是矩阵,则 rmoutliers 会分别检测 A 的每列中的离群值,并删除整行。

  • 如果 A 是表或时间表,则 rmoutliers 会分别检测 A 的每个变量中的离群值并删除整行。

默认情况下,离群值是指与中位数相差超过三倍经过换算的中位数绝对偏差 (MAD) 的值。

示例

B = rmoutliers(A,method) 指定检测离群值的方法。例如,rmoutliers(A,"mean")A 中与均值相差超过三倍标准差的元素定义为离群值。

B = rmoutliers(A,"percentiles",threshold) 将离群值定义为 threshold 所指定的百分位数以外的点。threshold 参数是包含上下百分位数阈值的二元素行向量,例如 [10 90]

示例

B = rmoutliers(A,movmethod,window) 使用窗长度为 window 的移动窗均值或中位数来检测局部离群值。例如,rmoutliers(A,"movmean",5) 将一个包含五个元素的窗口中与局部均值相差超过三倍局部标准差的元素定义为离群值。

示例

B = rmoutliers(___,dim) 指定 A 中要删除离群值的维度,当使用任何上述语法检测到离群值时,将删除该维度上的条目。例如,rmoutliers(A,2) 删除矩阵 A 的列而不是行。

示例

B = rmoutliers(___,Name,Value) 使用一个或多个名称-值参数指定用来检测和删除离群值的其他参数。例如,rmoutliers(A,"SamplePoints",t) 相对于时间向量 t 中的对应元素检测 A 中的离群值。

示例

[B,TFrm] = rmoutliers(___) 还返回一个逻辑向量 TFrm,用来指示从 A 中删除的行或列。

示例

[B,TFrm,TFoutlier] = rmoutliers(___) 还返回一个逻辑数组 TFoutlier,用来指示从 A 中删除的离群值的位置。

示例

[B,TFrm,TFoutlier,L,U,C] = rmoutliers(___) 还返回离群值检测方法使用的下阈值 L、上阈值 U 和中心值 C

示例

全部折叠

创建一个包含两个离群值的向量,然后删除这些离群值。

A = [57 59 60 100 59 58 57 58 300 61 62 60 62 58 57];
B = rmoutliers(A)
B = 1×13

    57    59    60    59    58    57    58    61    62    60    62    58    57

使用均值检测方法识别数据时间表中的潜在离群值,删除任何离群值,并可视化清洗后的数据。

创建一个数据时间表,并可视化数据以检测潜在的离群值。

T = hours(1:15);
V = [57 59 60 100 59 58 57 58 300 61 62 60 62 58 57];
A = timetable(T',V');
plot(A.Time,A.Var1)

Figure contains an axes object. The axes object contains an object of type line.

删除数据中的离群值,其中离群值定义为偏离均值超过三倍标准差的值。

B = rmoutliers(A,"mean")
B=14×1 timetable
    Time     Var1
    _____    ____

    1 hr      57 
    2 hr      59 
    3 hr      60 
    4 hr     100 
    5 hr      59 
    6 hr      58 
    7 hr      57 
    8 hr      58 
    10 hr     61 
    11 hr     62 
    12 hr     60 
    13 hr     62 
    14 hr     58 
    15 hr     57 

在同一个图中,绘制原始数据和删除了离群值的数据。

hold on
plot(B.Time,B.Var1,"o-")
legend("Original Data","Cleaned Data")

Figure contains an axes object. The axes object contains 2 objects of type line. These objects represent Original Data, Cleaned Data.

使用移动中位数在对应于某时间向量的正弦波中检测并删除局部离群值。

创建包含一个局部离群值的数据向量。

x = -2*pi:0.1:2*pi;
A = sin(x);
A(47) = 0;

创建与 A 中的数据对应的时间向量。

t = datetime(2017,1,1,0,0,0) + hours(0:length(x)-1);

将离群值定义为滑动窗内与局部中位数相差超过三倍局部换算 MAD 的点。查找离群值在 A 中的位置(相对于 t 中的点,窗口大小为 5 个小时),并删除这些离群值。

[B,TFrm] = rmoutliers(A,"movmedian",hours(5),"SamplePoints",t);

绘制原始数据和删除离群值后的数据。

plot(t,A)
hold on
plot(t(~TFrm),B,"o-")
legend("Original Data","Cleaned Data")

Figure contains an axes object. The axes object contains 2 objects of type line. These objects represent Original Data, Cleaned Data.

从数据矩阵中删除离群值,并检查删除的列和离群值。

创建一个包含两个离群值的矩阵。

A = magic(5);
A(4,4) = 200;
A(5,5) = 300;
A
A = 5×5

    17    24     1     8    15
    23     5     7    14    16
     4     6    13    20    22
    10    12    19   200     3
    11    18    25     2   300

通过将要删除的维度指定为 2 来删除包含离群值的列。返回逻辑输出向量 TFrm 以标识 A 中的哪些列被删除,并返回逻辑输出数组 TFoutlier 以标识 A 中离群值的位置。

[B,TFrm,TFoutlier] = rmoutliers(A,2)
B = 5×3

    17    24     1
    23     5     7
     4     6    13
    10    12    19
    11    18    25

TFrm = 1x5 logical array

   0   0   0   1   1

TFoutlier = 5x5 logical array

   0   0   0   0   0
   0   0   0   0   0
   0   0   0   0   0
   0   0   0   1   0
   0   0   0   0   1

查找 A 中已删除列的值。

rmCol = A(:,TFrm)
rmCol = 5×2

     8    15
    14    16
    20    22
   200     3
     2   300

查找 A 中被视为离群值的值。

rmVal = A(TFoutlier)
rmVal = 2×1

   200
   300

创建一个包含两个离群值的向量,并检测这些离群值的位置。

A = [57 59 60 100 59 58 57 58 300 61 62 60 62 58 57];
detect = isoutlier(A)
detect = 1x15 logical array

   0   0   0   1   0   0   0   0   1   0   0   0   0   0   0

移除离群值。不使用检测方法,而是提供由 isoutlier 检测到的离群值位置。

B = rmoutliers(A,"OutlierLocations",detect)
B = 1×13

    57    59    60    59    58    57    58    61    62    60    62    58    57

从数据向量中删除离群值,并可视化清洗后的数据。

创建一个包含离群值的数据向量。

A = [60 59 49 49 58 100 61 57 48 58];

使用默认检测方法 "median" 删除离群值。

[B,TFrm,TFoutlier,L,U,C] = rmoutliers(A);

绘制原始数据、删除了离群值的数据以及由检测方法确定的阈值和中心值。中心值是数据的中位数,上阈值和下阈值分别高于和低于中位数三倍换算 MAD。

plot(A)
hold on
plot(find(~TFrm),B,"o-")
yline([L U C],":",["Lower Threshold","Upper Threshold","Center Value"])
legend("Original Data","Cleaned Data")

Figure contains an axes object. The axes object contains 5 objects of type line, constantline. These objects represent Original Data, Cleaned Data.

输入参数

全部折叠

输入数据,指定为向量、矩阵、表或时间表。

  • 如果 A 是一个表,则其变量的类型必须为 doublesingle,您也可以使用 DataVariables 参数显式列出 doublesingle 变量。当您使用的表中包含 doublesingle 数据类型之外的变量时,指定变量很有用。

  • 如果 A 是一个时间表,则 rmoutliers 仅对表元素进行运算。如果行时间用作采样点,则它们必须唯一,并按升序排列。

数据类型: double | single | table | timetable

检测离群值的方法,指定为以下值之一。

方法描述
"median"离群值定义为与中位数相差超过三倍换算 MAD 的元素。换算 MAD 定义为 c*median(abs(A-median(A))),其中 c=-1/(sqrt(2)*erfcinv(3/2))
"mean"离群值定义为与均值相差超过三倍标准差的元素。此方法比 "median" 快,但没有它可靠。
"quartiles"离群值定义为比上四分位数 (75%) 大 1.5 个四分位差以上或比下四分位数 (25%) 小 1.5 个四分位差以上的元素。当 A 中的数据不是正态分布时,此方法很有用。
"grubbs"使用针对离群值的 Grubbs 检验检测离群值,即基于假设检验每次迭代删除一个离群值。此方法假设 A 中的数据呈正态分布。
"gesd"使用广义极端 Student 化偏差检验检测离群值。此迭代方法与 "grubbs" 类似,但当有多个离群值互相遮盖时,此方法的执行效果更好。

百分位数阈值,指定为元素在区间 [0, 100] 内的二元素行向量。第一个元素表示下百分位数阈值,第二个元素表示上百分位数阈值。threshold 的第一个元素必须小于第二个元素。

例如,[10 90] 阈值将离群值定义为低于第 10 个百分位数或高于第 90 个百分位数的点。

用来检测离群值的移窗法,指定为下列方法之一。

方法描述
"movmedian"离群值定义为在 window 指定的窗口长度内,与局部中位数相差超过三倍局部换算 MAD 的元素。此方法也称为 汉佩尔滤波器
"movmean"离群值定义为在 window 指定的窗口长度内,与局部均值相差超过三倍局部标准差的元素。

窗长度,指定为正整数标量、由正整数组成的二元素向量、正持续时间标量或由正持续时间组成的二元素向量。

如果 window 是正整数标量,则窗口以当前元素为中心并且包含 window-1 个相邻元素。如果 window 是偶数,则窗口以当前元素和上一个元素为中心。

如果 window 是由正整数组成的二元素向量 [b f],则窗口包含当前元素、其之前的 b 个元素和之后的 f 个元素。

A 是时间表或者 SamplePoints 被指定为 datetimeduration 向量时,window 的类型必须是 duration,而且将会基于样本点来计算窗口。

要删除的维度,指定为 1 或 2。默认情况下,rmoutliers 会删除每个包含(检测到的)离群值的行。要删除每个包含(检测到的)离群值的矩阵列或表变量,请将维度指定为 2。

名称-值参数

将可选的参数对组指定为 Name1=Value1,...,NameN=ValueN,其中 Name 是参数名称,Value 是对应的值。名称-值参数必须出现在其他参数之后,但参数对组的顺序无关紧要。

示例: rmoutliers(A,ThresholdFactor=4)

在 R2021a 之前,使用逗号分隔每个名称和值,并用引号将 Name 引起来。

示例: rmoutliers(A,"ThresholdFactor",4)

数据选项

全部折叠

采样点,指定为由采样点值组成的向量或下表中的选项之一(当输入数据为表时)。样本点代表数据的 x 轴位置,必须为有序且包含唯一的元素。样本点不需要均匀采样。向量 [1 2 3 ...] 是默认值。

当输入数据是表时,可以使用以下选项之一将采样点指定为表变量。

索引方案示例

变量名称:

  • 字符串标量或字符向量

  • "A"'A' - 名为 A 的变量

变量索引:

  • 引用变量在表中位置的索引编号

  • 逻辑向量。通常,此向量的长度与变量的数目相同,但可以省略尾部的 0false

  • 3 - 表中的第三个变量

  • [false false true] - 第三个变量

函数句柄:

  • 函数句柄,以表变量作为输入并返回逻辑标量

  • @isnumeric - 一个包含数值的变量

变量类型:

  • vartype 下标,用于选择一个指定类型的变量

  • vartype("numeric") - 一个包含数值的变量

注意

当输入数据为 timetable 时,不支持此名称-值参数。时间表使用行时间向量作为采样点。要使用不同采样点,您必须编辑时间表,以便行时间包含所需的采样点。

移动窗基于样本点进行定义。例如,如果 t 是与输入数据对应的时间向量,则 rmoutliers(rand(1,10),"movmean",3,"SamplePoints",t) 将有一个代表 t(i)-1.5t(i)+1.5 之间时间间隔的窗。

当样本点向量的数据类型为 datetimeduration 时,移动窗长度的类型必须为 duration

示例: rmoutliers(A,"SamplePoints",0:0.1:10)

示例: rmoutliers(T,"SamplePoints","Var1")

数据类型: single | double | datetime | duration

要对其进行操作的表变量,指定为下表中的选项之一。DataVariables 值指示要检查输入表中的哪些变量具有离群值。与指示的变量关联的数据类型必须为 doublesingle

表中未由 DataVariables 指定的其他变量将传递给输出,而不检查离群值。

A 的行执行运算时,rmoutliers 将删除在与指定的变量对应的列中包含离群值的所有行。对 A 的列执行运算时,rmoutliers 将从表中删除指定的变量。

索引方案示例

变量名称:

  • 字符串、字符向量或元胞数组

  • pattern 对象

  • "A"'A' - 名为 A 的变量

  • ["A","B"]{'A','B'} - 两个名为 AB 的变量

  • "Var"+digitsPattern(1) - 变量名为 "Var" 后跟一个数字

变量索引:

  • 引用变量在表中位置的索引编号

  • 由数字组成的向量

  • 逻辑向量。通常,此向量的长度与变量的数目相同,但可以省略尾部的 0false

  • 3 - 表中的第三个变量

  • [2 3] - 表中的第二个和第三个变量

  • [false false true] - 第三个变量

函数句柄:

  • 函数句柄,以表变量作为输入并返回逻辑标量

  • @isnumeric - 所有包含数值的变量

变量类型:

  • vartype 下标,用于选择指定类型的变量

  • vartype("numeric") - 所有包含数值的变量

示例: rmoutliers(T,"DataVariables",["Var1" "Var2" "Var4"])

离群值检测选项

全部折叠

检测阈值因子,指定为非负标量。

对于方法 "median""movmedian",检测阈值因子将代替换算 MAD 的倍数(默认为 3)。

对于方法 "mean""movmean",检测阈值因子将取代与均值相差的标准差个数(默认为 3)。

对于方法 "grubbs""gesd",检测阈值因子是 0 到 1 范围内的一个标量。值接近 0 会得到较少数目的离群值,值接近 1 则会得到较多数目的离群值。默认的检测阈值因子为 0.05。

对于 "quartiles" 方法,检测阈值因子将代替四分差的默认倍数(默认为 1.5)。

当指定的方法是 "percentiles" 时,不支持此名称-值对组。

已知的离群值指示符,指定为与 A 大小相同的逻辑向量或矩阵。已知的离群值指示符元素可以是数值或逻辑值 1 (true) 以指示在 A 的对应位置中的离群值,或是 0 (false) 以指示非离群值。当您指定 OutlierLocations 时,rmoutliers 将不再使用离群值检测方法。而是会用已知离群值指示符中的元素来定义离群值。输出 TFoutlier 包含相同的逻辑向量或矩阵。

如果指定了 method,则不能再指定 OutlierLocations 名称-值参数。

数据类型: logical

GESD 检测到的最大离群值,指定为正整数标量。MaxNumOutliers 值指定 "gesd" 方法检测到的离群值的最大数目。例如,rmoutliers(A,"gesd","MaxNumOutliers",5) 最多检测到五个离群值。

MaxNumOutliers 的默认值是最接近 A 中的元素数的 10% 的整数。为离群值数上限设置较大的值,可以更可能检测到所有离群值,但代价是降低计算效率。

"gesd" 方法假定非离群值输入数据是从近似正态分布采样的。如果数据不是以这种方式采样的,则检测的离群值数量可能会超过 MaxNumOutliers 值。

满足删除条件的最小离群值数目,指定为正整数标量。MinNumOutliers 值指定删除行或列所需的最小离群值数。例如,当检测到某一行中有 3 个或更多离群值时,rmoutliers(A,"MinNumOutliers",3) 会删除矩阵 A 的这一行。

输出参数

全部折叠

已删除离群值的数据,以向量、矩阵、表或时间表的形式返回。B 的大小取决于删除的行数或列数。

已删除数据的指示符,以逻辑向量形式返回。值为 1 (true) 的元素对应于 A 中删除的行或列。值为 0 (false) 的元素对应于未更改的行或列。TFrm 的方向和大小取决于 A 和操作的维度。

数据类型: logical

离群值指示符,以逻辑向量或矩阵形式返回。值为 1 (true) 的元素对应于 A 中离群值的位置。值为 0 (false) 的元素对应于非离群值。

TFoutlier 的大小与 A 相同。

数据类型: logical

自 R2022b 起

离群值检测方法使用的下阈值,以标量、向量、矩阵、表或时间表形式返回。例如,默认离群值检测方法的下阈值是比输入数据的中位数小三倍换算 MAD 的值。

如果使用 method 进行离群值检测,则除了在运算维度上的长度为 1 外,L 在其他所有维度上的大小均与 A 相同。如果使用 movmethod,则 L 的大小与 A 相同。

自 R2022b 起

离群值检测方法使用的上阈值,以标量、向量、矩阵、表或时间表形式返回。例如,默认离群值检测方法的上阈值是比输入数据的中位数大三倍换算 MAD 的值。

如果使用 method 进行离群值检测,则除了在运算维度上的长度为 1 外,U 在其他所有维度上的大小均与 A 相同。如果使用 movmethod,则 U 的大小与 A 相同。

自 R2022b 起

离群值检测方法使用的中心值,以标量、向量、矩阵、表或时间表形式返回。例如,默认离群值检测方法的中心值是输入数据的中位数。

如果使用 method 进行离群值检测,则除了在运算维度上的长度为 1 外,C 在其他所有维度上的大小均与 A 相同。如果使用 movmethod,则 C 的大小与 A 相同。

扩展功能

版本历史记录

在 R2018b 中推出

全部展开