Как сделать урезанную гистограмму в R? - PullRequest
0 голосов
/ 18 декабря 2018

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

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

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

hist(x[x<2])

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

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

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

Ответы [ 2 ]

0 голосов
/ 18 декабря 2018

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

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="")

enter image description here

0 голосов
/ 18 декабря 2018

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

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

hist(trim(x))

enter image description here

Или, обрезать по процентили.

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

hist(trim_q(x, 0.01, 0.99))

Обрезает данные между первым и девяносто девятым процентилем.

enter image description here


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

Первая функция обрезки не совсем правильная.Я думаю, что Тьюки определил это в 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))

enter image description here

...