【发布时间】:2013-06-30 23:18:30
【问题描述】:
我想遍历一个很长的潜在解释变量向量,
依次回归每个响应变量。而不是粘贴在一起
模型公式,我正在考虑使用reformulate(),
as demonstrated here.
下面的函数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)
【问题讨论】:
-
我认为使用
update会小心处理此问题,请参阅[stackoverflow.com/questions/13690184/…。您通常可以通过尝试使用data.table来找出这些陷阱——请参阅 [stackoverflow.com/questions/15096811/… -
这工作:
do.call("lm", list(ff, quote(mtcars))) -
@G.Grothendieck -- 谢谢。这看起来不错,而且看起来它不应该在路上造成任何问题。 (另外,感谢 mnel 提供的有趣链接。)
-
还值得看看
add1.lm是如何工作的(使用. ~ .+和update.formula和ti 来记住(或注意)reformulate 只是粘贴方法的包装器。