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

pst*_*elk 25 plot r lm

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

attach(mtcars)
fit <- lm(mpg ~ hp + I(hp^2))
Run Code Online (Sandbox Code Playgroud)

现在,我的情节如下

> plot(mpg~hp)
> points(hp, fitted(fit), col='red', pch=20)
Run Code Online (Sandbox Code Playgroud)

这给了我以下内容

mpg与hp的关系曲线

适合的价值观

我想将这些点连接成平滑的曲线,使用线条给出了以下内容

> lines(hp, fitted(fit), col='red', type='b')
Run Code Online (Sandbox Code Playgroud)

线图

我在这里想念的是什么 我希望输出是连接点的平滑曲线

Dav*_*tti 24

尝试:

lines(sort(hp), fitted(fit)[order(hp)], col='red', type='b') 
Run Code Online (Sandbox Code Playgroud)

因为数据集中的统计单位没有排序,因此,当您使用lines它时,它就是一团糟.


Rom*_*rik 21

我喜欢这样使用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))
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述


Gre*_*gor 12

一般来说,一个好的方法是使用该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))
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

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

  • 是的,它确实如此,但正如你所说的那样*不*解释。这似乎是此信息的标准来源,其中包含许多链接重复项 - 我认为对一般方法进行 *解释* 很有价值,而且我还认为 `ggplot` 可能成为新 R 用户的障碍,因此很高兴演示使用碱的方法。但我会编辑以承认罗曼的努力。 (2认同)