Extract Formula From lm with Coefficients (R)

后端 未结 4 1052
迷失自我
迷失自我 2021-01-13 06:43

I have an lm object and want to get the formula extracted with coefficients. I know how to extract the formula without coefficients, and how to get the coefficients without

相关标签:
4条回答
  • 2021-01-13 07:08

    An alternative with mixing broom and dplyr libraries:

        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
      
    }
    

    It works for both simple and multiple linear regressions:

    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"
    
    0 讨论(0)
  • 2021-01-13 07:09
    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
    
    0 讨论(0)
  • 2021-01-13 07:25

    Might I suggest an edit to lukeA's excellent answer:

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

    This will make sure that negative coefficients are printed correctly

    Suppose you land up with a negative coefficient for b, then the output will be

    # y ~ -5.33 + -0.51 * b
    

    instead of

    # y ~ -5.33 - 0.51 * b
    
    0 讨论(0)
  • 2021-01-13 07:34

    I figured out a versatile way of creating the model formula with coefficients using substitution. It's a lot more versatile than manually building a string with paste0.

    e.g.

    I have a model that already has the optimized coefficients:

    > 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
    

    These were the coefficients:

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

    Putting it all together:

    > newFormula = as.formula(substituteDirect(formula(model), as.list(coef(model))))
    > newFormula
    players ~ 6896421.4399627 * (0.263254460933212^days_from_start) + 430045.26142703
    
    0 讨论(0)
提交回复
热议问题