【问题标题】:Extract Formula From lm with Coefficients (R)从具有系数 (R) 的 lm 中提取公式
【发布时间】:2014-01-21 21:48:47
【问题描述】:

我有一个 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 个不同的模型,所以我想要一些不需要太多工作就可以扩展的东西。

【问题讨论】:

  • 如果添加第二个预测变量,代码会自动将其添加到公式中。试试看。
  • 哦,我第一次看到它时以为我已经尝试过了,但是我忘了编辑实际模型。干杯:-)

标签: r formula linear-regression


【解决方案1】:
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

【讨论】:

  • 嗨,这适用于我提供的代码,非常感谢。我想知道是否有一种方法可以更容易地扩大规模?就像我添加第二个预测变量 c 一样,我假设我需要添加另一行或两行来告诉它也获取相关位,对于大多数模型(我'我不完全确定我会把它放在哪里,对 r 来说还是新的,所以这段代码对我来说有点不透明)。
  • @user3051065 我对您的可扩展性问题做了一个新的回答。见下文。
【解决方案2】:

我是否可以建议对 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
    

    【讨论】:

      【解决方案4】:

      混合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"
      

      【讨论】:

        猜你喜欢
        • 2014-02-14
        • 2014-08-09
        • 1970-01-01
        • 2020-10-03
        • 2016-11-15
        • 2013-06-27
        • 2020-03-06
        相关资源
        最近更新 更多