Wykreślenie krzywej regresji wielomianowej w R

Mam prostą regresję wielomianową, którą wykonuję w następujący sposób

attach(mtcars)
fit <- lm(mpg ~ hp + I(hp^2))

Teraz rysuję następująco

> plot(mpg~hp)
> points(hp, fitted(fit), col='red', pch=20)

To daje mi następujące

Fabuła mpg kontra hp

Dopasowane Wartości

Chcę połączyć te punkty w gładką krzywą, używając linii daje mi następujące

> lines(hp, fitted(fit), col='red', type='b')

Wykres liniowy

Co mi tu umyka. Chcę, aby wyjście było gładką krzywą, która łączy punkty
 20
Author: Davide Passaretti, 2014-04-28

3 answers

Try:

lines(sort(hp), fitted(fit)[order(hp)], col='red', type='b') 

Ponieważ twoje jednostki statystyczne w zbiorze danych nie są uporządkowane, więc kiedy używasz {[1] }to bałagan.

 20
Author: Davide Passaretti,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-04-28 06:59:40

Lubię do tego używać ggplot2, ponieważ zwykle dodawanie warstw danych jest bardzo intuicyjne.

library(ggplot2)
fit <- lm(mpg ~ hp + I(hp^2), data = mtcars)
prd <- data.frame(hp = seq(from = range(mtcars$hp)[1], to = range(mtcars$hp)[2], length.out = 100))
err <- predict(fit, newdata = prd, se.fit = TRUE)

prd$lci <- err$fit - 1.96 * err$se.fit
prd$fit <- err$fit
prd$uci <- err$fit + 1.96 * err$se.fit

ggplot(prd, aes(x = hp, y = fit)) +
  theme_bw() +
  geom_line() +
  geom_smooth(aes(ymin = lci, ymax = uci), stat = "identity") +
  geom_point(data = mtcars, aes(x = hp, y = mpg))

Tutaj wpisz opis obrazka

 21
Author: Roman Luštrik,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-04-28 07:32:14

Ogólnie dobrym sposobem jest użycie funkcji predict(). Wybierz kilka wartości x, Użyj predict() do wygenerowania odpowiednich wartości y i wykreśl je. Może to wyglądać mniej więcej tak:

newdat = data.frame(hp = seq(min(mtcars$hp), max(mtcars$hp), length.out = 100))
newdat$pred = predict(fit, newdata = newdat)

plot(mpg ~ hp, data = mtcars)
with(newdat, lines(x = hp, y = pred))

Tutaj wpisz opis obrazka

Zobacz odpowiedź Romana dla bardziej fantazyjnej wersji tej metody, gdzie przedziały ufności są również obliczane. W obu przypadkach rzeczywiste wykreślenie rozwiązania jest przypadkowe - możesz użyć grafiki bazowej lub ggplot2 lub cokolwiek innego, co chcesz - kluczem jest wystarczy użyć funkcji predict, aby wygenerować odpowiednie wartości y. jest to dobra metoda, ponieważ rozciąga się na wszelkiego rodzaju dopasowania, nie tylko wielomianowe modele liniowe. Możesz go używać z modelami nieliniowymi, GLMs, splinami wygładzającymi itp. - wszystko metodą {[6] }.

 8
Author: Gregor,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-04-09 17:47:44