Это не редкая методология и, конечно, не уникальная для randomForests
.
mpg <- mtcars$mpg
disp <- mtcars$disp
lm(mpg~disp)
# Call:
# lm(formula = mpg ~ disp)
# Coefficients:
# (Intercept) disp
# 29.59985 -0.04122
Таким образом, когда lm
(в данном случае) пытается разрешить переменные, указанные в формуле mpg~disp
, он смотрит на data
, если предоставлен, то в вызывающей среде. Еще пример:
rm(mpg,disp)
mpg2 <- mtcars$mpg
lm(mpg2~disp)
# Error in eval(predvars, data, env) : object 'disp' not found
lm(mpg2~disp, data=mtcars)
# Call:
# lm(formula = mpg2 ~ disp, data = mtcars)
# Coefficients:
# (Intercept) disp
# 29.59985 -0.04122
(Обратите внимание, что mpg2
отсутствует в mtcars
, поэтому для поиска данных использовались оба метода. Я не использую эту функциональность, предпочитая упругий шаг предоставления всех данных в вызове; это не сложно подумать о примерах, где воспроизводимость страдает, если это не так.
Аналогичным образом, многие аналогичные функции (включая lm
) допускают этот аргумент subset=
, поэтому тот факт, что randomForests
включает его, соответствует . Я полагаю, что это всего лишь аргумент удобства, поскольку следующие данные примерно эквивалентны:
lm(mpg~disp, data=mtcars, subset= cyl==4)
lm(mpg~disp, data=mtcars[mtcars$cyl == 4,])
mt <- mtcars[ mtcars$cyl == 4, ]
lm(mpg~disp, data=mt)
Использование subset
позволяет использовать несколько более простые ссылки (cyl
против mtcars$cyl
), и его полезность усложняется, когда увеличивается число ссылочных переменных (т. Е. Для целей "code golf"). Но это также можно сделать с помощью других механизмов, таких как with
, так что ... в основном это личные предпочтения.
Редактировать : как указывал Джоран, randomForest
(и другие, но особенно не lm
) можно вызывать с помощью любой формулы, как обычно используйте аргумент данных или указав аргументы предиктора / ответа отдельно с аргументами x
и y
, как в следующих примерах, взятых из ?randomForest
(игнорируйте другие аргументы как несовместимые):
iris.rf <- randomForest(Species ~ ., data=iris, importance=TRUE, proximity=TRUE)
iris.rrf <- randomForest(iris[-1], iris[[1]], ntree=101, proximity=TRUE, oob.prox=FALSE)