我想创建一个函数,在其中使用randomForest包中的randomForest函数。这采用“子集”参数,该参数是用于训练的数据帧的行号的向量。但是,如果在另一个定义的函数中调用randomForest函数时使用此参数,则会出现错误:
Error in eval(substitute(subset), data, env) :
object 'tr_subset' not found
这是一个可重现的示例,其中我们尝试训练随机森林以基于三个数值预测变量对响应“类型”“ A”或“ B”进行分类:
library(randomForest)
# define a random data frame to train with
test.data = data.frame(
type = rep(NA, times = 500),
x = runif(500),
y = runif(500),
z = runif(500)
)
train.data$type[runif(500) >= 0.5] = "A"
train.data$type[is.na(test.data$type)] = "B"
train.data$type = as.factor(test.data$type)
# define the training range
training.range = sample(500)[1:300]
# formula to use
tr_form = formula(type ~ x + y + z)
# Function that includes the randomForest function
train_rf = function(form, all_data, tr_subset) {
p = randomForest(
formula = form,
data = all_data,
subset = tr_subset,
na.action = na.omit
)
return(p)
}
# test the new defined function
test_tree = train_rf(form = tr_form, all_data = train.data, tr_subset = training.range)
运行此操作会出现错误:
Error in eval(substitute(subset), data, env) :
object 'tr_subset' not found
但是,如果从subset = tr_subset
函数中删除了randomForest
,并且从tr_subset
函数中删除了train_rf
,则此代码可以正常运行,但是整个数据集用于训练!
应注意,当在另一个函数中定义为 not 时,在subset
中使用randomForest
参数是完全可以的,并且是该函数的预期方法,如所述在上面链接的小插图中。
我知道,在此期间,我可以定义另一个仅具有所需行号的训练集,并使用所有这些进行训练,但是请问为什么我的原始代码不起作用?
谢谢。
编辑:我猜想,由于subset()
是基本的R函数,R感到困惑,并认为您想使用基本的R函数,而不是定义randomForest
函数的参数。我不是专家,所以我可能是错的。