在 R 中绘制多项式回归曲线

Posted

技术标签:

【中文标题】在 R 中绘制多项式回归曲线【英文标题】:Plot polynomial regression curve in R 【发布时间】:2014-06-13 14:27:24 【问题描述】:

我有一个简单的多项式回归,如下所示

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

现在,我绘制如下

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

这给了我以下内容

我想将这些点连接成一条平滑的曲线,使用线条可以得到以下结果

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

我在这里错过了什么。我希望输出是连接点的平滑曲线

【问题讨论】:

你真的不应该使用attach,它会导致很多错误。 【参考方案1】:

我喜欢为此使用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))

【讨论】:

使用您的代码时(使用 R 3.3.3 和 ggplot2_2.2.1 sp_1.2-4)我收到警告:忽略未知美学:ymin,ymax @TheThunderChimp 他们似乎在那里...ggplot2.tidyverse.org/reference/geom_smooth.html 这显然是 ggplot2 最新版本的一个错误:github.com/tidyverse/ggplot2/issues/1939【参考方案2】:

试试:

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

因为您在数据集中的统计单位没有排序,因此,当您使用lines 时会一团糟。

【讨论】:

除非您有均匀间隔的值或许多观察值,否则使用这种fitted() 方法不会产生拟合多项式/函数的平滑实现 @GavinSimpson 当然,生成一系列紧密且均匀间隔的点,并在其上拟合函数会产生更平滑的曲线。但我认为这个问题的目的是找到一种方法,用一条线连接现有的拟合点,而不是曲线本身。【参考方案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))

请参阅 Roman 的答案以获得该方法的更高级版本,其中也计算了置信区间。在这两种情况下,解决方案的实际绘图都是偶然的 - 您可以使用基本图形或ggplot2 或任何其他您想要的东西 - 关键是只需使用 predict 函数来生成适当的 y 值。 这是一种很好的方法,因为它可以扩展到各种拟合,而不仅仅是多项式线性模型。您可以将它与非线性模型、GLM、平滑样条曲线等一起使用 - 任何使用 predict 方法的东西。

【讨论】:

虽然没有这样解释,但罗曼的回答已经表明了这种predict() 方法,不是吗? 是的,但正如你所说,它不是解释的。这似乎是此信息的标准来源,其中包含许多链接的重复项 - 我认为对一般方法进行 解释 很有价值,而且我还认为 ggplot 可能成为新 R 用户的障碍所以很高兴使用 base 演示该方法。但我会编辑以感谢 Roman 的努力。

以上是关于在 R 中绘制多项式回归曲线的主要内容,如果未能解决你的问题,请参考以下文章

在 R 中使用 lm() 绘制多项式回归的预测时的混乱图

我可以对 sklearn 进行对数回归吗?

R软件可以做分段样条回归吗

插值 回归 拟合 逼近的区别

多项式回归学习曲线

线性回归 scikit-learn LinearRegression最小二乘法梯度下降SDG多项式回归学习曲线岭回归Lasso回归