Trazar la curva de regresión polinomial en R

Tengo una regresión polinómica simple que hago de la siguiente manera

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

Ahora, trazo lo siguiente

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

Esto me da lo siguiente

Parcela de mpg contra hp

Valores ajustados

Quiero conectar estos puntos en una curva suave, usar líneas me da lo siguiente

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

Linear plot

Que me estoy perdiendo aqui. Quiero que la salida sea una curva suave que conecta los puntos

Tratar:

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

Debido a que sus unidades estadísticas en el conjunto de datos no están ordenadas, por lo tanto, cuando usa lines es un desastre.

Me gusta usar ggplot2 para esto porque generalmente es muy intuitivo agregar capas de datos.

 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

En general, un buen camino a seguir es usar la función de predict() . Elija algunos valores de x , use predict() para generar los valores de y correspondientes, y grafíquelos. Puede verse algo como esto:

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

enter image description here

Vea la respuesta de Roman para una versión más elegante de este método, donde también se calculan los intervalos de confianza. En ambos casos, el trazado real de la solución es accidental: puede usar gráficos básicos o ggplot2 o cualquier otra cosa que quiera, la clave es simplemente usar la función de predicción para generar los valores y adecuados. Es un buen método porque se extiende a todo tipo de ajustes, no solo a modelos lineales polinomiales. Puede usarlo con modelos no lineales, GLM, suavizado de splines, etc., cualquier cosa con un método de predict .