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


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

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

8 79

8 ответов:

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

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

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

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

Также см. Это: http://www.r-statistics.com/2011/01/how-to-label-all-the-outliers-in-a-boxplot/

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

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

enter image description here

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

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

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

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

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

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

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

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

не:

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

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