如何为二次模型创建预测线

时间:2018-07-22 06:19:01

标签: r regression predict quadratic-curve

我正在尝试为二次模型创建二次预测线。我正在使用R随附的Auto数据集。我可以轻松地为线性模型创建预测线。但是,二次模型会产生疯狂的外观。这是我的代码。

# Linear Model
plot(Auto$horsepower, Auto$mpg,
     main = "MPG versus Horsepower",
     pch = 20)

lin_mod = lm(mpg ~ horsepower,
             data = Auto)
lin_pred = predict(lin_mod)


lines(
  Auto$horsepower, lin_pred,
  col = "blue", lwd = 2
)


# The Quadratic model
Auto$horsepower2 = Auto$horsepower^2
quad_model = lm(mpg ~ horsepower2,
                data = Auto)
quad_pred = predict(quad_model)

lines(
  Auto$horsepower,
  quad_pred,
  col = "red", lwd = 2
)

我有99%的把握是问题出在预测功能上。为什么我不能生成整洁的二次预测曲线?我尝试的以下代码不起作用-可能相关吗?:

quad_pred = predict(quad_model, data.frame(horsepower = Auto$horsepower))

谢谢!

3 个答案:

答案 0 :(得分:1)

问题在于x-axis值未排序。线性模型无关紧要,但是多项式却很明显。我创建了一个新的排序数据集,它工作正常:

library(ISLR) # To load data Auto

# Linear Model
plot(Auto$horsepower, Auto$mpg,
     main = "MPG versus Horsepower",
     pch = 20)

lin_mod = lm(mpg ~ horsepower,
             data = Auto)
lin_pred = predict(lin_mod)


lines(
  Auto$horsepower, lin_pred,
  col = "blue", lwd = 2
)


# The Quadratic model
Auto$horsepower2 = Auto$horsepower^2

# Sorting Auto by horsepower2
Auto2 <- Auto[order(Auto$horsepower2), ]
quad_model = lm(mpg ~ horsepower2,
                data = Auto2)


quad_pred = predict(quad_model)


lines(
  Auto2$horsepower,
  quad_pred,
  col = "red", lwd = 2
)

答案 1 :(得分:1)

一个选项是创建要为其绘制拟合线的x值序列。如果您的数据存在“间隙”,或者您希望将拟合线绘制在x变量范围之外,则此功能很有用。

# load dataset; if necessary run install.packages("ISLR")
data(Auto, package = "ISLR")

# since only 2 variables at issue, use short names
mpg <- Auto$mpg
hp  <- Auto$horsepower

# fit linear and quadratic models
lmod <- lm(mpg ~ hp)
qmod <- lm(mpg ~ hp + I(hp^2))

# plot the data
plot(x=hp, y=mpg, pch=20)

# use predict() to find coordinates of points to plot
x_coords <- seq(from=floor(min(hp)), to=ceiling(max(hp)), by=1)
y_coords_lmod <- predict(lmod, newdata=data.frame(hp=x_coords))
y_coords_qmod <- predict(qmod, newdata=data.frame(hp=x_coords))

# alternatively, calculate this manually using the fitted coefficients
y_coords_lmod <- coef(lmod)[1] + coef(lmod)[2]*x_coords
y_coords_qmod <- coef(qmod)[1] + coef(qmod)[2]*x_coords + coef(qmod)[3]*x_coords^2

# add the fitted lines to the plot
points(x=x_coords, y=y_coords_lmod, type="l", col="blue")
points(x=x_coords, y=y_coords_qmod, type="l", col="red")

答案 2 :(得分:1)

或者,使用ggplot

library(ggplot2) 
plot <- ggplot(Auto, aes(x = horsepower, y = mpg)) + geom_point() +
      stat_smooth(aes(x = horsepower, y = mpg), method = "lm", formula = y ~ x, colour = "red") +
      stat_smooth(aes(x = horsepower, y = mpg), method = "lm", formula = y ~ poly(x,2), colour = "blue")

plot