2016-04-13 13 views
6

Ich versuche eine kontinuierliche Variable zu diskretisieren, indem ich sie in drei Ebenen zerschneide. Ich möchte dasselbe für den Logarithmus der positiven kontinuierlichen Variablen (in diesem Fall Einkommen) tun.Diskretisieren des Logs einer kontinuierlichen Variablen

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),] 

Ich hätte gedacht, dass cut() mit identischen Ebenen für die diskretisierten Faktoren jeder dieser Variablen (Einkommen und log Einkommen) erzeugen würde, da log eine Funktion monoton ist. Also sollten die zwei Spalten auf der rechten Seite gleich sein, aber das scheint nicht zu passieren. Was ist los?

> 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: @ Kommentar Nicolas erklärt die Quelle des Problems. Es scheint, dass in der Dokumentation von "gleich lange Intervalle" auf die Länge des Intervalls im Raum des kontinuierlichen Arguments verweist. Ich hatte ursprünglich "Intervalle mit gleicher Länge" so interpretiert, dass die Anzahl der jedem Schnitt (am Ausgang) zugewiesenen Elemente gleich wäre (anstelle der Eingabe).

Gibt es eine Funktion, die das tut, was ich beschreibe? - Wo ist die Anzahl der Elemente in jedem Ausgangspegel gleich? Gleichwertig, wo die Niveaus newfunc(realinc) und newfunc(logrealinc) gleich sind?

+3

'log' ist keine lineare Transformation. Nehmen wir an, dass "x" gleichmäßig zwischen 1 und 5 verteilt ist. Erwarten Sie, dass "log (x)" gleichmäßig zwischen "log (1)" und "log (5)" verteilt ist? In Ihrem Beispiel versuchen Sie 'hist (new $ realinc)' und 'hist (new $ logrealinc)', um zu sehen, wie sie sich unterscheiden. 'cut' schneidet nur den gesamten Bereich in im Wesentlichen konstanten Intervallen; Ein Element kann durchaus in ein Intervall fallen und sich in ein anderes einreihen. – nicola

+0

@nicola Danke, das ist hilfreich. Ich habe die Frage in diesem Sinne aktualisiert. – Hatshepsut

+1

Sie können nach Split-Vektor in gleiche Stücke – chinsoon12

Antwort

5

Wenn Sie möchten, dass Ihre Ebenen gleichmäßig belegt sind, sehen Sie sich die quantile-Funktion an. Versuchen Sie zum Beispiel:

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