我想遍历一个长向量的潜在解释变量,依次回归每个响应变量。我没有将模型公式粘贴在一起,而是考虑使用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)