Как перевести результаты из lm () в уравнение?


29

Мы можем использовать lm()для прогнозирования значения, но нам все еще нужно уравнение формулы результата в некоторых случаях. Например, добавьте уравнение к графикам.


2
Можете ли вы перефразировать ваш вопрос или добавить некоторые детали? Я достаточно хорошо знаком с R lmи линейными моделями в целом, но не совсем понятно, чего именно вы хотите. Можете привести пример или кое-что прояснить? Это для какой-то темы?
Glen_b

2
Я предполагаю, что вы хотите коэффициенты формулы линейной регрессии. Попробуйте позвонить coef()на подобранный lmобъект, как mod <- lm(y ~ x); coef(mod)
показано ниже

Если вы печатаете, lm(y~x)$callон говорит вам, что формула y ~ x. Если вы имеете в виду что-то отличное от этого, вам нужно быть более конкретным.
Glen_b


Стоит прочитать stackoverflow.com/questions/7549694/…
mnel

Ответы:


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
  • β^1Estimatex0.09156
  • σ^Residual standard error0.8155


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)если x баллов, которые вы хотите использовать для прогнозирования y баллов, хранятся в переменной data. (Обратите внимание, что для просмотра прогнозируемых баллов для выборки, на которой была выполнена ваша регрессия, вы можете просто ввести fit$fittedили fitted(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

Основываясь на ответе Кейтпьолли, это заменяет знаки «+», используемые в разделителе, на фактический знак коэффициента.

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"
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.