如何将 lm() 的结果转换为方程?

机器算法验证 r 回归 流明
2022-02-07 20:34:49

我们可以使用lm()来预测一个值,但在某些情况下我们仍然需要结果公式的方程。例如,将方程添加到绘图中。

4个回答

考虑这个例子:

set.seed(5)            # this line will allow you to run these commands on your
                       # own computer & get *exactly* the same output
x = rnorm(50)
y = rnorm(50)

fit = lm(y~x)
summary(fit)
# Call:
# lm(formula = y ~ x)
# 
# Residuals:
#      Min       1Q   Median       3Q      Max 
# -2.04003 -0.43414 -0.04609  0.50807  2.48728 
# 
# Coefficients:
#             Estimate Std. Error t value Pr(>|t|)
# (Intercept) -0.00761    0.11554  -0.066    0.948
# x            0.09156    0.10901   0.840    0.405
# 
# Residual standard error: 0.8155 on 48 degrees of freedom
# Multiple R-squared: 0.01449,  Adjusted R-squared: -0.006046 
# F-statistic: 0.7055 on 1 and 48 DF,  p-value: 0.4051 

我猜,问题是如何从 R 的汇总输出中找出回归方程。在代数上,简单回归模型的方程为:

y^i=β^0+β^1xi+ε^iwhere εN(0, σ^2)
我们只需要将summary.lm()输出映射到这些术语。以机智:

  • β^0是行中的Estimate(Intercept)(具体来说,-0.00761
  • β^1是行中的Estimatex(具体来说,0.09156
  • σ^Residual standard error(特别是,0.8155

将这些插入上面的产量:

y^i=0.00761 + 0.09156xi + ε^iwhere εN(0, 0.81552)
如需更全面的概述,您可能需要阅读此线程:解释 R 的 lm() 输出

如果您想要使用生成的回归方程预测分数,您可以通过键入手动构建方程summary(fit)(例如,如果您的回归分析存储在名为 的变量fit中),并查看包含在您的模型。

例如,如果您有一个简单的回归类型y=β0+β1x+ϵ,你得到截距的估计值(β0) 的 +0.5 以及 x 对 y (β1) 的 +1.6,您可以通过计算从他们的 x 分数预测个人的 y 分数:y^=0.5+1.6x.

然而,这是一条艰难的道路。R 有一个内置函数 ,predict()您可以使用它来自动计算给定模型的任何数据集的预测值。例如:predict(fit, newdata=data)如果要用于预测 y 分数的 x 分数存储在变量 中data(请注意,为了查看执行回归的样本的预测分数,您可以简单地键入fit$fittedor fitted(fit);这些将为您提供预测的,也就是拟合的值。)

如果您想显示方程式,例如剪切/粘贴到文档中,但不想将整个方程式放在一起大惊小怪:

R> library(MASS)
R> crime.lm <- lm(y~., UScrime)
R> cc <- crime.lm$coefficients
R> (eqn <- paste("Y =", paste(round(cc[1],2), paste(round(cc[-1],2), names(cc[-1]), sep=" * ", collapse=" + "), sep=" + "), "+ e"))
[1] "Y = -5984.29 + 8.78 * M + -3.8 * So + 18.83 * Ed + 19.28 * Po1 + -10.94 * Po2 + -0.66 * LF + 1.74 * M.F + -0.73 * Pop + 0.42 * NW + -5.83 * U1 + 16.78 * U2 + 0.96 * GDP + 7.07 * Ineq + -4855.27 * Prob + -3.48 * Time + e"

编辑空格和标志是否打扰:

R> (eqn <- gsub('\\+ -', '- ', gsub(' \\* ', '*', eqn)))
[1] "Y = -5984.29 + 8.78*M - 3.8*So + 18.83*Ed + 19.28*Po1 - 10.94*Po2 - 0.66*LF + 1.74*M.F - 0.73*Pop + 0.42*NW - 5.83*U1 + 16.78*U2 + 0.96*GDP + 7.07*Ineq - 4855.27*Prob - 3.48*Time + e"

基于@keithpjolley 的回答,这将分隔符中使用的“+”符号替换为系数的实际符号,并将“y”替换为模型的因变量实际上是什么。

该函数接受“格式”的参数,例如“数字”和“修剪”。

library(dplyr)

model_equation <- function(model, ...) {
  format_args <- list(...)
  
  model_coeff <- model$coefficients
  format_args$x <- abs(model$coefficients)
  model_coeff_sign <- sign(model_coeff)
  model_coeff_prefix <- case_when(model_coeff_sign == -1 ~ " - ",
                                  model_coeff_sign == 1 ~ " + ",
                                  model_coeff_sign == 0 ~ " + ")
  model_eqn <- paste(strsplit(as.character(model$call$formula), "~")[[2]], # 'y'
                     "=",
                     paste(if_else(model_coeff[1]<0, "- ", ""),
                           do.call(format, format_args)[1],
                           paste(model_coeff_prefix[-1],
                                 do.call(format, format_args)[-1],
                                 " * ",
                                 names(model_coeff[-1]),
                                 sep = "", collapse = ""),
                           sep = ""))
  return(model_eqn)
}
图书馆(大众)

modelcrime <- lm(y ~ ., data = UScrime)
模型方程(模型犯罪,数字 = 3,修剪 = 真)

产生结果

[1] "y = - 5984.288 + 8.783 * M - 3.803 * So + 18.832 * Ed + 19.280 * Po1 - 10.942 * Po2 - 0.664 * LF + 1.741 * M.F - 0.733 * Pop + 0.420 * NW - 5.827 * U1 + 16.780 * U2 + 0.962 * GDP + 7.067 * Ineq - 4855.266 * Prob - 3.479 * Time"

library(car)
state.x77=as.data.frame(state.x77)
model.x77 <- lm(Murder ~ ., data = state.x77)
model_equation(model.x77, digits = 2)

生产

[1] "Murder = 1.2e+02 + 1.9e-04 * Population - 1.6e-04 * Income + 1.4e+00 * Illiteracy - 1.7e+00 * Life.Exp + 3.2e-02 * HS.Grad - 1.3e-02 * Frost + 6.0e-06 * Area"

*** 编辑

  1. 明确要求“dplyr”
  2. 功能化代码
  3. 合并了rvezy 的答案中发现的改进- '灵活' y 参数,使用 '格式' 参数