在R中,绘制一个非线性曲线。

3

有几个相关的参考文献,但是我的lines()函数生成了多个弧线而不是一个简单的非线性曲线。看起来像一张吊床,带有许多不必要的线条。如何生成一个简单的非线性曲线?数据集可在http://www-bcf.usc.edu/~gareth/ISL/data.html上获取,文件名为Auto.csv。

    library(ISLR)
    data(Auto)
    lm.fit1=lm(mpg~horsepower,data=Auto) #linear
    lm.fit2=lm(mpg~horsepower+I(horsepower^2),data=Auto) #add polynomial
    plot(Auto$horsepower,Auto$mpg,col=8,pch=1)
    abline(lm.fit1,col=2)       #linear fit
    lines(Auto$horsepower,predict(lm.fit2),col=4)  #attempt at nonlinear
3个回答

3

lines命令按照数据出现的顺序绘制图表。因此,如果您不先按x值排序,则会得到一堆线条来回跳动,因为x值在行与行之间跳跃。例如,尝试执行以下操作:

plot(c(1,3,2,0), c(1,9,4,0), type="l", lwd=7)
lines(0:3, c(0,1,4,9), col='red', lwd=4)

为了得到一个漂亮的曲线,首先按照 马力 进行排序:
curve.dat = data.frame(x=Auto$horsepower, y=predict(lm.fit2))
curve.dat = curve.dat[order(curve.dat$x),]

lines(curve.dat, col=4)  

图片描述

如果您不按马力排序,就会得到以下结果:

图片描述


3

你应该使用 poly 进行多项式拟合。然后,你可以使用 predict 来配合 curve 使用:

lm.fit2 = lm(mpg ~ poly(horsepower, 2, raw = TRUE), data = Auto) #fit polynomial
#curve passes values to x, see help("curve")
curve(predict(lm.fit2, newdata = data.frame(horsepower = x)), add = TRUE, col = 4) 

结果图

对于nls拟合也同样适用。


感谢您提出poly()建议。 - Orknie

2
如果您不想先担心对数据框进行排序,另一种选择是使用ggplot。它有一个有用的方法geom_smooth,可以让您选择公式和要适合模型的线条类型:
library(ISLR)
library(ggplot2)
data(Auto)

ggplot(Auto, aes(mpg, horsepower)) + 
  geom_point() + 
  geom_smooth(method="lm", formula = y~x, se=FALSE)+
  geom_smooth(method="lm", formula = y~x+I(x^2), se=FALSE, colour="red")

enter image description here


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接