Избегайте пустых и маленьких групп при использовании pretty_breaks с cut2

Я работаю с переменными, напоминающими данные val значения, созданные ниже:

# data --------------------------------------------------------------------

data("mtcars")
val <- c(mtcars$wt, 10.55) 

Я режу эту переменную следующим образом:

# Cuts --------------------------------------------------------------------

cut_breaks <- pretty_breaks(n = 10, eps.correct = 0)(val)
res <- cut2(x = val, cuts = cut_breaks)

который дает следующие результаты:

> table(res)
res
[ 1, 2) [ 2, 3) [ 3, 4) [ 4, 5) [ 5, 6)       6       7       8       9 [10,11] 
      4       8      16       1       3       0       0       0       0       1

В созданном выводе я хотел бы изменить следующее:

  • Я не заинтересован в создании групп с одним значением. В идеале я бы хотел, чтобы каждая группа имела как минимум 3 / 4 значения. Как это ни парадоксально, я могу оставить группы со значениями 0, так как они будут отброшены позже при объединении моих реальных данных
  • Любые изменения в режущем механизме, должны работать с переменной с целочисленными значениями
  • Порезы должны быть красивыми. Я стараюсь избегать чего-то вроде 1,23 - 2,35. Даже если эти значения будут наиболее разумными, учитывая распределение.
  • По сути, я пытаюсь добиться этого: попытаться создать более-менее даже симпатичную группу, и если получится действительно крошечная группа, то поднимите ее вместе со следующей группой, не беспокойтесь о пустых группах.

Полный код

Для удобства полный код доступен ниже:

# Libs --------------------------------------------------------------------

   Vectorize(require)(package = c("scales", "Hmisc"),
                      character.only = TRUE)


   # data --------------------------------------------------------------------

   data("mtcars") val <- c(mtcars$wt, 10.55) 

   # Cuts --------------------------------------------------------------------

   cut_breaks <- pretty_breaks(n = 10, eps.correct = 0)(val) res <-
   cut2(x = val, cuts = cut_breaks)

Что я пробовал

Первый подход

Я пытался играть с eps.correct = 0 значение в pretty_breaks как в коде:

cut_breaks <- pretty_breaks(n = cuts, eps.correct = 0)(variable)

но ни одно из значений не позволяет мне быть близко

Второй подход

Я также пытался использовать m= 5 аргумент в cut2 функционировать, но я продолжаю приходить к тому же результату.


Ответы на комментарии

Моя функция перерывов

Я попробовал mybreaks функция, но я должен был бы приложить некоторые усилия, чтобы получить хорошие срезы для большего количества странных переменных. Говоря в широком смысле, pretty_breaks хорошо для меня, а крошечные группы, которые встречаются время от времени, нежелательны.

> set.seed(1); require(scales)
> mybreaks <- function(x, n, r=0) {
+   unique(round(quantile(x, seq(0, 1, length=n+1)), r))
+ }
> x <- runif(n = 100)
> pretty_breaks(n = 5)(x)
[1] 0.0 0.2 0.4 0.6 0.8 1.0
> mybreaks(x = x, n = 5)
[1] 0 1

1 ответ

Решение

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

Например, вот функция, которая принимает вектор значений xжелаемое количество групп nи желаемая точка округления r для перерывов, и дает вам предложенные точки разреза.

mybreaks <- function(x, n, r=0) {
  unique(round(quantile(x, seq(0, 1, length=n+1)), r))
}

cut_breaks  <- mybreaks(val, 5)
res <- cut(val, cut_breaks, include.lowest=TRUE)
table(res)

 [2,3]  (3,4] (4,11] 
     8     16      5 
Другие вопросы по тегам