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