Main Content

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

filloutliers

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

说明

示例

B = filloutliers(A,fillmethod) 查找 A 中的离群值并根据 fillmethod 替换它们。例如,filloutliers(A,'previous') 将离群值替换为上一个非离群值元素。默认情况下,离群值是指与中位数相差超过三倍经过换算的中位数绝对偏差 (MAD) 的值。如果 A 是矩阵或表,则 filloutliers 分别对每一列进行运算。如果 A 是多维数组,则 filloutliers 沿大小不等于 1 的第一个维度进行运算。

示例

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 的维度 dim 运算。例如,filloutliers(A,'linear',2) 沿矩阵 A 的每一行运算。

示例

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

示例

[B,TF,L,U,C] = filloutliers(___) 还返回检测方法计算的离群值和阈值的位置信息。TF 是一个逻辑数组,指示 A 中的离群值的位置。LUC 参数表示离群值检测方法使用的下阈值、上阈值和中心值。

示例

全部折叠

创建包含一个离群值的数据向量,并使用线性插值来替换该离群值。绘制原始数据和填充后的数据。

A = [57 59 60 100 59 58 57 58 300 61 62 60 62 58 57];
B = filloutliers(A,'linear');
plot(1:15,A,1:15,B,'o')
legend('Original Data','Interpolated Data')

创建包含一个离群值的向量,并将离群值定义为与均值相差超过三倍标准差的点。将该离群值替换为最接近的非离群值元素,并绘制原始数据和插入后的数据。

A = [57 59 60 100 59 58 57 58 300 61 62 60 62 58 57];
B = filloutliers(A,'nearest','mean');
plot(1:15,A,1:15,B,'o')
legend('Original Data','Interpolated 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,U,L,C] = filloutliers(A,'clip','movmedian',hours(5),'SamplePoints',t);
plot(t,A,t,B,'o')
legend('Original Data','Filled Data')

显示替换离群值的阈值。

L(TF)
ans = -0.8779

为矩阵的每一行填充替换离群值。

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

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,lower,upper,center] = 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

查找数据向量中的离群值,并使用 'clip' 方法进行替换。绘制原始数据、填充的数据以及由检测方法确定的阈值和中心值。'clip' 将离群值替换为上阈值。

x = 1:10;
A = [60 59 49 49 58 100 61 57 48 58];
[B,TF,lower,upper,center] = filloutliers(A,'clip');
plot(x,A,x,B,'o',x,lower*ones(1,10),x,upper*ones(1,10),x,center*ones(1,10))
legend('Original Data','Filled Data','Lower Threshold','Upper Threshold','Center Value')

输入参数

全部折叠

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

如果 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

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

方法说明
'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 的元素。
'movmean'离群值定义为在 window 指定的窗口长度内,与局部均值相差超过三倍局部标准差的元素。

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

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

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

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

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

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

假设有一个矩阵 A

filloutliers(A,fillmethod,1) 根据每一列中的数据填充离群值。

filloutliers(A,fillmethod,2) 根据每一行中的数据填充离群值。

A 为表或时间表时,不支持 dimfilloutliers 分别对每个表或时间表变量进行运算。

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

名称-值对组参数

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

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

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

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

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

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

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

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

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

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

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

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

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

表变量,指定为逗号分隔的对组,包含 'DataVariables' 和变量名称、变量名称元胞数组、数值向量、逻辑向量、函数句柄或表 vartype 下标。'DataVariables' 值表示要在输入表的哪些列中检测离群值,可以是下列值之一:

  • 指定单个表变量名称的字符向量

  • 字符向量元胞数组,其中每个元素都是表变量名称

  • 表变量索引向量

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

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

  • vartype 下标

示例: 'Age'

示例: {'Height','Weight'}

示例: @isnumeric

示例: vartype('numeric')

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

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

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

已知离群值指示值,指定为逗号分隔的对组,其中包含 'OutlierLocations' 和一个逻辑向量、矩阵或大小与 A 相同的多维数组。已知离群值指示值元素可以为 true,指示离群值位于 A 中的对应位置,否则为 false。指定 'OutlierLocations' 将关闭默认离群值检测方法,并且只使用已知离群值指示值的元素来定义离群值。

在指定了 findmethod 的情况下,不能指定 'OutlierLocations' 名称-值对组。

输出 TF'OutlierLocations' 值相同。

数据类型: logical

输出参数

全部折叠

填充离群值数组,以向量、矩阵、多维数组、表或时间表形式返回。B 的元素与 A 的元素相同,但会根据 fillmethod 替换所有离群值。

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

离群值指示值,以向量、矩阵或多维数组形式返回。当 A 的对应元素为离群值时,TF 的元素为 true,否则为 falseTF 的大小与 A 相同。

数据类型: logical

离群值检测方法使用的下阈值,以标量、向量、矩阵、多维数组、表或时间表形式返回。例如,默认离群值检测方法的下限值是比输入数据中位数小三倍的 MAD。在除长度为 1 的工作维度之外的所有维度中,L 的大小与 A 相同。

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

离群值检测方法使用的上阈值,以标量、向量、矩阵、多维数组、表或时间表形式返回。例如,默认离群值检测方法的上限值是比输入数据中位数大三倍的 MAD。在除长度为 1 的工作维度之外的所有维度中,U 的大小与 A 相同。

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

离群值检测方法使用的中心值,以标量、向量、矩阵、多维数组、表或时间表形式返回。例如,默认离群值检测方法的中心值是输入数据的中位数。在除长度为 1 的工作维度之外的所有维度中,C 的大小与 A 相同。

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

详细信息

全部折叠

中位数绝对偏差

对于由 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))

扩展功能

在 R2017a 中推出