R 为分类变量的每个因子创建二元变量 - 用于评估每个预测变量的重要性和信息增益

use*_*897 1 r categorical-data

我有一个包含 6 个级别的分类变量的数据框。

x$response <- data.frame(rep(1:6,10))
x
Run Code Online (Sandbox Code Playgroud)

我想根据级别创建 6 个不同的二进制列。例如:

x$response1 <- 0
    x$response1[x[,1]=='1'] <- 1

x$response2 <- 0
    x$response2[x[,1]=='2'] <- 1
Run Code Online (Sandbox Code Playgroud)

我可以用上面提到的方法做,但需要重复6次。我想知道是否有更好的方法来做到这一点。如果我有 30 个级别,我该怎么办?

我的最终目标是评估每个预测变量的重要性或信息增益。我这样做是为了为每个响应类别创建一个 logit 模型并使用不同的预测变量组合执行方差分析。但是,我如何评估每个预测变量和响应类别组合的信息增益。

Zac*_*ach 5

x <- data.frame(response = factor(rep(1:6,10)))
model.matrix(~., x)
Run Code Online (Sandbox Code Playgroud)

对于奖励积分:

Matrix::sparse.model.matrix(~., x)
Run Code Online (Sandbox Code Playgroud)

正如 John Madden 在评论中所指出的,R 在大多数建模函数中自动执行前者,例如lm。还要注意,这不是完整的矩阵。R 自动删除第一个虚拟变量以避免虚拟变量 trap。您可以按如下方式关闭此行为(请注意,在这种情况下,拦截项已删除):

model.matrix( ~ 0 + ., x)
Matrix::sparse.model.matrix( ~ 0 + . , x)
Run Code Online (Sandbox Code Playgroud)

对于较大的数据集,sparse.model.matrix可能是您最好的选择:

#100 factor levels
library(microbenchmark)
library(Matrix)
x <- rep(1:100,1000)
microbenchmark(
  mm = model.matrix(~0+factor(x)),
  smm = sparse.model.matrix(~0+factor(x)),
  o = outer(x, unique(x), `==`),
  m = sparseMatrix(1:length(x), match(x,unique(x))),
  times=25
)
Run Code Online (Sandbox Code Playgroud)

sparseMatrix(1:length(x), match(x,unique(x))) 甚至更快,如果这是你需要的。

#10 levels
library(microbenchmark)
library(Matrix)
x <- rep(1:10,10000)
microbenchmark(
  mm = model.matrix(~0+factor(x)),
  smm = sparse.model.matrix(~0+factor(x)),
  o = outer(x, unique(x), `==`),
  sm = sparseMatrix(1:length(x), match(x,unique(x))),
  times=25
)
Run Code Online (Sandbox Code Playgroud)