问题 从R中的模型中提取公式


我正在为许多模型类型构建一个函数,它需要提取用于制作模型的公式。有灵活的方法吗?例如:

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

我需要做的是在传递模型后提取公式对象“方程式”。


12319
2018-03-14 00:25


起源



答案:


你可以得到你想要的东西:

  model$call
# lm(formula = formula)

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

str(model)

由于您从调用环境传递了“公式”(顺便选择不当的名称),因此您可能需要从传递的对象中提取:

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

@JPMac提供了一种更紧凑的方法: 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”的列表项,而不是从调用中提取它。如果缺少$ formula项(在你的情况下),那么它将替换为 formula(x$terms) 我怀疑是在打电话 formula.default 并且查看该函数的操作似乎只是调整对象的环境。


13
2018-03-14 00:29



感谢您的回复 - 我如何实际访问公式对象“公式”。如果我尝试info < - model $ call,info $ formula只给我一个符号对象“formula”。 - mike
我会建议 as.list(model$call)$formula 而不是 model$call[[2]]。 - flodel
@mike:我不确定你在问什么。你决定称你的公式为“公式”,然后将其作为命名参数传递给 lm。 fortunes::fortune("dog") 绝对适用于此。 - 42-
我迟到了...但我认为你可以这样做: formula(model) 获取传递给模型的公式对象。 - ldecicco
这确实看起来更直接。 - 42-


答案:


你可以得到你想要的东西:

  model$call
# lm(formula = formula)

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

str(model)

由于您从调用环境传递了“公式”(顺便选择不当的名称),因此您可能需要从传递的对象中提取:

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

@JPMac提供了一种更紧凑的方法: 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”的列表项,而不是从调用中提取它。如果缺少$ formula项(在你的情况下),那么它将替换为 formula(x$terms) 我怀疑是在打电话 formula.default 并且查看该函数的操作似乎只是调整对象的环境。


13
2018-03-14 00:29



感谢您的回复 - 我如何实际访问公式对象“公式”。如果我尝试info < - model $ call,info $ formula只给我一个符号对象“formula”。 - mike
我会建议 as.list(model$call)$formula 而不是 model$call[[2]]。 - flodel
@mike:我不确定你在问什么。你决定称你的公式为“公式”,然后将其作为命名参数传递给 lm。 fortunes::fortune("dog") 绝对适用于此。 - 42-
我迟到了...但我认为你可以这样做: formula(model) 获取传递给模型的公式对象。 - ldecicco
这确实看起来更直接。 - 42-


如上所述, model$call 会得到你创建的电话 lm 对象,但如果该调用包含一个对象本身作为模型公式,则得到对象名称,而不是公式。

可以访问评估的对象,即公式本身 model$terms (以及关于如何处理的一堆辅助信息)。无论调用的详细信息如何,这都应该有效 lm


3
2018-03-14 00:58