目录
rmoutliers函数功能是检测并删除数据中的离群值。
语法
B = rmoutliers(A)
B = rmoutliers(A,method)
B = rmoutliers(A,"percentiles",threshold)
B = rmoutliers(A,movmethod,window)
B = rmoutliers(___,dim)
B = rmoutliers(___,Name,Value)
[B,TFrm] = rmoutliers(___)
[B,TFrm,TFoutlier] = rmoutliers(___)
[B,TFrm,TFoutlier,L,U,C] = 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)
如图所示:
删除数据中的离群值,其中离群值定义为偏离均值超过三倍标准差的值。
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")
如图所示:
使用移窗检测法
使用移动中位数在对应于某时间向量的正弦波中检测并删除局部离群值。
创建包含一个局部离群值的数据向量。
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")
如图所示:
删除包含离群值的列
从数据矩阵中删除离群值,并检查删除的列和离群值。创建一个包含两个离群值的矩阵。
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")
如图所示:
参数说明
A--输入数据,指定为向量、矩阵、表或时间表。
-
如果 A 是一个表,则其变量的类型必须为 double 或 single,也可以使用 DataVariables 参数显式列出 double 或 single 变量。当您使用的表中包含 double 和 single 数据类型之外的变量时,指定变量很有用。
-
如果 A 是一个时间表,则 rmoutliers 仅对表元素进行运算。如果行时间用作采样点,则它们必须唯一,并按升序排列。
method
— 检测离群值的方法
检测离群值的方法,指定为以下值之一。
方法 | 描述 |
---|---|
"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" 类似,但当有多个离群值互相遮盖时,此方法的执行效果更好。 |
threshold
— 百分位数阈值
百分位数阈值,指定为元素在区间 [0, 100] 内的二元素行向量。第一个元素表示下百分位数阈值,第二个元素表示上百分位数阈值。threshold 的第一个元素必须小于第二个元素。
例如,[10 90] 阈值将离群值定义为低于第 10 个百分位数或高于第 90 个百分位数的点。
movmethod
— 移窗法
用来检测离群值的移窗法,指定为下列方法之一。
方法 | 描述 |
---|---|
"movmedian" | 离群值定义为在 window 指定的窗口长度内,与局部中位数相差超过三倍局部换算 MAD 的元素。此方法也称为 Hampel 滤波器。 |
"movmean" | 离群值定义为在 window 指定的窗口长度内,与局部均值相差超过三倍局部标准差的元素。 |
window
— 窗长度
窗长度,指定为正整数标量、由正整数组成的二元素向量、正持续时间标量或由正持续时间组成的二元素向量。
如果 window 是正整数标量,则窗口以当前元素为中心并且包含 window-1 个相邻元素。如果 window 是偶数,则窗口以当前元素和上一个元素为中心。
如果 window 是由正整数组成的二元素向量 [b f],则窗口包含当前元素、其之前的 b 个元素和之后的 f 个元素。
当 A 是时间表或者 SamplePoints 被指定为 datetime 或 duration 向量时,window 的类型必须是 duration,而且将会基于样本点来计算窗口。
dim
— 要删除的维度
要删除的维度,指定为 1 或 2。默认情况下,rmoutliers 会删除每个包含(检测到的)离群值的行。要删除每个包含(检测到的)离群值的矩阵列或表变量,请将维度指定为 2。