使用 purrr 和 caret 遍历列进行回归

loop over columns for regression using purrr and caret

我正在尝试使用 purrr 和插入符号循环回归,但我无法通过争论。

# sample dataframe
foo <- data.frame(y1 = runif(10),
                  y2 = runif(10),
                  y3 = runif(10),
                  x1 = runif(10),
                  x2 = runif(10),
                  x3 = runif(10)
                  )

# list of dependent and independent variables
Yvars <- c("y1","y2","y3")
Xvars <- c("x1","x2","x3")


# library(caret)

# custom caret function to loop over vars
caretlm <- function(xvars, yvars, data) {
  set.seed(1123)
  lmFitTest <- train(x = eval(substitute(xvars)), y = eval(substitute(yvars)), data = data,
                     method = "lm", 
                     trControl = trainControl(method = "cv")
  )
}

# library(purrr)

modellist_lm <- map2(xvars, yvars, ~caretlm(.x, .y, foo) )
# Error in eval(substitute(xvars)) : object '.x' not found 

当我不使用 eval 和 substitute 时,我会得到另一个错误

caretlm2 <- function(xvars, yvars, data) {
  set.seed(1123)
  lmFitTest <- train(x = xvars, y = yvars, data = data,
                     method = "lm", 
                     trControl = trainControl(method = "cv")
  )
}


modellist_lm <- map2(xvars, yvars, ~caretlm2(.x, .y, foo) )

# Error: Please use column names for `x` 

如有更好的方法或框架请指教..

不确定 x, y 方法,但该函数有一个公式方法,在我看来更容易使用(请注意,我将 Data 更改为 data

caretlm <- function(xvars, yvars, data) {
  set.seed(1123)
  lmFitTest <- train(reformulate(xvars, yvars), data = foo,
                     method = "lm", 
                     trControl = trainControl(method = "cv")
  )
}

modellist_lm <- map2(Xvars, Yvars, ~caretlm(.x, .y, foo))