我有一个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个不同的模型,所以我想要一些可以扩展而无需太多工作的东西。
答案 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)
混合使用broom
和dplyr
库的替代方法:
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"