【发布时间】:2020-09-09 10:53:00
【问题描述】:
考虑以下数据框:
dat1 <- data.frame(Loc = rep(c("NY","MA","FL","GA"), each = 1000),
Region = rep(c("a","b","c","d"),each = 1000),
ID = rep(c(1:10), each=200),
var1 = rnorm(1000),
var2=rnorm(1000),
var3=rnorm(1000))
Loc 和Region 是ID 的两个分组变量。假设我有几个其他数据框,例如dat1。我正在尝试编写一个函数,该函数将自动将随机森林模型拟合到数据中。我想指定我希望它使用的数据框、分组变量和列。
我尝试了以下函数的变体,但是当我尝试运行它们时,不断收到错误消息,上面写着Error in get(dat, envir = .GlobalEnv) : invalid first argument
library(caret)
library(randomForest)
rand.f <- function(dat,groupvar,cols){
model <- train(groupvar ~ paste0(cols,collapse = "+"), data = dat, method = "rf", trControl = trainControl("cv", number = 10), importance = T)
c.e <- model$finalModel$confusion[, "class.error"]
print(c.e)
}
rand.f(dat="dat1", groupvar = "Region", cols = 5:6)
model$bestTune
##################
rand.f <- function(dat,groupvar,cols){
model <- train(get(dat, envir=.GlobalEnv)[,groupvar] ~ paste0(cols,collapse = "+"), data = dat, method = "rf", trControl = trainControl("cv", number = 10), importance = T)
c.e <- model$finalModel$confusion[, "class.error"]
print(c.e)
}
rand.f(dat="dat1", groupvar = "Region", cols = 5:6)
model$bestTune
我做错了什么?
【问题讨论】:
-
您创建/使用公式的方式存在缺陷。只需看看执行时会发生什么,例如
groupvar ~ paste0(cols,collapse = "+") -
@coffeinjunky 我明白了,有没有办法在
train()调用中指定这些术语(正如我试图做的那样),或者在函数中创建新的(临时)对象更好从您的环境中获取并保存指定的数据,并将这些数据提供给train()函数?
标签: r function functional-programming random-forest r-caret