您可以使用model.matrix
.
我创建了一个data.frame。y 是目标变量。
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 = create_factor(2))
# var1 var2 var3 var4 var5 y
# 1 a c c b -0.58655607 b
# 2 d a e a 0.52151994 a
# 3 a b d a -0.04792142 b
# 4 d a a d -0.41754957 b
# 5 a d e e -0.29887004 a
选择所有因子变量。我使用dplyr::select_if
然后解析变量名称来获得一个表达式y ~ var1 + var2 +var3 +var4
library(dplyr)
library(stringr)
library(glmnet)
vars_name <- df %>%
select(-y) %>%
select_if(is.factor) %>%
colnames() %>%
str_c(collapse = "+")
model_string <- paste("y ~",vars_name )
用 . 创建虚拟变量model.matrix
。不要忘记将as.formula
字符强制转换为公式。
x_train <- model.matrix(as.formula(model_string), df)
适合您的模型。
lasso_model <- cv.glmnet(x=x_train,y = df$y, family = "binomial", alpha=1, nfolds=10)
代码可以简化。但想法就在这里。