Как сделать обрезанную гистограмму в R?

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

x <- c(seq(0, 1, 0.05)^2, 5)
hist(x)

Вы не можете ничего увидеть о распределении из-за одного выброса. Я мог просто вручную исключить выбросы.

hist(x[x<2])

По сути, это то, что я хочу, но это требует от меня определения точного отсечения, и это неудобно, если данные представляют собой не просто x, а какое-то сложное выражение. Я бы предпочел указать hist, чтобы он обрезал несколько самых больших и самых маленьких процентов данных, аналогично параметру обрезки в функции mean.

Я мог бы также вручную установить xlim и перерывы, но это еще более неудобно.

Есть ли хороший способ удалить самые экстремальные значения перед построением графика?

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
3 590
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

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

trim <- function(x){
  x[(x > mean(x)-1.5*IQR(x)) & (x < mean(x)+1.5*IQR(x))]
}

hist(trim(x))

Или выполните обрезку по процентилю.

trim_q <- function(x, lb, ub){
  x[(x > quantile(x, lb)) & (x < quantile(x, ub))]
}

hist(trim_q(x, 0.01, 0.99))

Это усекает данные между первым и девяносто девятым процентилем.


Редактировать

Первая функция обрезки не совсем правильная. Я думаю, что Тьюки определил его как 1,5-кратный межквартильный размах выше и ниже первого и третьего квартилей, а не среднее значение, как я сделал здесь. Должно получиться так:

trim_t <- function(x){
  x[(x > quantile(x, 0.25)-1.5*IQR(x)) & (x < quantile(x, 0.75)+1.5*IQR(x))]
}

hist(trim_t(x))

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

quarague 18.12.2018 14:31

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

set.seed(1)
x <- rnorm(40)^3
x <- round(x, 1)*10

par(mfrow=c(2, 1), mar=c(3, 3, 0.1, 1))
h <- hist(x, main = "")

h[1:4] <- lapply(h[1:4], function(y) head(y[-1], -1))
plot(h, main = "")

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