我们可以使用lm()
来预测一个值,但在某些情况下我们仍然需要结果公式的方程。例如,将方程添加到绘图中。
如何将 lm() 的结果转换为方程?
机器算法验证
r
回归
流明
2022-02-07 20:34:49
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 的汇总输出中找出回归方程。在代数上,简单回归模型的方程为:
我们只需要将summary.lm()
输出映射到这些术语。以机智:
- 是行中的
Estimate
值(Intercept)
(具体来说,-0.00761
) - 是行中的
Estimate
值x
(具体来说,0.09156
) - 是
Residual standard error
(特别是,0.8155
)
将这些插入上面的产量:
如需更全面的概述,您可能需要阅读此线程:解释 R 的 lm() 输出。
如果您想要使用生成的回归方程预测分数,您可以通过键入手动构建方程summary(fit)
(例如,如果您的回归分析存储在名为 的变量fit
中),并查看包含在您的模型。
例如,如果您有一个简单的回归类型,你得到截距的估计值() 的 +0.5 以及 x 对 y () 的 +1.6,您可以通过计算从他们的 x 分数预测个人的 y 分数:.
然而,这是一条艰难的道路。R 有一个内置函数 ,predict()
您可以使用它来自动计算给定模型的任何数据集的预测值。例如:predict(fit, newdata=data)
如果要用于预测 y 分数的 x 分数存储在变量 中data
。(请注意,为了查看执行回归的样本的预测分数,您可以简单地键入fit$fitted
or 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"
*** 编辑
- 明确要求“dplyr”
- 功能化代码
- 合并了rvezy 的答案中发现的改进- '灵活' y 参数,使用 '格式' 参数
其它你可能感兴趣的问题