美文网首页
非线性拟合

非线性拟合

作者: leoxiaobei | 来源:发表于2019-12-18 09:32 被阅读0次

非线性拟合

先画图,再观测以提供a和b的初始值

#根据均匀分布,正态分布生成随机数

x <- seq(from=0,to = 50,by = 1)

y <- runif(n=1,min = 5,max = 15)*exp(-runif(n = 1,min = 0.01,max = 0.05)*x)+rnorm(n = 51,mean = 0,sd = 0.5)

plot(x,y)

a_start <- 14

b_start <- -log(2/a_start)/40

拟合

m <- nls(y ~ a*exp(-b*x),start = list(a=a_start,b=b_start))

coef(m)#查看拟合的参数

cor(y,predict(m))#查看残差平方和

cor(y,predict(m))#查看相关系数

重新画图和添加标注及公式

plot(x,y)

lines(x,y = predict(m),col='blue')

legend('topright',

      legend = c('Data','Non-linear fit'),

      pch = c(1,NA),

      lty = c(NA,1),

      col = c('black','blue'),

      bty = "n")

eq <- substitute(italic(y) == a*italic(e)^{-b*italic(x)}*","~italic(RSE)==cor,

                    list(a = format(unname(coef(m)[1]), digits = 3),

                        b = format(unname(coef(m)[2]), digits = 2),

                        cor = format(summary(m)$sigma, digits = 3)))

text(x = 20,y = 10,labels = eq,adj = 0,col="blue")

ggplot绘图

data1=data.frame(x,y)

data2=data.frame(x,predict(m))

ggplot()+

  geom_point(aes(x,y),data=data1,size=2,col=brewer.pal(8,"Set3")[4])+

  geom_line(aes(x,predict.m.),data=data2,col=brewer.pal(8,"Set3")[1],lty=1,size=1.2)+

  geom_text(aes(x = 25, y = 10),label=as.character(as.expression(eq)),parse = T,color="black") 

相关文章

网友评论

      本文标题:非线性拟合

      本文链接:https://www.haomeiwen.com/subject/gkejuctx.html