去除箱线图中的outliers

2020-12-23 15:18:16 浏览数 (2)

异常值outlier:指样本中的个别值,其数值明显偏离它(或他们)所属样本的其余观测值,也称异常数据,离群值。当遇到一组数据中有少量outliers,一般是需要剔除,避免对正确的结果造成干扰。我们可以通过箱线图来检测并去除outliers. 箱线图可以通过5个数来概括:最小值,最大值,下四分位(Q1,在25%位置),上四分位(Q3,在75%位置),中位值(50%位置)。箱线图能够显示离群点,可以通过IQR(InterQuartile Range,四分位距即Q3-Q1)计算得到。该离群点定义为异常值被定义为小于Q1-1.5IQR或大于Q3 1.5IQR的值。 UpperLimit=Q3 1.5IQR=75%分位数 1.5(75%分位数-25%分位数) LowerLimit=Q1-1.5IQR=25%分位数 - 1.5(75%分位数-25%分位数) 即在UpperLimit与LowerLimit之外的值为outlier。

创建data.frame

代码语言:javascript复制
element <- sample(letters[1:3], 1e3, replace=T)
value <- rnorm(1e3)
df <- data.frame(element, value)
head(df)

查看是否有离群值

代码语言:javascript复制
ggplot(df, aes(x=element, y=value,color=element))   
  geom_boxplot(outlier.colour="red", outlier.shape=7,outlier.size=1)

因此,存在离群值(红色的方点),下面去除离群值。 首先定义一个函数,将outliers替换成NA。

代码语言:javascript复制
remove_outliers <- function(x, na.rm = TRUE, ...) {
  qnt <- quantile(x, probs=c(.25, .75), na.rm = na.rm, ...)
  H <- 1.5 * IQR(x, na.rm = na.rm)
  y <- x
  y[x < (qnt[1] - H)] <- NA
  y[x > (qnt[2]   H)] <- NA
  y
}

删除含有outliers(NA)的行

代码语言:javascript复制
library(dplyr)
df2 <- df %>%
  group_by(element) %>%
  mutate(value = remove_outliers(value))
df2<-df2[complete.cases(df2),]

查看删除离群值之后的boxplot,可以看到大部分离群值已去除。

代码语言:javascript复制
ggplot(df2, aes(x=element, y=value,color=element))   
  geom_boxplot(outlier.colour="red", outlier.shape=7,outlier.size=1)

参考:https://www.jianshu.com/p/80848dfb0ec8

0 人点赞