删除不同组的异常值

Remove outliers for different groups

我是新来的,所以请宽待我:-)

我正在寻找一种解决方案,以删除同一列中因特定值不同而不同的离群值:

body_mass age 1 19 11 2 20 10 3 26 8 4 21 6 5 18 12 6 18 7 7 30 11 8 17 8 9 17 10 10 18 8

boxplot(body_mass~age, data = df, subset=age %in% c(0:22))$out
outliers <- boxplot(body_mass~age, data = df, subset=age %in% c(0:22))$out

df[which(df$body_mass %in% outliers),]
df <- df[-which(df$body_mass %in% outliers),]

但是尝试这种方式,删除了所有年龄段的所有值,即使它们只是一个年龄段的异常值 class

这实际上取决于您如何定义 "outlier"。但如果你愿意接受 离群值是四分位距正负 1.5 倍的任何值,那么您可以使用以下方法按年龄组去除体重中的离群值。

此外,我假设您想将每个年龄段视为一个单独的组,因为您没有另外说明。

定义一个函数,用 NA 替换异常值。

#' Replace outliers
#'
#' Replace outliers with NA. Outliers are defined as values that fall outside plus or minus
#' 1.5 * IQR.
#'
#' @return Numeric vector of same length.
#' @param x Numeric vector to replace.
#' @param na.rm Should NA values be replaced beforehand?
#'
#' @export
remove_outliers <- function(x, na.rm = TRUE, ...) {
  qnt <- quantile(x, probs = c(.25, .75), na.rm = na.rm, ...)
  val <- 1.5 * IQR(x, na.rm = na.rm)
  y <- x
  y[x < (qnt[1] - val)] <- NA
  y[x > (qnt[2] + val)] <- NA
  y
}

按年龄组和过滤器应用remove_outliers()

library(dplyr)

df2 <- df %>% 
  group_by(age) %>% 
  mutate(body_mass = replace_outliers(body_mass)) %>% 
  ungroup() %>% 
  filter(!is.na(body_mass))