2016-04-13 18 views
6

連続変数を離散化して、3つのレベルに分けようとしています。私は、正の連続変数(この場合は収入)の対数について同じことをしたいと思います。連続変数のログの離散

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()を使用して、これらの変数のそれぞれの離散要素に対して同一のレベルを生成することを考えているだろう。ここの2つの列は等しいはずですが、それは起こりそうにありません。どうしたの?

> 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 

編集:ニコラさんのコメント@問題の原因を説明しています。 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 
関連する問題