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



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

x$response <- data.frame(rep(1:6,10))
x

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

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

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

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

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

附加积分:

Matrix::sparse.model.matrix(~., x)

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

model.matrix( ~ 0 + ., x)
Matrix::sparse.model.matrix( ~ 0 + . , x)

对于较大的数据集,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
)

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
)

扎克方法的更有效版本

outer(x, sort(unique(x)), `==`)

最新更新