Jak przetłumaczyć wyniki z lm () na równanie?

29

Możemy użyć lm()do przewidywania wartości, ale w niektórych przypadkach nadal potrzebujemy równania formuły wynikowej. Na przykład dodaj równanie do wykresów.

użytkownik27736
źródło
2
Czy możesz przeredagować swoje pytanie lub dodać jakieś szczegóły? Znam dość dobrze R, lma modele liniowe bardziej ogólnie, ale wcale nie jest jasne, czego dokładnie chcesz. Czy możesz podać przykład lub wyjaśnić? Czy to dla jakiegoś przedmiotu?
Glen_b
2
Chyba chcesz współczynników z wzoru regresji liniowej. Spróbuj wywołać coef()dopasowany lmobiekt, jak w:mod <- lm(y ~ x); coef(mod)
Jake Westfall
Jeśli wpiszesz lm(y~x)$call, wyświetli się formuła y ~ x. Jeśli masz na myśli coś innego, musisz być bardziej szczegółowy.
Glen_b

Odpowiedzi:

30

Rozważ ten przykład:

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 

Wydaje mi się, że pytanie brzmi, jak znaleźć równanie regresji na podstawie podsumowującego wyniku R. Algebraicznie równanie prostego modelu regresji jest następujące: Musimy tylko odwzorować dane wyjściowe na te warunki. To znaczy:

y^i=β^0+β^1xi+ε^iwhere εN(0, σ^2)
summary.lm()

  • β^0 to Estimatewartość w (Intercept)wierszu (konkretnie -0.00761)
  • β^1 to Estimatewartość w xwierszu (konkretnie 0.09156)
  • σ^ jest Residual standard error(konkretnie 0.8155)

Podłączenie ich w powyższe wyniki daje: Dla dokładniejszego przegląd, może chcesz przeczytać ten wątek: Interpretacja lm R w () wyjściowego .

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

gung - Przywróć Monikę
źródło
2
Biorąc pod uwagę wzmiankę OP o chęci umieszczenia równań na wykresach, zastanawiałem się, czy faktycznie chcą, aby funkcja wzięła wynik lmi wygenerowała wyrażenie znakowe, takie jak „ ” odpowiednie dla takiego zadanie kreślenia (stąd moje wielokrotne wezwanie do wyjaśnienia, czego chcieli - co niestety nie zostało zrobione). y^=0.00761+0.09156x
Glen_b
6

Jeśli chcesz przewidzieć wyniki za pomocą wynikowego równania regresji, możesz zbudować równanie ręcznie, wpisując summary(fit)(jeśli Twoja analiza regresji jest przechowywana fitna przykład w zmiennej o nazwie ) i patrząc na szacunki dla każdego współczynnika zawartego w twoim Model.

Na przykład, jeśli masz prostą regresję typu , a otrzymasz oszacowanie przecięcia ( ) +0,5 i oszacowanie wpływu x na y ( ) z +1.6, można przewidzieć wynik y danej osoby na podstawie jej wyniku x, obliczając: .β 0 β 1 Y = 0,5 + 1,6 xy=β0+β1x+ϵβ0β1y^=0.5+1.6x

Jest to jednak trudna droga. R ma wbudowaną funkcję, predict()której można użyć do automatycznego obliczenia przewidywanych wartości na podstawie modelu dla dowolnego zestawu danych. Na przykład: predict(fit, newdata=data)jeśli wyniki x, których chcesz użyć do przewidywania wyników y, są przechowywane w zmiennej data. (Zauważ, że aby zobaczyć przewidywane wyniki dla próbki, na której przeprowadzono regresję, możesz po prostu wpisać fit$fittedlub fitted(fit); te dadzą ci przewidywane, również dopasowane wartości.)

Patrick Coulombe
źródło
0

Jeśli chcesz pokazać równanie, na przykład wyciąć / wkleić do dokumentu, ale nie chcesz kłopotać się złożeniem całego równania:

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"
keithpjolley
źródło
0

Opierając się na odpowiedzi keithpjolleya, zastępuje to znaki „+” stosowane w separatorze rzeczywistym znakiem współczynnika.

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

daje wynik

[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"
David Fong
źródło