Как удалить выбросы из набора данных
-
24-10-2019 - |
Вопрос
У меня есть несколько многомерных данных о красоте против возраста. Возраст варьируется от 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()
И еще раз, вы никогда не должны делать это самостоятельно, выбросы просто должны быть! знак равно
РЕДАКТИРОВАТЬ: я добавил 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-aboxplot/
Использовать outline = FALSE
В качестве опции, когда вы делаете коробку (прочитайте помощь!).
> m <- c(rnorm(10),5,10)
> bp <- boxplot(m, outline = FALSE)
Функция Bodeplot возвращает значения, используемые для выполнения построения (что фактически выполняется 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)
Аргументы
Икс Набор данных, чаще всего вектор. Если аргумент - это DataFrame, то выброс удаляется из каждого столбца SAPPLY. Такое же поведение применяется при применении, когда указана матрица.
наполнять Если установлено в True, среднее или среднее размещено вместо выброса. В противном случае выбросы (ы)/просто удаляются.
медиана Если установлено в True, используется медиана вместо среднего значения в замене выбросов. Напротив, если установлен в True, дает противоположное значение (если наибольшее значение имеет максимальную разницу от среднего, оно дает наименьшее и наоборот) »
Не будет:
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
выполнить эту задачу довольно легко?
В дополнение к предложению @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 говорил о поддержании выбросов. Он должен быть удален только для получения альтернативного консервативного представления данных.
Попробуй это. Подайте свою переменную в функции и сохраните O/P в переменной, которая будет содержать удаленные выбросы
outliers<-function(variable){
iqr<-IQR(variable)
q1<-as.numeric(quantile(variable,0.25))
q3<-as.numeric(quantile(variable,0.75))
mild_low<-q1-(1.5*iqr)
mild_high<-q3+(1.5*iqr)
new_variable<-variable[variable>mild_low & variable<mild_high]
return(new_variable)
}