这里的其他答案指出了将分类因素重新编码为虚拟因素的方法。根据您的应用程序,这可能不是一个很好的解决方案。如果您关心的只是预测,那么这可能没问题,并且 Flo.P 提供的方法应该没问题。 LASSO 将为您找到一组有用的变量,并且您可能不会过度拟合。
然而,如果您有兴趣解释您的模型或事后讨论哪些因素很重要,那么您就处于一个奇怪的境地。 model.matrix 的默认编码在单独使用时有非常具体的解释。 model.matrix 使用所谓的“虚拟编码”。 (我记得把它学为“参考编码”;参见here https://stats.idre.ucla.edu/other/mult-pkg/faq/general/faqwhat-is-dummy-coding/)这意味着,如果包含这些虚拟变量之一,您的模型现在有一个参数,其解释是“该因素的一个水平与该因素的任意选择的其他水平之间的差异”。也许没有选择该因素的其他虚拟人。您可能还会发现,如果因子水平的排序发生变化,您最终会得到不同的模型。
有很多方法可以解决这个问题,但我不会尝试将某些东西混在一起,而是尝试使用组套索。基于上面 Flo.P 的代码:
install.packages("gglasso")
library(gglasso)
create_factor <- function(nb_lvl, n= 100 ){
factor(sample(letters[1:nb_lvl],n, replace = TRUE))}
df <- data.frame(var1 = create_factor(5),
var2 = create_factor(5),
var3 = create_factor(5),
var4 = create_factor(5),
var5 = rnorm(100),
y = rnorm(100))
y <- df$y
x <- model.matrix( ~ ., dplyr::select(df, -y))[, -1]
groups <- c(rep(1:4, each = 4), 5)
fit <- gglasso(x = x, y = y, group = groups, lambda = 1)
fit$beta
因此,由于我们没有指定因子(var1、var2 等)和 y 之间的关系,因此 LASSO 做得很好,并将所有系数设置为 0,除非应用最小量的正则化。您可以使用 lambda(调整参数)的值,或者将选项留空,函数将为您选择一个范围。