2016-04-13 6 views
6

Я пытаюсь дискретировать непрерывную переменную, разрезая ее на три уровня. Я хочу сделать то же самое для журнала положительной непрерывной переменной (в данном случае - дохода).Дискретизация журнала непрерывной переменной

require(dplyr) 
set.seed(3) 
mydata = data.frame(realinc = rexp(10000)) 

summary(mydata) 

new = mydata %>% 
    select(realinc) %>% 
    mutate(logrealinc = log(realinc), 
     realincTercile = cut(realinc, 3), 
     logrealincTercile = cut(logrealinc, 3), 
     realincTercileNum = as.numeric(realincTercile), 
     logrealincTercileNum = as.numeric(logrealincTercile)) 

new[sample(1:nrow(new), 10),] 

я бы подумал, что использование cut() будет производить одинаковые уровни для дискретных факторов каждых из этих переменных (доходов и журналом доходов), потому что журнал является монотонной функцией. Итак, два столбца справа здесь должны быть равны, но это, похоже, не происходит. Что происходит?

> new[sample(1:nrow(new), 10),] 
     realinc logrealinc realincTercile logrealincTercile realincTercileNum logrealincTercileNum 
7931 0.2967813 -1.21475972 (-0.00805,2.83]  (-4.43,-1.15]     1     2 
9036 0.9511824 -0.05004944 (-0.00805,2.83]  (-1.15,2.15]     1     3 
8204 4.5365676 1.51217069  (2.83,5.66]  (-1.15,2.15]     2     3 
3136 2.0610693 0.72322490 (-0.00805,2.83]  (-1.15,2.15]     1     3 
9708 0.9655805 -0.03502581 (-0.00805,2.83]  (-1.15,2.15]     1     3 
5942 0.9149351 -0.08890215 (-0.00805,2.83]  (-1.15,2.15]     1     3 
4631 0.6987581 -0.35845064 (-0.00805,2.83]  (-1.15,2.15]     1     3 
7309 1.9532566 0.66949804 (-0.00805,2.83]  (-1.15,2.15]     1     3 
7708 0.4220254 -0.86268973 (-0.00805,2.83]  (-1.15,2.15]     1     3 
2965 1.3690976 0.31415186 (-0.00805,2.83]  (-1.15,2.15]     1     3 

Edit: @ комментарий Nicola объясняет источник проблемы. Кажется, что в документации cut «интервалы равной длины» относятся к длине интервала в пространстве непрерывного аргумента. Я изначально интерпретировал «интервалы равной длины», так как количество элементов, назначенных каждому разрезу (на выходе), было бы равно (вместо ввода).

Есть ли функция, которая выполняет то, что я описываю? - где количество элементов на каждом выходном уровне равно? Эквивалентно, где уровни newfunc(realinc) и newfunc(logrealinc) равны?

+3

'log' не является линейным преобразованием. Скажем, что «x» равномерно распределяется между 1 и 5. Ожидаете ли вы, что «log (x)» равномерно распределяется между «log (1)» и «log (5)»? В вашем примере попробуйте 'hist (new $ realinc)' и 'hist (new $ logrealinc)', чтобы увидеть, как они отличаются. 'cut' просто разрезает весь диапазон в основном с постоянными интервалами; элемент может хорошо впадать в интервал и записывать его в другой. – nicola

+0

@nicola Спасибо, это полезно. Я обновил этот вопрос с учетом этого. – Hatshepsut

+1

Вы можете искать разделенный вектор в равные куски – chinsoon12

ответ

5

Если вы хотите, чтобы ваши уровни были одинаково заполнены, взгляните на функцию quantile. Попробуйте, например:

x<-cut(new$realinc,quantile(new$realinc,0:3/3)) 
y<-cut(new$logrealinc,quantile(new$logrealinc,0:3/3)) 
all(as.integer(x)==as.integer(y),na.rm=TRUE) 
#[1] TRUE 
table(x) 
#x 
#(0.000444,0.396]  (0.396,1.12]  (1.12,8.49] 
#   3333    3333    3333