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

編集: @nicola のコメントは、問題の原因を説明しています。のドキュメントではcut、「等長間隔」は、連続引数の空間内の間隔の長さを指しているようです。私は当初、「等長間隔」を、(出力の) 各カットに割り当てられた要素の数が (入力の代わりに) 等しいことを意味すると解釈していました。

私が説明していることを行う機能はありますか?-- 各出力レベルの要素数が等しい場所は? newfunc(realinc)同様に、とのレベルnewfunc(logrealinc)が等しい場所はどこですか?

4

1 に答える 1

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
于 2016-04-13T05:35:12.553 に答える