2016-04-13 13 views
6

Sto cercando di discretizzare una variabile continua, tagliandola in tre livelli. Voglio fare la stessa cosa per il log della variabile continua positiva (in questo caso, reddito).Discretizzando il registro di una variabile continua

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

avrei pensato che l'utilizzo cut() produrrebbe livelli identici per i fattori discretizzati di ciascuna di queste variabili (reddito e log di reddito), a causa di registro è una funzione monotona. Quindi le due colonne qui a destra dovrebbero essere uguali, ma ciò non sembra accadere. Cosa sta succedendo?

> 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: @ commento di Nicola spiega la fonte del problema. Sembra che nella documentazione di , "intervalli di uguale lunghezza" si riferisca alla lunghezza dell'intervallo nello spazio dell'argomento continuo. Inizialmente avevo interpretato "intervalli di uguale lunghezza" nel senso che il numero di elementi assegnati a ciascun taglio (sull'output) sarebbe uguale (invece dell'input).

Esiste una funzione che fa ciò che sto descrivendo? - dove il numero di elementi in ciascun livello di uscita è uguale? Equivalentemente, dove i livelli di newfunc(realinc) e newfunc(logrealinc) sono uguali?

+3

'log' non è una trasformazione lineare. Supponi che 'x' sia distribuito uniformemente tra 1 e 5. Ti aspetti che' log (x) 'sia distribuito uniformemente tra' log (1) 'e' log (5) '? Nel tuo esempio, prova 'hist (new $ realinc)' e 'hist (new $ logrealinc)' per vedere come si differenziano. 'cut' taglia semplicemente l'intero intervallo in intervalli sostanzialmente costanti; un elemento può facilmente cadere in un intervallo e il suo registro in un altro. – nicola

+0

@nicola Grazie, è utile. Ho aggiornato la domanda con questo in mente. – Hatshepsut

+1

È possibile cercare il vettore diviso in parti uguali – chinsoon12

risposta

5

Se vuoi che i tuoi livelli siano ugualmente popolati, dai un'occhiata alla funzione quantile. Prova ad esempio:

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