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

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

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

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

 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 , добавлена ​​подписка, поэтому функция была быстрее! знак равно

введите описание изображения здесь

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

 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) 

введите описание изображения здесь

Функция 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 процентилей значений атрибутов.

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

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

аргументы
x dataset, чаще всего вектор. Если аргумент является фреймворком данных, тогда из каждого столбца удаляется исключение. Такое же поведение применяется, когда применяется matrix.
fill Если установлено значение TRUE, вместо outlier помещается медиана или среднее значение. В противном случае, outlier (s) / просто удаляются.
median Если установлено значение 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 

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

Interesting Posts

Django Rest Framework: динамическое возrotation подмножества полей

В Linux, какие точечные файлы и каталоги следует создать резервную копию?

Android: Сброс позиции анимации после завершения

Как я могу выполнить ping каждые X минут и проверить время ответа?

Как заблокировать изображения из определенного домена?

Соединение TP-Link нарушает трафик Cisco VPN

Как определить самую длинную возрастающую подпоследовательность с помощью динамического программирования?

Как я могу обеспечить, чтобы мой Samsung Series 7 на самом деле использовал переключаемую графику Radeon?

Я не совсем понимаю разрешения файлов CHMOD, может ли кто-нибудь лучше объяснить это?

Запись QEMU загрузки виртуальной машины в файл

Вставьте фоновое изображение с помощью FFmpeg

Как изменить кодировку символов для веб-страницы в Chrome?

Улучшение качества созданных ffmpeg jpg

Как сохранить содержимое всех открытых вкладок в Chrome автоматически?

Более одного «Открыть xxxxx здесь как администратор»

Давайте будем гением компьютера.