【问题标题】:Discretizing the log of a continuous variable离散化连续变量的对数
【发布时间】:2016-04-13 04:55:11
【问题描述】:

我正在尝试离散化一个连续变量,将其分成三个级别。我想对正连续变量(在本例中为收入)的对数做同样的事情。

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的文档中,“等长间隔”是指连续参数空间中的间隔长度。我最初将“等长间隔”解释为意味着分配给每个剪辑(在输出上)的元素数量将相等(而不是输入)。

是否有一个功能可以实现我所描述的功能? -- 每个输出级别中的元素数量是相等的吗?等效地,newfunc(realinc)newfunc(logrealinc) 的级别在哪里相等?

【问题讨论】:

  • log 不是线性变换。假设 x 均匀分布在 1 和 5 之间。您是否期望 log(x) 均匀分布在 log(1)log(5) 之间?在您的示例中,尝试hist(new$realinc)hist(new$logrealinc) 看看它们有何不同。 cut 只是以基本恒定的间隔切割整个范围;一个元素可以很好地落入一个区间,而它的日志也可以落入另一个区间。
  • @nicola 谢谢,这很有帮助。考虑到这一点,我已经更新了问题。
  • 你可以搜索分割向量成相等的块

标签: r discretization


【解决方案1】:

如果您希望您的关卡同样填充,请查看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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-08-10
    • 2018-05-16
    • 1970-01-01
    • 1970-01-01
    • 2020-04-04
    • 1970-01-01
    • 2020-09-04
    相关资源
    最近更新 更多