Main Content

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

filloutliers

检测并替换数据中的离群值

说明

B = filloutliers(A,fillmethod) 查找 A 中的离群值并根据 fillmethod 替换它们。例如,filloutliers(A,"previous") 将离群值替换为上一个非离群值元素。

  • 如果 A 是矩阵,则 filloutliers 分别对 A 的每列进行运算。

  • 如果 A 是多维数组,则 filloutliers 沿 A 的大小不等于 1 的第一个维度进行运算。

  • 如果 A 是表或时间表,则 filloutliers 分别对 A 的每个变量进行运算。

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

您可以通过将清洗离群数据任务添加到实时脚本中,以交互方式使用 filloutliers 功能。

示例

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

示例

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

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

示例

B = filloutliers(___,dim) 为上述任一语法指定 A 的运算维度。例如,filloutliers(A,"linear",2) 沿矩阵 A 的每一行运算。

示例

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

示例

[B,TF]= filloutliers(___) 还返回一个逻辑数组 TF,该数组指示 B 中先前为离群值的填充元素的位置。

示例

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

示例

示例

全部折叠

使用 "linear" 方法填充数据向量中的离群值,并可视化填充的数据。

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

A = [57 59 60 100 59 58 57 58 300 61 62 60 62 58 57];

使用线性插值替换离群值。

B = filloutliers(A,"linear");

绘制原始数据和填充了离群值的数据。

plot(A)
hold on
plot(B,"o-")
legend("Original Data","Filled Data")

识别数据表中的潜在离群值,使用 "nearest" 填充方法填充任何离群值,并可视化清洗后的数据。

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

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)

填充数据中的离群值,其中离群值定义为偏离均值超过三倍标准差的值。将离群值替换为最接近的非离群值元素。

B = filloutliers(A,"nearest","mean")
B=15×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 
    9 hr      61 
    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","Filled 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 小时。使用 "clip" 方法,用计算的阈值填充离群值。

[B,TF,L,U,C] = filloutliers(A,"clip","movmedian",hours(5),"SamplePoints",t);

绘制原始数据和填充了离群值的数据。

plot(t,A)
hold on
plot(t,B,"o-")
legend("Original Data","Filled Data")

创建一个数据矩阵,其对角线上包含离群值。

A = randn(5,5) + diag(1000*ones(1,5))
A = 5×5
103 ×

    1.0005   -0.0013   -0.0013   -0.0002    0.0007
    0.0018    0.9996    0.0030   -0.0001   -0.0012
   -0.0023    0.0003    1.0007    0.0015    0.0007
    0.0009    0.0036   -0.0001    1.0014    0.0016
    0.0003    0.0028    0.0007    0.0014    1.0005

基于每一行中的数据用零填充替换离群值,然后显示新值。

[B,TF] = filloutliers(A,0,2);
B
B = 5×5

         0   -1.3077   -1.3499   -0.2050    0.6715
    1.8339         0    3.0349   -0.1241   -1.2075
   -2.2588    0.3426         0    1.4897    0.7172
    0.8622    3.5784   -0.0631         0    1.6302
    0.3188    2.7694    0.7147    1.4172         0

您可以使用 TF 作为索引向量,访问检测到的离群值及其填充的值。

[A(TF) B(TF)]
ans = 5×2
103 ×

    1.0005         0
    0.9996         0
    1.0007         0
    1.0014         0
    1.0005         0

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

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

使用 "nearest" 方法填充离群值。不使用检测方法,而是提供由 isoutlier 检测到的离群值位置。

B = filloutliers(A,"nearest","OutlierLocations",detect)
B = 1×15

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

使用 "clip" 填充方法替换数据向量中的离群值。

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

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

使用默认方法 "median" 检测离群值,使用 "clip" 填充方法用上阈值替换该离群值。

[B,TF,L,U,C] = filloutliers(A,"clip");

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

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

自 R2024a 起

创建一个表并填充离群值,离群值定义为大于 10 的值。创建一个逻辑变量表 loc,该表指示要填充的离群值的位置。然后,使用 OutlierLocations 名称-值参量指定 filloutliers 的已知离群值位置。

A = [1; 4; 9; 12; 3];
B = [9; 0; 6; 2; 1];
C = [14; 4; 2; 3; 8];
T = table(A,B,C)
T=5×3 table
    A     B    C 
    __    _    __

     1    9    14
     4    0     4
     9    6     2
    12    2     3
     3    1     8

loc = T>10
loc=5×3 table
      A        B        C  
    _____    _____    _____

    false    false    true 
    false    false    false
    false    false    false
    true     false    false
    false    false    false

T = filloutliers(T,10,OutlierLocations=loc)
T=5×3 table
    A     B    C 
    __    _    __

     1    9    10
     4    0     4
     9    6     2
    10    2     3
     3    1     8

输入参数

全部折叠

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

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

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

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

替换离群值的填充方法,指定为以下值之一。

填充方法描述
数值标量指定的标量值
"center"findmethod 确定的中心值
"clip"对于比 findmethod 确定的下阈值还小的元素,指定为下阈值;对于比 findmethod 确定的上阈值还大的元素,指定为上阈值
"previous"上一个非离群值
"next"下一个非离群值
"nearest"最邻近的非离群值
"linear"基于相邻的非离群值进行线性插值
"spline"分段三次样条插值
"pchip"保形分段三次样条插值
"makima"修正 Akima 三次 Hermite 插值(仅限数值、durationdatetime 数据类型)

数据类型: double | single | char | string

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

方法描述
"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"使用格拉布斯检验检测离群值,并基于假设检验每次迭代删除一个离群值。此方法假设 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 的第一个数组维度。

以一个 m×n 输入矩阵 A 为例:

  • filloutliers(A,fillmethod,1) 根据 A 的每列中的数据填充离群值,并返回一个 m×n 矩阵。

    filloutliers(A,fillmethod,1) column-wise operation

  • filloutliers(A,fillmethod,2) 根据 A 的每行中的数据填充离群值,并返回一个 m×n 矩阵。

    filloutliers(A,fillmethod,2) row-wise operation

对于表或时间表输入数据,不支持 dim,并且分别对每个表或时间表变量进行运算。

名称-值参数

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

示例: filloutliers(A,"center","mean",ThresholdFactor=4)

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

示例: filloutliers(A,"center","mean","ThresholdFactor",4)

数据选项

全部折叠

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

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

索引方案示例

变量名称:

  • 字符串标量或字符向量

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

变量索引:

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

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

  • 3 - 表中的第三个变量

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

函数句柄:

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

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

变量类型:

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

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

注意

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

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

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

示例: filloutliers([1 100 3 4],"nearest","SamplePoints",[1 2.5 3 4])

示例: filloutliers(T,"nearest","SamplePoints","Var1")

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

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

表中未由 DataVariables 指定的其他变量会传递给输出,而不会对其进行填充。

索引方案示例

变量名称:

  • 字符串或字符向量

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

  • pattern 对象

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

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

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

变量索引:

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

  • 由数字组成的向量

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

  • 3 - 表中的第三个变量

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

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

函数句柄:

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

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

变量类型:

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

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

示例: filloutliers(A,"previous","DataVariables",["Var1" "Var2" "Var4"])

替换值指示符,当 A 是表或时间表时,指定为以下逻辑值或数值之一:

  • true1 - 用填充的表变量替换包含离群值的输入表变量。

  • false0 - 向输入表追加已检查过离群值的所有表变量。追加的变量中已填充了离群值。

对于向量、矩阵或多维数组输入数据,不支持 ReplaceValues

示例: filloutliers(T,"previous","ReplaceValues",false)

离群值检测选项

全部折叠

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

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

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

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

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

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

GESD 填充的最大离群值数,指定为正整数标量。MaxNumOutliers 值指定 "gesd" 方法填充的离群值的最大数目。例如,filloutliers(A,"linear","gesd","MaxNumOutliers",5) 填充的离群值不超过五个。

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

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

已知离群值指示符,指定为逻辑向量、矩阵或多维数组,或具有逻辑变量的表或时间表 (自 R2024a 起)

如果 OutlierLocations 是数组,其大小必须与 A 相同。如果 OutlierLocations 是表或时间表,它必须包含与要对其进行操作的输入表变量的大小和名称相同的逻辑变量。

值为 1 (true) 的元素表示 A 中离群值的位置。值为 0 (false) 的元素表示非离群值。当您指定 OutlierLocations 时,filloutliers 将不再使用离群值检测方法。而是会用已知离群值指示符中的元素来定义离群值。

如果指定 findmethod,则无法指定 OutlierLocations

数据类型: logical

输出参量

全部折叠

填充的数据,以向量、矩阵、多维数组、表或时间表形式返回。

除非 ReplaceValues 的值为 false,否则 BA 的大小相同。如果 ReplaceValues 的值是 false,则 B 的宽度是输入数据宽度和指定的数据变量数目之和。

填充的数据指示符,以逻辑向量、矩阵或多维数组形式返回。值为 1 (true) 的元素对应于 B 中先前为离群值的填充元素。值为 0 (false) 的元素对应于未做更改的元素。

TF 的大小与 B 相同。

数据类型: logical

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

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

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

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

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

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

详细信息

全部折叠

中位数绝对偏差

对于由 N 个标量观测值组成的有限长度向量 A,中位数绝对偏差 (MAD) 定义为

MAD = median(|Aimedian(A)|)

,其中 i = 1,2,...,N

换算 MAD 定义为 c*median(abs(A-median(A))),其中 c=-1/(sqrt(2)*erfcinv(3/2))

替代功能

实时编辑器任务

您可以通过将清洗离群数据任务添加到实时脚本中,以交互方式使用 filloutliers 功能。

Clean Outlier Data task in the Live Editor

参考

[1] NIST/SEMATECH e-Handbook of Statistical Methods, https://www.itl.nist.gov/div898/handbook/, 2013.

扩展功能

版本历史记录

在 R2017a 中推出

全部展开