异常值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