【问题标题】:R: Automate Extraction of Linear Regression Equation from lm [duplicate]R:从lm自动提取线性回归方程[重复]
【发布时间】:2019-08-17 17:46:32
【问题描述】:

有人知道从 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 等。如您所见,我的手和心因反复这样做而受伤。

我已经为此跨越了痛苦的门槛,今天开始考虑为此创建自己的函数,但我只是在检查是否有人知道现有的自动执行此操作的函数。

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

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

为什么不一样?这些问题解决了“如何从 lm 对象中提取线性回归方程?”的一次性案例。这个问题是,“是否存在现有的基本方法或(如果没有)系统地从 lm 对象获取线性回归方程的方法。当您看到此处提出的答案与另一页上接受的答案。

【问题讨论】:

  • 谢谢,我看到了那个,但我认为必须有一个现有的内置函数。我想我只需要修改那个就可以得到一个可以调整正确数量的预测变量。
  • 实际上,链接的 SO 帖子中的代码会自动调整预测变量的数量。
  • 我对您引用的帖子做出了新的回答,该帖子的解决方案非常通用。不需要paste0

标签: r linear-regression lm


【解决方案1】:

我对这个问题的天真方法也是使用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"

【讨论】:

  • 行得通!我不明白为什么它会起作用。看起来使用 -1 您将获得 lmobject 中的最后一个系数,但它的行为类似于我正在处理的 for i in (1:length(lm_object)) 循环。我正在尝试拆分您的解决方案,以便我可以(可能)修改交互式术语。它将用 x1*x2 替换“x1:x2”。还考虑修改,以便 y 变量的实际名称显示在方程中,而不仅仅是“y”。这两点都相当微不足道,但它是一个相当微不足道的类....
  • @nordicray 不得不对拦截做一些工作,这就是 [-1] 的原因。如果您想理解它,请拆分内部paste。还进行了编辑。你的评论。
  • 再次感谢!我走上了一条更加繁重的道路。我打算用调用函数替换“y =”来调用我在堆栈溢出时发现的另一个函数:getResponse
  • 我已经取消了这个解决方案,但我的投票还没有计算在内。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-10-03
  • 2017-03-24
  • 2011-08-01
  • 1970-01-01
  • 2015-06-21
相关资源
最近更新 更多