2012-03-14 51 views
8

我正在为许多需要提取用于制作模型的公式的模型类型构建一个函数。有没有灵活的方法来做到这一点?例如:从模型中提取公式R

x <- rnorm(10) 
y <- rnorm(10) 
z <- rnorm(10) 
equation <- z ~ x + y 
model <- lm(equation) 

我,我需要做的是提取公式对象“公式”一旦被传递模型。

回答

12

你可以让你的想要的东西:

model$call 
# lm(formula = formula) 

如果你想看到什么,我也发现了,然后使用:

str(model) 

既然你通过“公式”(坏的选择名称)从呼叫环境,你可能需要从你通过的对象中提取:

eval(model$call[[2]]) 
# z ~ x + y 

@JPM ac提供了更简洁的方法:formula(model)。同样值得关注的是formula.lm函数使用的机制。名为formula的函数是通用的,您可以使用methods(formula)来查看已定义的S3方法。由于formula.lm方法在其结尾有,你需要用它`getAnywhere:

> getAnywhere(formula.lm) 
A single object matching ‘formula.lm’ was found 
It was found in the following places 
    registered S3 method for formula from namespace stats 
    namespace:stats 
with value 

function (x, ...) 
{ 
    form <- x$formula 
    if (!is.null(form)) { 
     form <- formula(x$terms) 
     environment(form) <- environment(x$formula) 
     form 
    } 
    else formula(x$terms) 
} 
<bytecode: 0x36ff26158> 
<environment: namespace:stats> 

所以它是用“$”来提取名为“公式”列表项目,而不是从通话拉。如果$公式项丢失(它是你的情况),然后它用formula(x$terms)代替它,我怀疑这是调用formula.default,并且看着该函数的操作似乎只是调整对象的环境。

+0

感谢您的回应 - 我如何实际访问公式对象“公式”。如果我尝试info < - model $ call,info $公式只是给我一个符号对象“公式”。 – mike 2012-03-14 00:34:47

+0

我会建议'as.list(model $ call)$ formula'而不是'model $ call [[2]]''。 – flodel 2012-03-14 00:49:58

+0

@mike:我不确定你在问什么。你决定调用你的公式“公式”,然后把它作为命名参数传递给'lm'。 'fortunes :: fortune(“dog”)'绝对适用于此。 – 2012-03-14 01:37:35

3

如上所述,model$call会为您打电话创建lm对象,但如果该调用包含对象本身作为模型公式,则会获取对象名称,而不是公式。

评估对象,即公式本身,可以在model$terms(以及关于如何处理它的一系列辅助信息)中访问。无论对lm的呼叫的详细情况如何,这都应该起作用。