Функция уменьшения выбросов - PullRequest
0 голосов
/ 20 июня 2019

Я работаю с машинами опорных векторов и хочу уменьшить выбросы.Так что у меня есть функция для уменьшения выбросов до 70% от первоначальной стоимости.Я считаю, что этот метод лучше, чем винсоризация, поскольку он не присваивает многим точкам данных одно и то же значение, он создает более равномерный разброс.

Функция уменьшения выбросов -

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 <квантиль (x, 0.25, na.rm = TRUE) - 3 * IQR (x, na.rm = TRUE) |: количество заменяемых элементов не кратно длине замены </p>

Ответы [ 2 ]

2 голосов
/ 20 июня 2019

Вы получаете ошибку, потому что длина векторов на 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
}
1 голос
/ 20 июня 2019

Чтобы решить проблему длины, используйте 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
    )
}
...