在 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-value 排序,就会出现乱七八糟的行随着 x-value 从一行到下一行来回跳转。试试这个,例如:
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
排序,则会得到以下结果:
如果您不想首先对数据框进行排序,另一种方法是使用 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")
您应该使用 poly
进行多项式拟合。然后,您可以将 curve
与 predict
:
一起使用
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
适合。
有几个参考接近,但我的 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-value 排序,就会出现乱七八糟的行随着 x-value 从一行到下一行来回跳转。试试这个,例如:
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
排序,则会得到以下结果:
如果您不想首先对数据框进行排序,另一种方法是使用 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")
您应该使用 poly
进行多项式拟合。然后,您可以将 curve
与 predict
:
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
适合。