Есть ли подводные камни в использовании программно построенных формул?
Я хочу пробежаться по длинному вектору потенциальных объясняющих переменных, регрессируя переменную ответа по каждой из них по очереди. Вместо того, чтобы склеивать формулу модели, я думаю об использованииreformulate()
, как показано здесь.
Функцияfun()
Ниже, кажется, делать работу, подгоняя нужную модель. Обратите внимание, однако, что он записывает в свой элемент вызоваимя построенного объекта формулы, а не егостоимость.
## (1) Function using programmatically constructed formula
fun <- function(XX) {
ff <- reformulate(response="mpg", termlabels=XX)
lm(ff, data=mtcars)
}
fun(XX=c("cyl", "disp"))
#
# Call:
# lm(formula = ff, data = mtcars) <<<--- Note recorded call
#
# Coefficients:
# (Intercept) cyl disp
# 34.66099 -1.58728 -0.02058
## (2) Result of directly specified formula (just for purposes of comparison)
lm(mpg ~ cyl + disp, data=mtcars)
#
# Call:
# lm(formula = mpg ~ cyl + disp, data = mtcars) <<<--- Note recorded call
#
# Coefficients:
# (Intercept) cyl disp
# 34.66099 -1.58728 -0.02058
Мой вопрос: Есть ли в этом опасность? Может ли это стать проблемой, если, например, я хочу позже применитьupdate
, или жеpredict
или какая-то другая функция для объекта подгонки модели (возможно, из какой-то другой среды)?
Немного более неловкая альтернатива, которая, тем не менее, дает право записанного звонка правильно - это использоватьeval(substitute())
, Это вообще безопасная конструкция?
fun2 <- function(XX) {
ff <- reformulate(response="mpg", termlabels=XX)
eval(substitute(lm(FF, data=mtcars), list(FF=ff)))
}
fun2(XX=c("cyl", "disp"))$call
## lm(formula = mpg ~ cyl + disp, data = mtcars)