2011-01-24 12 views
67

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

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

+1

Параметр' boxplot' функция возвращает выбросы (среди других статистических данных) невидимо. Попробуйте 'foo <- boxplot (...); foo' и читать'? boxplot', чтобы понять результат. –

+0

Вы должны отредактировать свой вопрос в соответствии с ответом, который вы дали на ответ @ Prasad! – aL3xa

+0

@ aL3xa: это в первом предложении второй абзац –

ответ

82

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

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

+0

Спасибо за помощь! Я бы подумал, что если R способен выводить выбросы в boxplot, мне не нужно делать эти промежуточные вычисления. Что касается удаления выбросов, это просто для задания. –

+1

ОК, я что-то пропустил. Вы хотите удалить выбросы из данных, чтобы их можно было нарисовать с помощью 'boxplot'. Это управляемо, и тогда вы должны отметить ответ @ Prasad, так как ответили на ваш вопрос. Если вы хотите исключить выбросы, используя правило «outlier» «q +/- (1.5 * H)», отсюда проведите некоторый анализ, а затем используйте эту функцию.BTW, я сделал это с нуля, без Googling, так что есть шанс, что я повторно открыл колесо с этой функцией моей ... – aL3xa

+9

Вы не должны задавать вопросы о задаче в stackoverflow! – hadley

24

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

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

enter image description here

+2

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

+2

I se e, тогда как @Joshua сказал, что вам нужно посмотреть данные, возвращаемые функцией boxplot (в частности, элементы 'out' и' group' в списке). –

14

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

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

+3

Ну, обойдя вопрос, не зная, почему вопрос был задан, тоже не является хорошей практикой. Да, нехорошо удалять «выбросы» из данных, но иногда вам нужны данные без выбросов для конкретных задач. В задаче статистики, которое было недавно, нам пришлось визуализировать набор без его выбросов, чтобы определить наилучшую модель регрессии для использования для данных. Так что! –

+4

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

96

никто не отвечал простейший ответ:

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

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

+4

Действительно элегантный. Благодарю. Но нужно быть осторожным, если распределение имеет более одного режима, а выбросы действительно мало и разбросаны. –

+0

Было бы здорово, если бы вы смогли получить индекс из них в наборе данных. Способ, которым вы закончите, будет фильтроваться на основе значения данных. Если полевая диаграмма также группирует, то не обязательно одинаковое значение данных будет превышать в каждой группе – adam

+0

Также важно отметить, что он не меняет набор данных. Это всего лишь метод фильтрации. Поэтому, если вы намереваетесь использовать набор данных без outliers, назначьте его переменной. , например. 'result = x [! x% in% boxplot.stats (x) $ out]' –

1

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

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

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

+0

- это '0.91' или' 0.99'? как в 'mydata $ var

+0

Если у вас есть конкретная причина использовать 91-й процентили вместо 99-го процентиля, вы можете использовать его. Это только эвристика –

0

Не был бы:

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

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

+0

Это то же самое, что и ответ aL3xa, за исключением того, что вы написали весь код в одну строку. Который вы предпочитаете, это вопрос предпочтения – 5th

+0

@ 5th wrong. 1/3 линии и гораздо более сжатые. – d8aninja

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

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

3

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

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

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

Смежные вопросы