Подтвердить что ты не робот

Как удалить выбросы из набора данных

У меня есть многовариантные данные о красоте и возрасте. Возраст варьируется от 20-40 с интервалом в 2 (20, 22, 24.... 40), и для каждой записи данных им предоставляется возраст и рейтинг красоты от 1 до 5. Когда я делаю ящики из этих данных (возрасты по оси X, оценки красоты по оси Y), есть некоторые выбросы, построенные за пределами усов каждой коробки.

Я хочу удалить эти выбросы из самого фрейма данных, но я не уверен, как R вычисляет выбросы для его ящиков. Ниже приведен пример того, как могут выглядеть мои данные. enter image description here

4b9b3361

Ответ 1

ОК, вы должны применить что-то подобное к вашему набору данных. Не заменяйте и не сохраняйте, иначе вы уничтожите свои данные! И, кстати, вы должны (почти) никогда не удалять выбросы из ваших данных:

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
}

Чтобы увидеть его в действии:

set.seed(1)
x <- rnorm(100)
x <- c(-10, x, 10)
y <- remove_outliers(x)
## png()
par(mfrow = c(1, 2))
boxplot(x)
boxplot(y)
## dev.off()

И еще раз, вы никогда не должны делать этого самостоятельно, выбросы просто должны быть! =)

EDIT: Я добавил na.rm = TRUE по умолчанию.

EDIT2: Удалена функция quantile, добавлена ​​подписка, поэтому функция была быстрее! =)

enter image description here

Ответ 3

Используйте outline = FALSE в качестве опции, когда вы делаете boxplot (читайте справку!).

> m <- c(rnorm(10),5,10)
> bp <- boxplot(m, outline = FALSE)

enter image description here

Ответ 4

Функция boxplot возвращает значения, используемые для построения графика (что на самом деле затем выполняется bxp():

bstats <- boxplot(count ~ spray, data = InsectSprays, col = "lightgray") 
#need to "waste" this plot
bstats$out <- NULL
bstats$group <- NULL
bxp(bstats)  # this will plot without any outlier points

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

Ответ 5

Я посмотрел на пакеты, связанные с удалением выбросов, и нашел этот пакет (неожиданно названный "выбросами"!): https://cran.r-project.org/web/packages/outliers/outliers.pdf
если вы пройдете через это, вы увидите различные способы удаления выбросов, и среди них я нашел rm.outlier наиболее удобным для использования и, как сказано в ссылке выше: "Если выброс обнаружен и подтвержден статистическими тестами, эта функция может удалить его или заменить выборочное среднее значение или медиана ", а также вот часть использования из того же источника:
"Usage

Usage
rm.outlier(x, fill = FALSE, median = FALSE, opposite = FALSE)

Аргументы
xнабор данных, чаще всего вектор. Если аргумент является фреймом данных, то выброс удаляется из каждого столбца с помощью sapply. Такое же поведение применяется при применении когда матрица дается.
fill Если установлено значение TRUE, медиана или среднее значение помещается вместо выброса. В противном случае выброс просто/просто удаляются.
медиана Если установлено значение ИСТИНА, медиана используется вместо среднего значения при замене выбросов. противоположное, если установлено в TRUE, дает противоположное значение (если наибольшее значение имеет максимальную разницу от наименьшего даёт самое маленькое и наоборот) "

Ответ 6

x<-quantile(retentiondata$sum_dec_incr,c(0.01,0.99))
data_clean <- data[data$attribute >=x[1] & data$attribute<=x[2],]

Мне очень легко удалить выбросы. В приведенном выше примере я просто извлекаю 2 процентиля до 98 процентилей значений атрибутов.

Ответ 7

Добавив предложение @sefarkas и используя квантиль в качестве отсечений, можно изучить следующую опцию:

newdata <- subset(mydata,!(mydata$var > quantile(mydata$var, probs=c(.01, .99))[2] | mydata$var < quantile(mydata$var, probs=c(.01, .99))[1]) ) 

Это удалит точки за пределами 99-го квантиля. Следует проявлять осторожность, как то, что aL3Xa говорил о том, чтобы держать выбросы. Его следует удалить только для получения альтернативного консервативного представления данных.

Ответ 8

Не был бы:

z <- df[df$x > quantile(df$x, .25) - 1.5*IQR(df$x) & 
        df$x < quantile(df$x, .75) + 1.5*IQR(df$x), ] #rows

выполнить эту задачу довольно легко?

Ответ 9

  Попробуй это. Вставьте вашу переменную в функцию и сохраните o/p в переменной, которая будет содержать удаленные выбросы

              outliers<-function(variable){
              iqr<-IQR(variable)
              q1<-as.numeric(quantile(variable,0.25))
              q3<-as.numeric(quantile(variable,0.75))
              mild_low<-q1-(1.5*iqr)
              mild_high<-q3+(1.5*iqr)
              new_variable<-variable[variable>mild_low & variable<mild_high]
              return(new_variable)
              }