Работа со связями в quantcut()

Я пытаюсь использовать функцию R quantcut() для перекодирования числовой переменной как фактора с уровнями, соответствующими квантилям. Например:

> X
[1]  6  4  9  6  1  2  5  3  5  7 10  7  2  7  7  5  6  6  3  4  6  4  2  7  6  7
[27]  4  3  5  3  7  6  8 12  4  4  0  1  7  6  7  4  7  1  1  1  2  3  3  1  1  6
[53]  5  3  1  1  1  3  3  3  1  1  3  1  1  1  3  3  0  1  3  1  8  5  3  0  0  2
[79]  1  3  8  0  1  4  1  1  1  1  1  1  3  2  1  4  1  5  5 12  7  2  6  6  2  6
[105]  0  1  4  1  4  0  7  3  2  1  1  8  5  5  3  0  5  6  2  4  2  2  2  6  4  2
[131]  2  2  2  6  8  5  1  2  8  3  2  7  4  6  6  6  7  5  1  5  5  6  1  4  4  5
[157]  6  2  4  7  2  4 10  6  3  5  2  2  6  6  2  4  5  7  4  5 11  6  6  8  2  4
[183]  4  6 12 16  9  7 14 13 11  5  5  2  2  7  7  6  4  3  4  3  5  4  5  7  9  4
[209]  3 12  4  4  4  8  7  6  1  3  6  7  5  5  6  9  6  4  7  8  5  6  3  6  4  7
[235]  3  3  4  7  5  7  5  9  5  8  3  4  3  2  5  2  4  3  8  4  2  2  1  5  3  5
[261]  8  5  6  4  5  1  1  2  6  2  7  2  4  4  3  3  4 10  5  6 10  2  5  5  0  1
[287]  6  2  5  4  6  6  9  5  5  6  3  8  1  5  1  8  5  2  5  2  4  2  4  4

bins=10
labels = 1:bins
library(gtools)
x2 = quantcut(X, q = seq(0, 1, by=1/bins), labels=labels)

Я получаю сообщение об ошибке: "Ошибка в cut.default(x[!flag], breaks = newquant, include.lowest = TRUE, : "breaks" не уникальны". Я думал, что это из-за того, что в квантилях есть связи, но документация для quantcut специально показывает пример того, как функция может обрабатывать связи, используя меньше интервалов.Ошибка возникает независимо от того, указываю ли я аргумент labels.

Мы будем очень признательны за любые советы.

РЕДАКТИРОВАТЬ: Вот код для ввода переменной X:

X = c(6L, 4L, 9L, 6L, 1L, 2L, 5L, 3L, 5L, 7L, 10L, 7L, 2L, 7L, 7L, 
5L, 6L, 6L, 3L, 4L, 6L, 4L, 2L, 7L, 6L, 7L, 4L, 3L, 5L, 3L, 7L, 
6L, 8L, 12L, 4L, 4L, 0L, 1L, 7L, 6L, 7L, 4L, 7L, 1L, 1L, 1L, 
2L, 3L, 3L, 1L, 1L, 6L, 5L, 3L, 1L, 1L, 1L, 3L, 3L, 3L, 1L, 1L, 
3L, 1L, 1L, 1L, 3L, 3L, 0L, 1L, 3L, 1L, 8L, 5L, 3L, 0L, 0L, 2L, 
1L, 3L, 8L, 0L, 1L, 4L, 1L, 1L, 1L, 1L, 1L, 1L, 3L, 2L, 1L, 4L, 
1L, 5L, 5L, 12L, 7L, 2L, 6L, 6L, 2L, 6L, 0L, 1L, 4L, 1L, 4L, 
0L, 7L, 3L, 2L, 1L, 1L, 8L, 5L, 5L, 3L, 0L, 5L, 6L, 2L, 4L, 2L, 
2L, 2L, 6L, 4L, 2L, 2L, 2L, 2L, 6L, 8L, 5L, 1L, 2L, 8L, 3L, 2L, 
7L, 4L, 6L, 6L, 6L, 7L, 5L, 1L, 5L, 5L, 6L, 1L, 4L, 4L, 5L, 6L, 
2L, 4L, 7L, 2L, 4L, 10L, 6L, 3L, 5L, 2L, 2L, 6L, 6L, 2L, 4L, 
5L, 7L, 4L, 5L, 11L, 6L, 6L, 8L, 2L, 4L, 4L, 6L, 12L, 16L, 9L, 
7L, 14L, 13L, 11L, 5L, 5L, 2L, 2L, 7L, 7L, 6L, 4L, 3L, 4L, 3L, 
5L, 4L, 5L, 7L, 9L, 4L, 3L, 12L, 4L, 4L, 4L, 8L, 7L, 6L, 1L, 
3L, 6L, 7L, 5L, 5L, 6L, 9L, 6L, 4L, 7L, 8L, 5L, 6L, 3L, 6L, 4L, 
7L, 3L, 3L, 4L, 7L, 5L, 7L, 5L, 9L, 5L, 8L, 3L, 4L, 3L, 2L, 5L, 
2L, 4L, 3L, 8L, 4L, 2L, 2L, 1L, 5L, 3L, 5L, 8L, 5L, 6L, 4L, 5L, 
1L, 1L, 2L, 6L, 2L, 7L, 2L, 4L, 4L, 3L, 3L, 4L, 10L, 5L, 6L, 
10L, 2L, 5L, 5L, 0L, 1L, 6L, 2L, 5L, 4L, 6L, 6L, 9L, 5L, 5L, 
6L, 3L, 8L, 1L, 5L, 1L, 8L, 5L, 2L, 5L, 2L, 4L, 2L, 4L, 4L)

person half-pass    schedule 06.07.2012    source источник


Ответы (1)


Хорошо, проблему можно проследить здесь, где, как вы говорите, квантили 70% и 80% одинаковы. quantile используется внутри компании quantcut

quantile(X,probs=seq(0,1,0.1))
  0%  10%  20%  30%  40%  50%  60%  70%  80%  90% 100% 
 0.0  1.0  2.0  3.0  3.6  4.0  5.0  6.0  6.0  8.0 16.0 

Я не вижу, как решить эту проблему с помощью самого quantcut, но вы всегда можете просто использовать комбинацию cut, quantile и unique, чтобы разобраться. Из того, что я могу сказать, это то, что quantcut делает внутренне, когда есть связи.

result <- cut(X,unique(quantile(X,probs=seq(0,1,0.1))),include.lowest=TRUE)

> result[2:10]
 [1] (3.6,4] (8,16]  (5,6]   [0,1]   (1,2]   (4,5]   (2,3]   (4,5]   (6,8]  
#Levels: [0,1] (1,2] (2,3] (3,3.6] (3.6,4] (4,5] (5,6] (6,8] (8,16]
> X[2:10]
 [1]      4      9      6       1       2       5       3       5       7
person thelatemail    schedule 06.07.2012
comment
Спасибо. Я играл с этим, и я не понимаю, почему пропускается уровень 4, а не уровень 8 или 9 (поскольку эти уровни представляют связанные квантили). Если я вызываю уровни (результат), он показывает 1:9. Но если я вызову таблицу (результат), будет 0 наблюдений уровня 4. - person half-pass; 07.07.2012
comment
@half-pass - я предполагаю, что это связано с тем, что квантильная группировка - это >3 to 3.6, в которую невозможно попасть целым числом. Вам может понадобиться floor точки останова функции cut, чтобы некоторые значения попали в эту группу: result <- cut(X,unique(floor(quantile(X,probs=seq(0,1,0.1)))),include.lowest=TRUE) - person thelatemail; 07.07.2012
comment
Можно ли использовать это решение и при этом сохранить квантильные метки? Я попробовал ваше предложение, включая такие ярлыки: result <- cut(X, labels=c(1:10), breaks= unique(quantile(X,probs=seq(0,1,0.1))),include.lowest=TRUE), но получаю сообщение об ошибке: lengths of 'breaks' and 'labels' differ - person rafa.pereira; 07.09.2015