Как удалить выбросы из набора данных - PullRequest
90 голосов
/ 25 января 2011

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

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

Ответы [ 8 ]

121 голосов
/ 08 февраля 2011

Никто не опубликовал самый простой ответ:

x[!x %in% boxplot.stats(x)$out]

См. Также: http://www.r -statistics.com / 2011/01 / как маркировать все выбросы в коробке /

105 голосов
/ 25 января 2011

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

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()

И снова, вы никогда не должны делать это наваши собственные, выбросы должны быть!=)

РЕДАКТИРОВАТЬ: Я добавил na.rm = TRUE по умолчанию.

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

enter image description here

26 голосов
/ 25 января 2011

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

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

enter image description here

16 голосов
/ 25 января 2011

Функция 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

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

6 голосов
/ 29 декабря 2016

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

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

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

6 голосов
/ 23 октября 2015
x<-quantile(retentiondata$sum_dec_incr,c(0.01,0.99))
data_clean <- data[data$attribute >=x[1] & data$attribute<=x[2],]

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

4 голосов
/ 19 марта 2015

Если добавить предложение @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 говорил о том, чтобы держать выбросы. Его следует удалить только для получения альтернативного консервативного представления данных.

3 голосов
/ 28 июля 2015

Не могли бы:

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

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

...