【问题标题】:Function to reduce outliers减少异常值的功能
【发布时间】:2019-11-02 18:48:04
【问题描述】:

我正在使用支持向量机并希望减少异常值。 所以我有一个功能可以将异常值减少到原始值的 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
}

问题是该函数适用于某些列,但会在其他列上产生此错误消息。

警告信息:

在 x[x

【问题讨论】:

    标签: r function outliers


    【解决方案1】:

    要解决长度问题,请使用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
        )
    }
    

    【讨论】:

    • 哇,它甚至打印出被替换的异常值的数量。非常感谢。
    • 实际上,再次检查,看起来您现有的语法确实产生了正确的结果,但我个人总是将多个条件分解并用括号括起来以确保安全。
    【解决方案2】:

    您收到错误是因为函数内部 &lt;- 的 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
    }
    

    【讨论】:

      猜你喜欢
      • 2020-11-01
      • 2018-10-29
      • 1970-01-01
      • 2020-03-25
      • 2016-05-02
      • 1970-01-01
      • 2020-02-10
      • 2014-09-26
      • 1970-01-01
      相关资源
      最近更新 更多