【问题标题】:How do I bin data based on weight of evidence bins from the "Information" package in R如何根据 R 中“信息”包中证据箱的重量对数据进行分箱
【发布时间】:2016-12-06 16:04:50
【问题描述】:

R中的以下代码行

library("Information")

set.seed(100)

Y <- sample(c(0,1), replace=TRUE, size=50)
X <- dnorm(rnorm(50))

data <- as.data.frame(cbind(X,Y))

create_infotables(data, y = "Y", bins = 5)

生成输出:

$Tables
$Tables$X
            X  N Percent        WOE         IV
1 [0.01,0.09]  9    0.18 -0.3834862 0.02655379
2  [0.1,0.23] 10    0.20  0.2451225 0.03839546
3 [0.25,0.36] 10    0.20 -0.5658078 0.10217411
4 [0.36,0.39] 10    0.20  0.2451225 0.11401578
5  [0.39,0.4] 11    0.22  0.3992731 0.14809223


$Summary
  Variable        IV
1        X 0.1480922

attr(,"class")
[1] "Information"

现在我要实现的是将数据框的X列转换为包含数据点对应的bin的WOE值的列。因此,数据框中的 X 值在 [0.01,0.09] 区间内的观察值应全部替换为值 -0.3834862,依此类推。

我该怎么做?

cut() 我离得更近了一点:

> cut(X, c(0,01.09,0.23,0.36,0.39,0.4),
      labels = c(-0.3834862,0.2451225,-0.5658078,0.2451225,0.3992731))

 [1] -0.5658078 0.2451225  -0.5658078 -0.3834862 -0.5658078 0.2451225  -0.3834862 0.2451225  0.2451225  0.2451225 
[11] -0.5658078 0.2451225  -0.5658078 -0.3834862 0.2451225  0.2451225  -0.3834862 -0.3834862 0.2451225  0.2451225 
[21] -0.3834862 -0.5658078 -0.3834862 0.2451225  -0.3834862 -0.5658078 -0.3834862 0.2451225  -0.3834862 -0.3834862
[31] 0.2451225  -0.3834862 -0.3834862 -0.3834862 0.2451225  -0.5658078 0.2451225  -0.5658078 -0.3834862 0.2451225 
[41] 0.2451225  0.2451225  0.2451225  0.2451225  0.2451225  -0.5658078 -0.3834862 -0.3834862 -0.3834862 -0.3834862
Levels: -0.3834862 0.2451225 -0.5658078 0.2451225 0.3992731
Warning message:
In `levels<-`(`*tmp*`, value = if (nl == nL) as.character(labels) else paste0(labels,  :
  duplicated levels in factors are deprecated

但是结果中的值是因子标签。 as.numeric() 没有帮助,因为它返回标签编号。 cut() 的另一个问题是我不知道如何从 $Tables$X$X 中提取切割点并将它们传递给切割函数。

【问题讨论】:

  • 函数cut可以将X转换成一个名义变量,你可以用它来分配你想要的值。
  • 我使用 cut 离得更近了一点:
  • 听起来您想存储和使用从create_infotables() 创建的中断,然后在cut() 中使用它们。如果您想要整数级别的向量而不是标签,请使用cut(..., labels=F)

标签: r binning


【解决方案1】:

但是结果中的值是因子标签。 as.numeric() 没有帮助,因为它返回标签编号。

你期待什么?通常,cut() 会为您提供一个因子输出,其(字符串)标签包含中断。

如果您只想获取级别代码的整数向量,而不是(字符串)标签,请执行cut(, ...labels=FALSE)

但显然你也不想要(那你想要什么?)。

cut() 的另一个问题是我不知道如何从 $Tables$X$X 中提取切割点并将它们传递给切割函数。

你想从create_infotables()获取中断向量:

  • 存储输出:mytbl &lt;- create_infotables(data, y = "Y", bins = 5)
  • 然后找出mytbl 的哪个属性可以访问以获得您的自定义休息时间。查看ls(mytbl)attributes(mytbl)。说它是mytbl$mybreaks(我不知道那个包,但你明白了)。
  • 然后使用您的自定义休息时间cut(mytbl, breaks=mytbl$mybreaks)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-15
    • 2014-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多