Main Content

本页的翻译已过时。点击此处可查看最新英文版本。

rmoutliers

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

说明

示例

B = rmoutliers(A) 检测并删除向量、矩阵、表或时间表的数据中的离群值。

  • 如果 A 是行向量或列向量,rmoutliers 会检测离群值并将其删除。

  • 如果 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) 指定根据指定的窗口检测局部离群值的移动方法。例如,rmoutliers(A,'movmean',5) 将包含五个元素的窗口中与局部均值相差超过三倍局部标准差的元素定义为离群值。

示例

B = rmoutliers(___,dim) 在上述任何语法的基础上沿 A 的维度 dim 删除离群值。例如,rmoutliers(A,2) 删除矩阵 A 的列而不是行。

示例

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

示例

[B,TF] = rmoutliers(___) 还返回与 A 中被删除的行或列对应的逻辑向量。

示例

全部折叠

创建一个包含两个离群值的向量,然后删除这些离群值。TF 可帮助您标识输入向量中被检测为离群值并删除的元素。

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

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

TF = 1x15 logical array

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

A(TF)
ans = 1×2

   100   300

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

A = [57 59 60 100 59 58 57 58 300 61 62 60 62 58 57];
[B,TF] = rmoutliers(A,'mean')
B = 1×14

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

TF = 1x15 logical array

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

A(TF)
ans = 300

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

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,TF] = rmoutliers(A,'movmedian',hours(5),'SamplePoints',t);

绘制输入数据和删除离群值后的数据。

plot(t,A,'b.-',t(~TF),B,'r-')
legend('Input Data','Output Data')

Figure contains an axes. The axes contains 2 objects of type line. These objects represent Input Data, Output Data.

创建一个包含两个离群值的矩阵,并删除包含这些离群值的列。

A = magic(5);
A(4,4) = 500;
A(5,5) = 500;
A
A = 5×5

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

B = rmoutliers(A,2)
B = 5×3

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

输入参数

全部折叠

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

数据类型: double | single

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

方法说明
'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] 内的二元素行向量。第一个元素表示下百分位数阈值,第二个元素表示上百分位数阈值。例如,[10 90] 阈值将离群值定义为低于第 10 个百分位数或高于第 90 个百分位数的点。threshold 的第一个元素必须小于第二个元素。

用来确定离群值的移动方法,指定为下列值之一:

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

窗口长度,指定为标量或二元素向量。

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

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

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

运算维度,指定为 1 或 2。默认情况下,rmoutliers 沿其大小不为 1 的第一个维度进行运算。

名称-值对组参数

指定可选的、以逗号分隔的 Name,Value 对组参数。Name 为参数名称,Value 为对应的值。Name 必须放在引号中。您可采用任意顺序指定多个名称-值对组参数,如 Name1,Value1,...,NameN,ValueN 所示。

示例: rmoutliers(A,'ThresholdFactor',4)
数据选项

全部折叠

样本点,指定为逗号分隔的对组,其中包含 'SamplePoints' 和一个向量。样本点代表数据在 A 中的 x 轴位置,必须为有序且包含唯一的元素。样本点不需要均匀采样。默认采样点向量是 [1 2 3 ...]

注意

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

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

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

示例: rmoutliers(T,'SamplePoints',0:0.1:10)

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

要对其执行操作的表变量,指定为逗号分隔的对组,其中包含 'DataVariables' 和下表中的选项之一。'DataVariables' 值指示要检查输入表中的哪些变量具有离群值。表中未由 'DataVariables' 指定的其他变量将传递给输出,而不检查离群值。对 A 的行执行运算时,rmoutliers 将删除在与指定的变量对应的列中包含离群值的所有行。对 A 的列执行运算时,rmoutliers 将从表中删除指定的变量。

选项说明示例
变量名称

指定单个表变量名称的字符向量或标量字符串

'Var1'

"Var1"

变量名称的向量

字符向量元胞数组或字符串数组,其中每个元素表示一个表变量名称

{'Var1' 'Var2'}

["Var1" "Var2"]

变量索引的标量或向量

表变量索引的标量或向量

1

[1 3 5]

逻辑向量

逻辑向量,每个元素分别对应一个表变量,其中 true 指示包括对应变量,false 指示不包括对应变量。

[true false true]

函数句柄

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

@isnumeric

vartype 下标

vartype 函数生成的表下标

vartype('numeric')

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

离群值检测选项

全部折叠

检测阈值系数,指定为以逗号分隔的对组,其中包含 'ThresholdFactor' 和一个非负标量。

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

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

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

对于 'quartile' 方法,检测阈值系数将代替四分差的默认倍数(默认为 1.5)。

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

离群值数上限,仅适用于 'gesd' 方法,指定为逗号分隔的对组,其中包含 'MaxNumOutliers' 和一个正标量。'MaxNumOutliers' 值指定 'gesd' 方法返回的离群值的最大数目。例如,rmoutliers(A,'MaxNumOutliers',5) 最多返回五个离群值。

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

最小离群值计数,以逗号分隔的对组形式指定,其中包含 'MinNumOutliers' 和一个正标量。'MinNumOutliers' 值指定删除行或列所需的最小离群值数。例如,当检测到某一列中有 3 个或更多离群值时,rmoutliers(A,'MinNumOutliers',3) 会删除矩阵 A 的这一列。

输出参数

全部折叠

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

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

扩展功能

在 R2018b 中推出