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

时间:2014-01-21 21:48:48

标签: r formula linear-regression

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

4 个答案:

答案 0 :(得分:9)

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

答案 1 :(得分:6)

我可以建议编辑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

答案 2 :(得分:2)

我想出了一种使用替换的系数创建模型公式的通用方法。它比使用paste0手动构建字符串要多得多。

e.g。

我有一个已经具有优化系数的模型:

> 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

答案 3 :(得分: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"