R:从 lm 中自动提取线性回归方程

R: Automate Extraction of Linear Regression Equation from lm

有人知道现有的函数可以从 lm 对象中提取完整的线性方程吗?

假设我有:

lm1 = lm(y~x1+x2...xn, data=df)

对于我正在学习的这门回归课程,教授反复要求得到以下形式的回归方程:e(y) = b1 +b2x1 [...] bnx(n-1)。

目前,我正在做这样的事情:

(paste("y=", coef(lm1)[1], '+', coef(lm1[2]), '*x2', [...])

这样的情况已经持续了数周。复制和粘贴上面的粘贴功能不会是一个大问题,但他想要实际的变量标签而不是 y、x1 等。正如你所看到的,我的手和脑因为反复这样做而受到伤害。

我已经超过了我的痛苦阈值,今天开始考虑为此创建我自己的函数,但我只是想看看是否有人知道现有的自动执行此操作的函数。

我认为创建一个执行相同粘贴功能的函数不会特别困难,除了系数数量的可变长度,但这只是我宁愿使用给定的现有解决方案的地方最终产品是如此无用的构造。

注意:这与此处提出的问题非常相似但也不完全相同: Extract Formula From lm with Coefficients (R)

为什么不一样?该问题解决了一个一次性案例,"how do you extract a linear regression equation from an lm object?" 这个问题是,“是否存在现有的基本方法或(如果没有)系统地 获得线性回归方程的方法来自 lm 对象。当您看到这里给出的答案与另一页上接受的答案时,这一点尤其明显。

我对这个问题的幼稚方法也是使用 paste0() 自定义我自己的函数:

regEq <- function(lmObj, dig) {
    paste0("y = ",
        paste0(
            c(round(lmObj$coef[1], dig), round(sign(lmObj$coef[-1])*lmObj$coef[-1], dig)),
            c("", rep("*", length(lmObj$coef)-1)),
            paste0(c("", names(lmObj$coef)[-1]), c(ifelse(sign(lmObj$coef)[-1]==1," + "," - "), "")),
            collapse=""
        )
    )
}

由于标志和拦截,它变得有点混乱。让我们看一个简单的调用:

> fit <- lm(-mpg ~ cyl + hp + drat, data=mtcars)
> fit

Call:
lm(formula = -mpg ~ cyl + hp + drat, data = mtcars)

Coefficients:
(Intercept)          cyl           hp         drat  
  -22.51406      1.36060      0.02878     -2.84090  

> regEq(fit,3)
[1] "y = -22.514 + 1.361*cyl + 0.029*hp - 2.841*drat"

编辑: wrt。注释:为了用变量名替换 y 并将交互运算符更改为 * 重写:

regEq <- function(lmObj, dig) {
    gsub(":", "*", 
        paste0(
            names(lmObj$model)[1]," = ",
            paste0(
                c(round(lmObj$coef[1], dig), round(sign(lmObj$coef[-1])*lmObj$coef[-1], dig)),
                c("", rep("*", length(lmObj$coef)-1)),
                paste0(c("", names(lmObj$coef)[-1]), c(ifelse(sign(lmObj$coef)[-1]==1," + "," - "), "")),
                collapse=""
            )
        )
    )
}

> regEq(lm(mpg ~ hp * drat, data=mtcars), 3)
[1] "mpg = 5.55 - 0.013*hp + 6.069*drat - 0.01*hp*drat"