离散化连续变量的对数
Discretizing the log of a continuous variable
我正在尝试离散化一个连续变量,将其分成三个级别。我想对正连续变量(在本例中为收入)的对数做同样的事情。
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
编辑: @nicola 的评论解释了问题的根源。似乎在cut
的文档中,"equal-length intervals"指的是连续参数space中的区间长度。我最初将 "equal-length intervals" 解释为意味着分配给每个切割(在输出上)的元素数量将相等(而不是输入)。
是否有功能可以实现我所描述的功能? -- 每个输出级别中的元素数量是否相等?等价地,newfunc(realinc)
和newfunc(logrealinc)
的水平在哪里相等?
如果您希望您的关卡均匀填充,请查看 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
我正在尝试离散化一个连续变量,将其分成三个级别。我想对正连续变量(在本例中为收入)的对数做同样的事情。
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
编辑: @nicola 的评论解释了问题的根源。似乎在cut
的文档中,"equal-length intervals"指的是连续参数space中的区间长度。我最初将 "equal-length intervals" 解释为意味着分配给每个切割(在输出上)的元素数量将相等(而不是输入)。
是否有功能可以实现我所描述的功能? -- 每个输出级别中的元素数量是否相等?等价地,newfunc(realinc)
和newfunc(logrealinc)
的水平在哪里相等?
如果您希望您的关卡均匀填充,请查看 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