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

У меня есть многовариантные данные о красоте и возрасте. Возраст варьируется от 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

Что означают зеленые папки в Windows 7 Explorer?

Нарушение внешнего ключа Bogus не выполняется

Виртуализированное разрешение экрана для Linux

Почему git настолько медленный с большими файлами?

Могу ли я проверить, существует ли почтовый адрес с использованием .net?

Что синхронизируется на компьютерах с использованием одного и того же идентификатора Windows Live ID?

Есть ли способ разрешить одновременным пользователям удаленного рабочего стола на XP без изменения DLL?

Безопасно ли удалять указатель на пустоту?

Определение функции уравнениями с различным числом аргументов

Количество дней в конкретном месяце того же года?

JOptionPane – проверка ввода пользователем и предотrotation закрытия до тех пор, пока не будут выполнены условия

Как сохранить img на локальный компьютер пользователя с помощью HTML2canvas

Как реализовать отношения «многие ко многим» в PostgreSQL?

Удаление изображения галереи после снятия снимка камеры

Укажите путь поиска для DllImport в .NET.

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