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


29

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


2
您能改一下您的问题或添加一些细节吗?我对R lm和线性模型比较熟悉,但是并不清楚您到底想要什么。您能举个例子或澄清一下吗?这是某些科目吗?
Glen_b-恢复莫妮卡

2
我想您想要线性回归公式的系数。尝试调用coef()拟合的lm对象,例如:mod <- lm(y ~ x); coef(mod)
Jake Westfall

如果键入lm(y~x)$call,则表明公式为y ~ x。如果您的意思与此不同,则需要更具体。
Glen_b-恢复莫妮卡


Answers:


30

考虑以下示例:

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()输出这些条款。以机智:

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

在以上的产率封孔这些: 为了更透彻概述,您可能需要阅读以下主题:R的lm()输出的解释

y^i=0.00761 + 0.09156xi + ε^iwhere εN(0, 0.81552)


2
lmy^=0.00761+0.09156x

6

如果您要使用所得的回归方程式预测分数,则可以通过键入summary(fit)(如果您的回归分析存储在名为的变量中fit)并查看包含在其中的每个系数的估算值来手工构建方程式模型。

y=β0+β1x+ϵβ0β1y^=0.5+1.6x

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


0

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

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"

0

在keithpjolley的答案的基础上,这将分隔符中使用的“ +”符号替换为系数的实际符号。

modelcrime <- lm(y~., UScrime)
modelcrime_coeff <- modelcrime$coefficients
modelcrime_coeff_sign <- sign(modelcrime_coeff)
modelcrime_coeff_prefix <- case_when(modelcrime_coeff_sign == -1 ~ " - ",
                                     modelcrime_coeff_sign == 1 ~ " + ",
                                     modelcrime_coeff_sign == 0 ~ " + ")
modelcrime_eqn <- paste("y =", paste(if_else(modelcrime_coeff[1]<0, "- ", ""),
                                         abs(round(modelcrime_coeff[1],3)),
                                     paste(modelcrime_coeff_prefix[-1],
                                           abs(round(modelcrime_coeff[-1],3)),
                                           " * ",
                                           names(modelcrime_coeff[-1]),
                                           sep = "", collapse = ""),
                                     sep = ""))
modelcrime_eqn

产生结果

[1] "y = - 5984.288 + 8.783 * M - 3.803 * So + 18.832 * Ed + 19.28 * Po1 - 10.942 * Po2 - 0.664 * LF + 1.741 * M.F - 0.733 * Pop + 0.42 * NW - 5.827 * U1 + 16.78 * U2 + 0.962 * GDP + 7.067 * Ineq - 4855.266 * Prob - 3.479 * Time"
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.