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.


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)


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.)


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"

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"
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.