在函数内使用randomForest时无法给出子集

时间:2018-11-20 13:57:09

标签: r runtime-error random-forest

我想创建一个函数,在其中使用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函数的参数。我不是专家,所以我可能是错的。

0 个答案:

没有答案