simple - regresion polinomial
Gráfica de la curva de regresión polinomial en R (3)
En general, una buena manera de hacerlo es usar la función predict()
. Escoja algunos valores de x
, use predict()
para generar los valores de y
correspondientes, y trácelas. 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))
Consulte la respuesta de Roman para obtener una versión más sofisticada de este método, donde también se calculan los intervalos de confianza. En ambos casos, el trazado real de la solución es incidental (puede usar gráficos base o ggplot2
o cualquier otra cosa que desee). La clave es 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, GLMs, splines de suavizado, etc. - cualquier cosa con un método de predict
.
Tengo una regresión polinomial simple que hago de la siguiente manera
attach(mtcars)
fit <- lm(mpg ~ hp + I(hp^2))
Ahora, trazo como sigue
> plot(mpg~hp)
> points(hp, fitted(fit), col=''red'', pch=20)
Esto me da lo siguiente
Quiero conectar estos puntos en una curva suave, usando líneas me da lo siguiente
> lines(hp, fitted(fit), col=''red'', type=''b'')
Que me estoy perdiendo aqui. Quiero que la salida sea una curva suave que conecta los puntos
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))
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.