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(___,Name,Value
)filloutliers(A,"previous","SamplePoints",t)
相对于时间向量 t
中的对应元素检测 A
中的离群值。
示例
在向量中对离群值进行插值
使用 "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
— 输入数据
向量 | 矩阵 | 多维数组 | 表 | 时间表
输入数据,指定为向量、矩阵、多维数组、表或时间表。
如果
A
是一个表,则其变量的类型必须为double
或single
,您也可以使用DataVariables
参量显式列出double
或single
变量。当您使用的表中包含double
和single
数据类型之外的变量时,指定变量很有用。如果
A
是一个时间表,则filloutliers
仅对表元素进行运算。如果行时间用作采样点,则它们必须唯一,并按升序排列。
数据类型: double
| single
| table
| timetable
fillmethod
— 填充方法
数值标量 | "center"
| "clip"
| "previous"
| "next"
| "nearest"
| "linear"
| "spline"
| "pchip"
| "makima"
替换离群值的填充方法,指定为以下值之一。
填充方法 | 描述 |
---|---|
数值标量 | 指定的标量值 |
"center" | 由 findmethod 确定的中心值 |
"clip" | 对于比 findmethod 确定的下阈值还小的元素,指定为下阈值;对于比 findmethod 确定的上阈值还大的元素,指定为上阈值 |
"previous" | 上一个非离群值 |
"next" | 下一个非离群值 |
"nearest" | 最邻近的非离群值 |
"linear" | 基于相邻的非离群值进行线性插值 |
"spline" | 分段三次样条插值 |
"pchip" | 保形分段三次样条插值 |
"makima" | 修正 Akima 三次 Hermite 插值(仅限数值、duration 和 datetime 数据类型) |
数据类型: double
| single
| char
| string
findmethod
— 检测离群值的方法
"median"
(默认) | "mean"
| "quartiles"
| "grubbs"
| "gesd"
检测离群值的方法,指定为以下值之一。
方法 | 描述 |
---|---|
"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" 类似,但当多个离群值互相遮盖时,此方法的执行效果更好。 |
threshold
— 百分位数阈值
二元素行向量
百分位数阈值,指定为元素在区间 [0,100] 内的二元素行向量。第一个元素表示下百分位数阈值,第二个元素表示上百分位数阈值。threshold
的第一个元素必须小于第二个元素。
例如,[10 90]
阈值将离群值定义为低于第 10 个百分位数或高于第 90 个百分位数的点。
movmethod
— 移窗法
"movmedian"
| "movmean"
用来检测离群值的移窗法,指定为下列方法之一。
方法 | 描述 |
---|---|
"movmedian" | 离群值定义为在 window 指定的窗口长度内,与局部中位数相差超过三倍局部换算 MAD 的元素。此方法也称为 汉佩尔滤波器。 |
"movmean" | 离群值定义为在 window 指定的窗口长度内,与局部均值相差超过三倍局部标准差的元素。 |
window
— 窗长度
正整数标量 | 由正整数组成的二元素向量 | 正持续时间标量 | 由正持续时间组成的二元素向量
窗长度,指定为正整数标量、由正整数组成的二元素向量、正持续时间标量或由正持续时间组成的二元素向量。
如果 window
是正整数标量,则窗口以当前元素为中心并且包含 window-1
个相邻元素。如果 window
是偶数,则窗口以当前元素和上一个元素为中心。
如果 window
是由正整数组成的二元素向量 [b f]
,则窗口包含当前元素、其之前的 b
个元素和之后的 f
个元素。
当 A
是时间表或者 SamplePoints
被指定为 datetime
或 duration
向量时,window
的类型必须是 duration
,而且将会基于样本点来计算窗口。
dim
— 运算维度
正整数标量
运算维度,指定为正整数标量。如果未指定值,则默认值是大小不等于 1 的第一个数组维度。
以一个 m
×n
输入矩阵 A
为例:
filloutliers(A,fillmethod,1)
根据A
的每列中的数据填充离群值,并返回一个m
×n
矩阵。filloutliers(A,fillmethod,2)
根据A
的每行中的数据填充离群值,并返回一个m
×n
矩阵。
对于表或时间表输入数据,不支持 dim
,并且分别对每个表或时间表变量进行运算。
名称-值参数
将可选的参量对组指定为 Name1=Value1,...,NameN=ValueN
,其中 Name
是参量名称,Value
是对应的值。名称-值参量必须出现在其他参量之后,但参量对组的顺序无关紧要。
示例: filloutliers(A,"center","mean",ThresholdFactor=4)
在 R2021a 之前,使用逗号分隔每个名称和值,并用引号将 Name
引起来。
示例: filloutliers(A,"center","mean","ThresholdFactor",4)
SamplePoints
— 样本点
向量 | 表变量名称 | 标量 | 函数句柄 | 表 vartype
下标
采样点,指定为由采样点值组成的向量或下表中的选项之一(当输入数据为表时)。样本点代表数据的 x 轴位置,必须为有序且包含唯一的元素。样本点不需要均匀采样。向量 [1 2 3 ...]
是默认值。
当输入数据是表时,可以使用以下选项之一将采样点指定为表变量。
索引方案 | 示例 |
---|---|
变量名称:
|
|
变量索引:
|
|
函数句柄:
|
|
变量类型:
|
|
注意
当输入数据为 timetable
时,不支持此名称-值参量。时间表使用行时间向量作为采样点。要使用不同采样点,您必须编辑时间表,以便行时间包含所需的采样点。
移动窗基于样本点进行定义。例如,如果 t
是与输入数据对应的时间向量,则 filloutliers(rand(1,10),"previous","movmean",3,"SamplePoints",t)
将有一个代表 t(i)-1.5
和 t(i)+1.5
之间时间间隔的窗。
当样本点向量的数据类型为 datetime
或 duration
时,移动窗长度的类型必须为 duration
。
示例: filloutliers([1 100 3 4],"nearest","SamplePoints",[1 2.5 3 4])
示例: filloutliers(T,"nearest","SamplePoints","Var1")
数据类型: single
| double
| datetime
| duration
DataVariables
— 要对其进行操作的表变量
表变量名称 | 标量 | 向量 | 元胞数组 | 模式 | 函数句柄 | 表 vartype
下标
要对其进行操作的表变量,指定为下表中的选项之一。DataVariables
值指示要填充输入表的哪些变量。与指示的变量关联的数据类型必须为 double
或 single
。
表中未由 DataVariables
指定的其他变量会传递给输出,而不会对其进行填充。
索引方案 | 示例 |
---|---|
变量名称:
|
|
变量索引:
|
|
函数句柄:
|
|
变量类型:
|
|
示例: filloutliers(A,"previous","DataVariables",["Var1" "Var2" "Var4"])
ReplaceValues
— 替换值指示符
true
或 1
(默认) | false
或 0
替换值指示符,当 A
是表或时间表时,指定为以下逻辑值或数值之一:
true
或1
- 用填充的表变量替换包含离群值的输入表变量。false
或0
- 向输入表追加已检查过离群值的所有表变量。追加的变量中已填充了离群值。
对于向量、矩阵或多维数组输入数据,不支持 ReplaceValues
。
示例: filloutliers(T,"previous","ReplaceValues",false)
ThresholdFactor
— 检测阈值因子
非负标量
检测阈值因子,指定为非负标量。
对于方法 "median"
和 "movmedian"
,检测阈值因子将代替换算 MAD 的倍数(默认为 3)。
对于方法 "mean"
和 "movmean"
,检测阈值因子将取代与均值相差的标准差个数(默认为 3)。
对于方法 "grubbs"
和 "gesd"
,检测阈值因子是 0 到 1 范围内的一个标量。值接近 0 会得到较少数目的离群值,值接近 1 则会得到较多数目的离群值。默认的检测阈值因子为 0.05。
对于 "quartiles"
方法,检测阈值因子将代替四分差的默认倍数(默认为 1.5)。
当指定的方法是 "percentiles"
时,不支持此名称-值参量。
MaxNumOutliers
— GESD 填充的最大离群值数
正整数标量
GESD 填充的最大离群值数,指定为正整数标量。MaxNumOutliers
值指定 "gesd"
方法填充的离群值的最大数目。例如,filloutliers(A,"linear","gesd","MaxNumOutliers",5)
填充的离群值不超过五个。
MaxNumOutliers
的默认值是最接近 A
中的元素数的 10% 的整数。为离群值数上限设置较大的值,可以更可能检测到所有离群值,但代价是降低计算效率。
"gesd"
方法假定非离群值输入数据是从近似正态分布采样的。如果数据不是以这种方式采样的,则填充的离群值数量可能会超过 MaxNumOutliers
值。
OutlierLocations
— 已知离群值指示值
向量 | 矩阵 | 多维数组 | 表 | 时间表
已知离群值指示符,指定为逻辑向量、矩阵或多维数组,或具有逻辑变量的表或时间表 (自 R2024a 起)。
如果 OutlierLocations
是数组,其大小必须与 A
相同。如果 OutlierLocations
是表或时间表,它必须包含与要对其进行操作的输入表变量的大小和名称相同的逻辑变量。
值为 1
(true
) 的元素表示 A
中离群值的位置。值为 0
(false
) 的元素表示非离群值。当您指定 OutlierLocations
时,filloutliers
将不再使用离群值检测方法。而是会用已知离群值指示符中的元素来定义离群值。
如果指定 findmethod
,则无法指定 OutlierLocations
。
数据类型: logical
输出参量
B
— 填充的数据
向量 | 矩阵 | 多维数组 | 表 | 时间表
填充的数据,以向量、矩阵、多维数组、表或时间表形式返回。
除非 ReplaceValues
的值为 false
,否则 B
与 A
的大小相同。如果 ReplaceValues
的值是 false
,则 B
的宽度是输入数据宽度和指定的数据变量数目之和。
TF
— 填充的数据指示符
向量 | 矩阵 | 多维数组
填充的数据指示符,以逻辑向量、矩阵或多维数组形式返回。值为 1 (true
) 的元素对应于 B
中先前为离群值的填充元素。值为 0 (false
) 的元素对应于未做更改的元素。
TF
的大小与 B
相同。
数据类型: logical
L
— 下阈值
标量 | 向量 | 矩阵 | 多维数组 | 表 | 时间表
离群值检测方法使用的下阈值,以标量、向量、矩阵、多维数组、表或时间表形式返回。例如,默认离群值检测方法的下阈值是比输入数据的中位数小三倍换算 MAD 的值。
如果使用 findmethod
进行离群值检测,则除了在运算维度上的长度为 1 外,L
在其他所有维度上的大小均与 A
相同。如果使用 movmethod
,则 L
的大小与 A
相同。
U
— 上阈值
标量 | 向量 | 矩阵 | 多维数组 | 表 | 时间表
离群值检测方法使用的上阈值,以标量、向量、矩阵、多维数组、表或时间表形式返回。例如,默认离群值检测方法的上阈值是比输入数据的中位数大三倍换算 MAD 的值。
如果使用 findmethod
进行离群值检测,则除了在运算维度上的长度为 1 外,U
在其他所有维度上的大小均与 A
相同。如果使用 movmethod
,则 U
的大小与 A
相同。
C
— 中心值
标量 | 向量 | 矩阵 | 多维数组 | 表 | 时间表
离群值检测方法使用的中心值,以标量、向量、矩阵、多维数组、表或时间表形式返回。例如,默认离群值检测方法的中心值是输入数据的中位数。
如果使用 findmethod
进行离群值检测,则除了在运算维度上的长度为 1 外,C
在其他所有维度上的大小均与 A
相同。如果使用 movmethod
,则 C
的大小与 A
相同。
详细信息
中位数绝对偏差
对于由 N 个标量观测值组成的有限长度向量 A,中位数绝对偏差 (MAD) 定义为
,其中 i = 1,2,...,N。
换算 MAD 定义为 c*median(abs(A-median(A)))
,其中 c=-1/(sqrt(2)*erfcinv(3/2))
。
替代功能
参考
[1] NIST/SEMATECH e-Handbook of Statistical Methods, https://www.itl.nist.gov/div898/handbook/, 2013.
扩展功能
tall 数组
对行数太多而无法放入内存的数组进行计算。
用法说明和限制:
不支持
"percentiles"
、"grubbs"
和"gesd"
方法。"movmedian"
和"movmean"
方法不支持 tall 时间表。不支持
SamplePoints
和MaxNumOutliers
名称-值参量。DataVariables
的值不能是函数句柄。OutlierLocations
名称-值参量无法指定表或时间表。仅当
A
为 tall 列向量时,才支持沿第一个维度计算filloutliers(A,fillmethod)
、filloutliers(A,fillmethod,"median",…)
或filloutliers(A,fillmethod,"quartiles",…)
。不支持语法
filloutliers(A,"spline",…)
和filloutliers(A,"makima",…)
。
有关详细信息,请参阅tall 数组。
C/C++ 代码生成
使用 MATLAB® Coder™ 生成 C 代码和 C++ 代码。
用法说明和限制:
用于检测离群值的
"movmean"
和"movmedian"
方法不支持时间表输入数据、日期时间SamplePoints
值或持续时间SamplePoints
值。当输入数据为时间表或
SamplePoints
值的类型为datetime
或duration
时,仅支持使用"center"
、"clip"
和数值标量方法来填充离群值。要使用
"spline"
和"pchip"
填充方法,必须启用对可变大小数组的支持。字符串和字符数组输入必须是常量。
不支持
"makima"
选项。OutlierLocations
名称-值参量无法指定表或时间表。
基于线程的环境
使用 MATLAB® backgroundPool
在后台运行代码或使用 Parallel Computing Toolbox™ ThreadPool
加快代码运行速度。
此函数完全支持基于线程的环境。有关详细信息,请参阅在基于线程的环境中运行 MATLAB 函数。
版本历史记录
在 R2017a 中推出R2024a: 将离群值位置定义为表
通过将 OutlierLocations
名称-值参量指定为包含输入表中具有名称的逻辑变量的表,定义离群值的位置。以前,您只能将 OutlierLocations
指定为向量、矩阵或多维数组。
R2022a: 追加填充值
对于表或时间表输入数据,向输入表追加所有已检查过离群值的表变量。追加的变量中已填充了离群值。通过将 ReplaceValues
名称-值参量设置为 false
,即可追加而不是替换表变量。
R2021b: 将采样点指定为表变量
对于表输入数据,可以使用 SamplePoints
名称-值参量将采样点指定为表变量。
MATLAB 命令
您点击的链接对应于以下 MATLAB 命令:
请在 MATLAB 命令行窗口中直接输入以执行命令。Web 浏览器不支持 MATLAB 命令。
Select a Web Site
Choose a web site to get translated content where available and see local events and offers. Based on your location, we recommend that you select: .
You can also select a web site from the following list:
How to Get Best Site Performance
Select the China site (in Chinese or English) for best site performance. Other MathWorks country sites are not optimized for visits from your location.
Americas
- América Latina (Español)
- Canada (English)
- United States (English)
Europe
- Belgium (English)
- Denmark (English)
- Deutschland (Deutsch)
- España (Español)
- Finland (English)
- France (Français)
- Ireland (English)
- Italia (Italiano)
- Luxembourg (English)
- Netherlands (English)
- Norway (English)
- Österreich (Deutsch)
- Portugal (English)
- Sweden (English)
- Switzerland
- United Kingdom (English)