Вопрос

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

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

Это было полезно?

Решение

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

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

enter image description here

Другие советы

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

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)

enter image description here

Функция 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)
              }
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top