考虑以下数据框。
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
我做错了什么?
下面的内容应该可以用。
rand.f <- function(dat,outcome){
model <- train(x = dat[, cols, drop=F]
, y = dat[, outcome]
, method = "rf"
, trControl = trainControl("cv", number = 2)
, importance = T)
c.e <- model$finalModel$confusion[, "class.error"]
return(c.e)
}
这也适用于数字以及列名的向量,例如:
cols <- colnames(dat1)[5:6]
请注意,我重新命名了 "分组 "变量,因为在这种情况下,分组变量应该是什么有点不清楚。我把它改名为 outcome that is to be predicted,以强调这代表什么。如果你确实试图预测该区域,你可以忽略这个评论。
如果你确实想为你的数据中的不同组别触发这个函数,即为不同的子集分别建立森林,那么你最好在这个函数之外进行。