Как удалить выбросы из набора данных
У меня есть многовариантные данные о красоте и возрасте. Возраст варьируется от 20-40 с интервалом в 2 (20, 22, 24.... 40), и для каждой записи данных им предоставляется возраст и рейтинг красоты от 1 до 5. Когда я делаю ящики из этих данных (возрасты по оси X, оценки красоты по оси Y), есть некоторые выбросы, построенные за пределами усов каждой коробки.
Я хочу удалить эти выбросы из самого фрейма данных, но я не уверен, как R вычисляет выбросы для его ящиков. Ниже приведен пример того, как могут выглядеть мои данные.
![enter image description here]()
Ответы
Ответ 1
ОК, вы должны применить что-то подобное к вашему набору данных. Не заменяйте и не сохраняйте, иначе вы уничтожите свои данные! И, кстати, вы должны (почти) никогда не удалять выбросы из ваших данных:
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]()
Ответ 2
Никто не опубликовал простейший ответ:
x[!x %in% boxplot.stats(x)$out]
Также см. это: http://www.r-statistics.com/2011/01/how-to-label-all-the-outliers-in-a-boxplot/
Ответ 3
Используйте outline = FALSE
в качестве опции, когда вы делаете boxplot (читайте справку!).
> m <- c(rnorm(10),5,10)
> bp <- boxplot(m, outline = FALSE)
![enter image description here]()
Ответ 4
Функция 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
Я намеренно не ответил на конкретный вопрос, потому что считаю статистической халатностью устранение "выбросов". Я считаю приемлемой практикой не наносить их на коробчатый график, но удаление их только потому, что они превышают некоторое количество стандартных отклонений или некоторое количество межквартильных ширин, является систематическим и ненаучным искажением данных наблюдений.
Ответ 5
Я посмотрел на пакеты, связанные с удалением выбросов, и нашел этот пакет (неожиданно названный "выбросами"!): https://cran.r-project.org/web/packages/outliers/outliers.pdf
если вы пройдете через это, вы увидите различные способы удаления выбросов, и среди них я нашел rm.outlier
наиболее удобным для использования и, как сказано в ссылке выше:
"Если выброс обнаружен и подтвержден статистическими тестами, эта функция может удалить его или заменить
выборочное среднее значение или медиана ", а также вот часть использования из того же источника:
"Usage
Usage
rm.outlier(x, fill = FALSE, median = FALSE, opposite = FALSE)
Аргументы
xнабор данных, чаще всего вектор. Если аргумент является фреймом данных, то выброс
удаляется из каждого столбца с помощью sapply. Такое же поведение применяется при применении
когда матрица дается.
fill Если установлено значение TRUE, медиана или среднее значение помещается вместо выброса. В противном случае
выброс просто/просто удаляются.
медиана Если установлено значение ИСТИНА, медиана используется вместо среднего значения при замене выбросов.
противоположное, если установлено в TRUE, дает противоположное значение (если наибольшее значение имеет максимальную разницу
от наименьшего даёт самое маленькое и наоборот)
"
Ответ 6
x<-quantile(retentiondata$sum_dec_incr,c(0.01,0.99))
data_clean <- data[data$attribute >=x[1] & data$attribute<=x[2],]
Мне очень легко удалить выбросы. В приведенном выше примере я просто извлекаю 2 процентиля до 98 процентилей значений атрибутов.
Ответ 7
Добавив предложение @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 говорил о том, чтобы держать выбросы. Его следует удалить только для получения альтернативного консервативного представления данных.
Ответ 8
Не был бы:
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
выполнить эту задачу довольно легко?
Ответ 9
Попробуй это. Вставьте вашу переменную в функцию и сохраните 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)
}