Не может дать подмножество при использовании randomForest внутри функции - PullRequest
0 голосов
/ 20 ноября 2018

Я хочу создать функцию, которая использует внутри нее функцию randomForest из пакета randomForest .Это принимает аргумент "subset", который представляет собой вектор номеров строк фрейма данных, который будет использоваться для обучения.Однако, если я использую этот аргумент при вызове функции 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, этот код работает нормально, однако весь набор данных используется для обучения!

Следует отметить, что при использовании subset аргумент в randomForest, когда не , определенный в другой функции, работает совершенно нормально и является предполагаемым методом для функции, как описано в виньетке, связанной выше.

Я знаю в среднемВ то время я мог бы просто определить другой обучающий набор, который имеет только требуемые номера строк, и тренироваться, используя все это, но есть ли причина, по которой мой оригинальный код не работает, пожалуйста?

Спасибо.

РЕДАКТИРОВАТЬ: я предполагаю, что, поскольку subset() является базовой функцией R, R запутывается и думает, что вы хотите использовать базовую функцию R, а не определять аргумент функции randomForest.Но я не эксперт, поэтому могу ошибаться.

...