在 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 中绘制多项式回归曲线的主要内容,如果未能解决你的问题,请参考以下文章
线性回归 scikit-learn LinearRegression最小二乘法梯度下降SDG多项式回归学习曲线岭回归Lasso回归