如何检测单变量异常值并在新列中标记为 TRUE 或 FALSE
How to detect univariate outliers and mark as TRUE or FALSE in new column
我有一个包含 30 列和 >10,000 行的数据框。
我如何 运行 对一组变量进行离群值分析,如果任何变量超过特定阈值(对于该给定变量),则 return 为 TRUE,如果任何变量均未满足各自的异常值阈值 (3SD),TRUE/FALSE 值显示在新列中?
我已经使用分位数找到每个变量的 3 个标准偏差截止值:
即:
quantile(df$a, 0.003, na.rm = T) #and
quantile(df$a, 0.997, na.rm = T)
假设这个变量的第一个值为 2.5,上限值为 10.5,然后我创建了一个新变量:
df$outliers <- (df$a <- df$a <2.5 | df$a > 10.5)
当 a 列中的值小于 2.5 或大于 10.5 时给出 TRUE 值。
我想做的是让 df$outliers 代表一组列的离群值状态,而不仅仅是一个列,即列 d、e、f、g、l、m 等,它们都有满足自己的阈值。
最好的方法是什么?
一般来说,如果观察值是一个或多个特征的离群值,那么它就是离群值。但我不知道你在处理什么,所以它可能会有所不同,你必须找到你所处理的问题如何定义异常值,然后你才能选择重要的特征和阈值。
回到第一个定义,您可以将您的列创建为您对所有变量所做的相同过程的结果的交集。
但是您应该避免手动执行此操作,因此您创建了一个 table 所有变量的阈值,然后创建一个 returns 如果观察值是至少一个变量的异常值
假设您的数据框名为 df
并且您有兴趣检查异常值的列是 a
、b
和 c
(存储在 cols
).我们可以在这些列上使用 sapply
找出哪个值位于异常值范围内。这将 return 一个 TRUE
/FALSE
值的矩阵,指示该特定值是否为异常值。如果任何一列在该行中有 TRUE
值,我们对其取 rowSums
并赋值 TRUE
,否则赋值为 FALSE
。
cols <- c("a", "b", "c")
df$outliers <- rowSums(sapply(df[cols], function(x)
x < quantile(x, 0.003) | x > quantile(x, 0.997))) > 0
df
# a b c random outliers
#1 -0.56047565 1.2240818 -1.0678237 1 FALSE
#2 -0.23017749 0.3598138 -0.2179749 2 FALSE
#3 1.55870831 0.4007715 -1.0260044 3 FALSE
#4 0.07050839 0.1106827 -0.7288912 4 FALSE
#5 0.12928774 -0.5558411 -0.6250393 5 FALSE
#6 1.71506499 1.7869131 -1.6866933 6 TRUE
#7 0.46091621 0.4978505 0.8377870 7 FALSE
#8 -1.26506123 -1.9666172 0.1533731 8 TRUE
#9 -0.68685285 0.7013559 -1.1381369 9 FALSE
#10 -0.44566197 -0.4727914 1.2538149 10 TRUE
数据
set.seed(123)
df <- data.frame(a = rnorm(10), b = rnorm(10), c = rnorm(10), random = 1:10)
我有一个包含 30 列和 >10,000 行的数据框。
我如何 运行 对一组变量进行离群值分析,如果任何变量超过特定阈值(对于该给定变量),则 return 为 TRUE,如果任何变量均未满足各自的异常值阈值 (3SD),TRUE/FALSE 值显示在新列中?
我已经使用分位数找到每个变量的 3 个标准偏差截止值:
即:
quantile(df$a, 0.003, na.rm = T) #and
quantile(df$a, 0.997, na.rm = T)
假设这个变量的第一个值为 2.5,上限值为 10.5,然后我创建了一个新变量:
df$outliers <- (df$a <- df$a <2.5 | df$a > 10.5)
当 a 列中的值小于 2.5 或大于 10.5 时给出 TRUE 值。
我想做的是让 df$outliers 代表一组列的离群值状态,而不仅仅是一个列,即列 d、e、f、g、l、m 等,它们都有满足自己的阈值。
最好的方法是什么?
一般来说,如果观察值是一个或多个特征的离群值,那么它就是离群值。但我不知道你在处理什么,所以它可能会有所不同,你必须找到你所处理的问题如何定义异常值,然后你才能选择重要的特征和阈值。
回到第一个定义,您可以将您的列创建为您对所有变量所做的相同过程的结果的交集。
但是您应该避免手动执行此操作,因此您创建了一个 table 所有变量的阈值,然后创建一个 returns 如果观察值是至少一个变量的异常值
假设您的数据框名为 df
并且您有兴趣检查异常值的列是 a
、b
和 c
(存储在 cols
).我们可以在这些列上使用 sapply
找出哪个值位于异常值范围内。这将 return 一个 TRUE
/FALSE
值的矩阵,指示该特定值是否为异常值。如果任何一列在该行中有 TRUE
值,我们对其取 rowSums
并赋值 TRUE
,否则赋值为 FALSE
。
cols <- c("a", "b", "c")
df$outliers <- rowSums(sapply(df[cols], function(x)
x < quantile(x, 0.003) | x > quantile(x, 0.997))) > 0
df
# a b c random outliers
#1 -0.56047565 1.2240818 -1.0678237 1 FALSE
#2 -0.23017749 0.3598138 -0.2179749 2 FALSE
#3 1.55870831 0.4007715 -1.0260044 3 FALSE
#4 0.07050839 0.1106827 -0.7288912 4 FALSE
#5 0.12928774 -0.5558411 -0.6250393 5 FALSE
#6 1.71506499 1.7869131 -1.6866933 6 TRUE
#7 0.46091621 0.4978505 0.8377870 7 FALSE
#8 -1.26506123 -1.9666172 0.1533731 8 TRUE
#9 -0.68685285 0.7013559 -1.1381369 9 FALSE
#10 -0.44566197 -0.4727914 1.2538149 10 TRUE
数据
set.seed(123)
df <- data.frame(a = rnorm(10), b = rnorm(10), c = rnorm(10), random = 1:10)