Кривая кривой полинома в R

У меня есть простая полиномиальная регрессия, которую я делаю следующим образом

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

Теперь я рисую следующим образом

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

Это дает мне следующее

Plot of mpg versus hp

Fitted Values

Я хочу связать эти точки с гладкой кривой, используя строки, дает мне следующее

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

Line plot

Что мне здесь не хватает. Я хочу, чтобы выход был гладкой кривой, которая соединяет точки

Ответы

Ответ 1

Try:

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

Поскольку ваши статистические единицы в наборе данных не упорядочены, таким образом, когда вы используете lines, это беспорядок.

Ответ 2

Мне нравится использовать ggplot2 для этого, потому что обычно очень интуитивно для добавления слоев данных.

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

enter image description here

Ответ 3

Как правило, хороший способ - использовать функцию predict(). Выберите значения x, используйте predict() для создания соответствующих значений y и запишите их. Он может выглядеть примерно так:

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

введите описание изображения здесь

См. римский ответ для более удобной версии этого метода, где также рассчитываются доверительные интервалы. В обоих случаях фактическое построение решения является случайным - вы можете использовать базовую графику или ggplot2 или что-то еще, что вам бы хотелось - ключ просто использует функцию прогнозирования для генерации правильных значений y. Это хороший метод, потому что он распространяется на всевозможные приемы, а не только на полиномиальные линейные модели. Вы можете использовать его с нелинейными моделями, GLM, сглаживанием сплайнов и т.д. - все с помощью метода predict.