在列上循环使用purrr和caret进行回归。

问题描述 投票:0回答:1

我试图使用 purrr 和 caret 循环回归,但我在通过论证时遇到了问题。

# 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` 

如果有更好的方法或框架,请建议...

r purrr r-caret
1个回答
1
投票

不确定x,y的方法,但那个函数有一个公式方法,在我看来更容易操作(注意,我改变了 Datadata)

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))
© www.soinside.com 2019 - 2024. All rights reserved.