我有一个简单的多项式回归,我做如下
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')
我在这里缺少什么。我希望输出是连接点
的平滑曲线答案 0 :(得分:24)
尝试:
lines(sort(hp), fitted(fit)[order(hp)], col='red', type='b')
因为数据集中的统计单位没有排序,因此,当您使用lines
时,它就是一团糟。
答案 1 :(得分: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))
答案 2 :(得分:11)
通常一个好的方法是使用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
或您想要的任何其他内容 - 关键是只需使用预测函数生成正确的y值。这是一个很好的方法,因为它扩展到各种拟合,而不仅仅是多项式线性模型。您可以将它与非线性模型,GLM,平滑样条等一起使用 - 任何使用predict
方法的东西。