从lm系数中提取公式(R)

7
我有一个lm对象,想要提取带有系数的公式。我知道如何提取不带系数的公式,以及如何获取不带公式的系数,但是我不知道如何获得例如y ~ 10 + 1.25b而不是y~b或者截距、b等的表格。
这是我目前使用的代码:
a = c(1, 2, 5)
b = c(12, 15, 20)

model = lm(a~b)
summary(model)
formula = formula(model)
formula
coefficients(model)

我想从上面得到的是y ~ -5.326 + .51b。

谢谢。

编辑:在我的实际代码中,我使用了超过63个预测变量和18个不同的模型,因此我希望有一些可以轻松扩展的解决方案。


如果您添加第二个预测器,代码将自动将其添加到公式中。试一试。 - lukeA
哦,我想当我第一次看到它时就尝试过了,但我忘记编辑实际模型了。干杯 :-) - user3051065
4个回答

12
as.formula(
  paste0("y ~ ", round(coefficients(model)[1],2), " + ", 
    paste(sprintf("%.2f * %s", 
                  coefficients(model)[-1],  
                  names(coefficients(model)[-1])), 
          collapse=" + ")
  )
)
# y ~ -5.33 + 0.51 * b

3
你好,感谢你对我提供的代码进行了测试。不过我想知道是否有更容易扩展的方法呢?比如说,如果我再添加一个预测器c,那么我是否需要另外再添加一行或两行代码来获取相关的内容呢?对于大多数模型而言,可能会涉及到30个以上的预测器,这样操作起来可能会非常麻烦(并且由于我对r语言还不太熟悉,所以这段代码对我来说还有些难以理解)。 - user3051065
@user3051065,我已经就你的可扩展性问题发布了一个新答案。请见下文。 - Scratch'N'Purr

10
我建议对lukeA的优秀回答进行修改:

我可以建议对lukeA的优秀回答进行修改:

as.formula(
  paste0("y ~ ", round(coefficients(model)[1],2), "", 
    paste(sprintf(" %+.2f*%s ", 
                  coefficients(model)[-1],  
                  names(coefficients(model)[-1])), 
          collapse="")
  )
)

这将确保负系数被正确打印。

假设您得到了一个负的b系数,那么输出将会是:

# y ~ -5.33 + -0.51 * b

替代

# y ~ -5.33 - 0.51 * b

3

我发现了一种通用的方法,使用替换来创建带有系数的模型公式。这比手动使用paste0构建字符串要更加灵活。

例如:

我已经拥有优化后的系数模型:

> model
Nonlinear regression model
  model: players ~ pop * (decay^days_from_start) + ycept
   data: data
      pop     decay     ycept 
6.896e+06 2.633e-01 4.300e+05 
 residual sum-of-squares: 1.64e+08

Number of iterations to convergence: 12 
Achieved convergence tolerance: 1.49e-08

这些是系数:

> coef(model)
         pop        decay        ycept 
6.896421e+06 2.632545e-01 4.300453e+05 

将所有内容整合在一起:

将所有部分组合在一起:

> newFormula = as.formula(substituteDirect(formula(model), as.list(coef(model))))
> newFormula
players ~ 6896421.4399627 * (0.263254460933212^days_from_start) + 430045.26142703

0

在编程中,使用混合broomdplyr库的替代方法:

    get_formula <- function(model) {
  
  broom::tidy(model)[, 1:2] %>%
    mutate(sign = ifelse(sign(estimate) == 1, ' + ', ' - ')) %>% #coeff signs
    mutate_if(is.numeric, ~ abs(round(., 2))) %>% #for improving formatting
    mutate(a = ifelse(term == '(Intercept)', paste0('y ~ ', estimate), paste0(sign, estimate, ' * ', term))) %>%
    summarise(formula = paste(a, collapse = '')) %>%
    as.character
  
}

它适用于简单和多元线性回归:

model1 <- lm(hp ~ disp, data = mtcars)
model2 <- lm(hp ~ mpg, data = mtcars)
model3 <- lm(hp ~ disp + mpg, data = mtcars)

# > get_formula(model1)
# [1] "y ~ 45.73 + 0.44 * disp"
# > get_formula(model2)
# [1] "y ~ 324.08 - 8.83 * mpg"
# > get_formula(model3)
# [1] "y ~ 172.22 + 0.26 * disp - 4.27 * mpg"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接