После удаления: выбросы близки к максимуму, остаются в прямоугольной диаграмме R. - PullRequest
1 голос
/ 07 мая 2020

После создания функции в R, которая должна возвращать вектор выбросов, замененный NA для некоторых данных, я получил выброс, оставшийся около максимума:

kill_outliers <- function(data, na.rm=TRUE){
  q <- quantile(data, probs=c(0.25, 0.75), na.rm=na.rm)
  killed <- data
  intq <- 1.5 * IQR(data, na.rm=na.rm)
  killed[x < (q[1]-intq)] <- NA
  killed[x > (q[2]+intq)] <- NA
  killed
}

После использования этой функции boxplot (убит) показывает :

With deleted outliers

Почему есть выброс? Я пробовал:

killed[x > (q[2] + intq)] <- NA

, предполагая, что это меньше или равно, однако ничего не изменилось.

(q[2] + intq) == 216.87 и последнее значение в отсортированном наборе данных после удаления 216.16, который должен подойти. Кроме того, я не понимаю, почему, когда я использовал 3-й квантиль (q[3] + intq), он вообще не исключил каких-либо выбросов ...

EDIT

Как указала машина, проблема заключается в создании нового набора данных с новым IQR. Таким образом, я прихожу к выводу, что boxplot () создает новый график оценки IQR для каждого набора данных. Дополнительный вопрос: есть ли способ подогнать новый набор данных к предыдущему графику, созданному коробчатой ​​диаграммой, чтобы подогнать значения к прежним квантилям?

Ответы [ 2 ]

0 голосов
/ 08 мая 2020

@ машина права, удаление "выбросов" изменит распределение и его параметры.

Хочу добавить, что удаление выбросов никогда не должно производиться без серьезных причин. Тот факт, что точка превышает усы на коробчатой ​​диаграмме, не является такой причиной. Небольшое количество ближайших значений вполне нормально, в то время как большое количество таких точек может рассматриваться как индикатор ненормального распределения. Я предпочитаю избегать использования термина «выброс» в таких случаях и называть его по-другому, например, экстремальные значения.

set.seed(765)
boxplot(rnorm(100))    # normal distribution
boxplot(rt(100, df=3)) # t distribution with long tails
boxplot(rlnorm(100))   # lognormal, skewed

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

boxplot(c(rnorm(100), 7))

Здесь может быть применен тест на выбросы, например outlierTest из пакета автомобиль с поправкой Бонферрони:

library(car)
outlierTest(lm(x ~ 1))

Понятно, что такой тест не должен применяться повторно.

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

0 голосов
/ 07 мая 2020

Ваша функция удаляет выбросы и, таким образом, вы получаете новое распределение вашей переменной с новым IQR. С новым IQR другие значения могут быть выбросами, которые не были выбросами с IQR исходной переменной (и, следовательно, не уничтожаются). Таким образом, вам нужно повторно запускать свою функцию снова и снова, пока есть выбросы.

Вот код, который работает, пока есть выбросы:

kill_outliers <- function(data, na.rm=TRUE){
q <- quantile(data, probs=c(0.25, 0.75), na.rm=na.rm)
  intq <- 1.5*IQR(data, na.rm=na.rm)
intq_low <- q[1]-intq
intq_high <- q[1]+intq

killed <- data
while(any(killed < intq_low, na.rm=TRUE) | any(killed > intq_high, na.rm= TRUE)){ 
  killed[killed<intq_low] <- NA
  killed[killed>intq_high] <- NA

q <- quantile(killed, probs=c(0.25, 0.75), na.rm=na.rm)
  intq <- 1.5*IQR(killed, na.rm=na.rm)
intq_low <- q[1]-intq
intq_high <- q[1]+intq
}
killed
}

boxplot(kill_outliers(rnorm(9999)))

Кроме того, в вашем функция есть неопределенный объект x, который, вероятно, находится в вашей среде и тоже вызывает проблемы.

...