繁体   English   中英

在R中,绘制非线性曲线

[英]in R, plot a nonlinear curve

有几个参考文献接近,但我的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

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)

为了得到一个漂亮的曲线,首先按horsepower排序:

curve.dat = data.frame(x=Auto$horsepower, y=predict(lm.fit2))
curve.dat = curve.dat[order(curve.dat$x),]

lines(curve.dat, col=4)  

在此输入图像描述

然而,如果你不按horsepower排序,这就是你得到的:

在此输入图像描述

您应该使用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 fit。

如果您不想担心首先对数据帧进行排序,另一种方法是使用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")

在此输入图像描述

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM