Як перевести результати з 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()

  • β^0 - Estimateзначення у (Intercept)рядку (конкретно, -0.00761)
  • β^1 - це Estimateзначення в xрядку (конкретно, 0.09156)
  • σ^ є Residual standard error(конкретно, 0.8155)

Підключення цих вище результатів: Для більш ретельного огляд, ви можете прочитати цю тему: Інтерпретацію ого лепехи) вихідний ( .

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


2
Зважаючи на згадку ОП про бажання розміщувати рівняння на графах, я замислювався над тим, чи вони насправді хочуть, щоб функція приймала висновок lmта створювала вирази символів типу " ", придатного для такого складання завдання (звідси мій неодноразовий дзвінок прояснити, чого вони хотіли - чого, на жаль, не було зроблено). y^=0.00761+0.09156x
Glen_b -Встановити Моніку

6

Якщо ви хочете передбачити результати за допомогою отриманого рівняння регресії, ви можете побудувати рівняння вручну, ввівши summary(fit)(якщо ваш регресійний аналіз зберігається в змінній, званій fit, наприклад), і переглянувши оцінки для кожного коефіцієнта, включеного у ваш модель.

Наприклад, якщо у вас проста регресія типу , і ви отримуєте оцінку перехоплення ( ) +0,5 та оцінку впливу x на y ( ) з +1.6, ви можете передбачити показник y у людини з їх х балів, обчисливши: .& beta ; 0 & beta ; 1 у = 0,5 + 1,6 х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

Спираючись на відповідь 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"
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.