减少异常值的功能

Function to reduce outliers

我正在使用支持向量机并希望减少异常值。 所以我有一个函数可以将异常值减少到原始值的 70%。 我发现这种方法比 winsorization 更好,因为它不会为很多数据点分配相同的值,它会产生更均匀的分布。

减少异常值的函数-

outlier <- function(x) {
  x[x < quantile(x,0.25, na.rm = TRUE) - 3 * IQR(x, na.rm = TRUE) | x > quantile(x,0.75, na.rm = TRUE) + 3 * IQR(x, na.rm = TRUE)] <- (x * 0.7)
  x
}

问题是该函数在某些列上有效,但在其他列上产生此错误消息。

警告信息:

In x[x < quantile(x, 0.25, na.rm = TRUE) - 3 * IQR(x, na.rm = TRUE) | : number of items to replace is not a multiple of replacement length

您收到错误消息是因为函数内 <- 的 LHS 和 RHS 上的向量长度不同。这是正确的方法-

outlier <- function(x) {
  idx <- (x < quantile(x,0.25, na.rm = TRUE) - 3 * IQR(x, na.rm = TRUE)) | (x > quantile(x,0.75, na.rm = TRUE) + 3 * IQR(x, na.rm = TRUE))
  x[idx] <- x[idx] * 0.7
  x
}

要解决长度问题,请使用 ifelse,这样您就知道您将创建一个与原始 x 长度相同的新矢量。此外,对于复杂的条件,请尝试将它们分解成更小的部分。除非你 100% 确定操作顺序,否则很容易出错,我不确定你当前的逻辑是否符合你的要求:

outlier <- function(x) {
    lower_limit = quantile(x,0.25, na.rm = TRUE) - 3 * IQR(x, na.rm = TRUE)
    upper_limit = quantile(x,0.75, na.rm = TRUE) + 3 * IQR(x, na.rm = TRUE)
    is_outlier = (x < lower_limit) | (x > upper_limit)
    print(paste("Replacing", sum(is_outlier), "outliers"))
    ifelse(
        is_outlier,
        x * 0.7,
        x
    )
}