R语言非线性模型的实现
什么是非线性回归
在非线性回归中,分析师通常采用一个确定的函数形式和相应的参数来拟合数据。最常用的参数估计方法是利用非线性最小二乘法(R中的nls函数)。该方法使用线性函数来逼近非线性函数,并且通过不断迭代这个过程来得到参数的最优解(本段来自维基百科)。非线性回归的良好性质之一是估计出的参数都有清晰的解释(如Michaelis-Menten模型的Vmax是指最大速率),而变换数据后得到的线性模型其参数往往难以解释。
实例一
首先,绘制出原数据的散点图。代码试下如下:
data9.3<-read.csv("C:/Users/Administrator/Desktop/data9.3.csv",head=TRUE)attach(data9.3)plot(x,y)
输出结果为:
文章图片
可以看出,这时 y 与 x之间呈现出非线性,因此需要对数据进行非线性回归分析。
代码实现如下:
nls9.3<-nls(y~a-a/(1+(x/c)^b),start=list(a=100,b=5,c=4.8))summary(nls9.3)e<-resid(nls9.3)ebar<-mean(e)SE<-deviance(nls9.3)# 残差平方和,由于e的均值不等于0,所以SE不等于残差的离差平方和SSE<-sum((e-ebar)^2)# 残差的离差平方和prey<-fitted(nls9.3)# y的预测值pybar<-mean(prey)# y的预测值的均值ybar<-mean(y)# y的均值SST<-sum((y-ybar)^2)# 总离差平方和Rsquare<-1-SE/SST# 相关指数
输出结果为:
文章图片
文章图片
由以上输出结果可知,对参数的估计经过6步迭代计算后收敛,而且相关指数 R 2 = 0.9986,说明非线性回归拟合效果很好。同时,上述结果中对参数的显著性检验显示参数均通过显著性检验。
但是,在小样本的情况下,不可线性化的非线性回归的残差通畅不满足正态性,进而使用 t分布进行检验也是无效的,因此显著性检验的结果并不具有重要意义。
另外,听过对中间量的查看,回归的利差平方和 S S R = 15156.55 ,而总离差平方和 S S T = 14917.89
该实例中残差均值为 0.2856 ≠ 0,当然,如果回归拟合的效果好,残差均值会接近0.
通过上述分析可以认为, y与 x符合下面的非线性回归:
文章图片
实例二——Gompertz模型 回归实现的代码如下:
data9.4<-read.csv("C:/Users/Administrator/Desktop/data9.4.csv",head=TRUE)y<-data9.4[,2]t<-data9.4[,1]model<-nls(y~k*(a^(b^t)),start=list(a=0.5,b=0.5,k=120),lower=c(0,0,116),upper=c(1,1,10000),algorithm="port")summary(model)c<-coef(model)# 将模型的回归系数赋值给ctt<-c(1:30)yp<-c[3]*(c[1]^(c[2]^tt))# 计算时间取值为tt时对应的y的预测值t1=t+1979# 计算对应的年份t2<-tt+1979plot(t1,y,type="o",ann=FALSE,ylim=c(0,160),xlim=c(1975,2015))lines(t2,yp)
输出结果为:
文章图片
拟合结果为:
文章图片
这里可以不用纠结这个模型是怎么得到的,这是一个计量经济学上的模型,已经给出了确切的表达式为
文章图片
。
举这个例子的目的是了解由于回归迭代中的参数超过范围而导致代码运算产生无限不收敛的情况时,如何对参数取值做出限定,并使用高斯-牛顿迭代算法(设定参数algorithm=“port”)。
【R语言非线性模型的实现】到此这篇关于R语言非线性模型的实现的文章就介绍到这了,更多相关R语言非线性模型内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
推荐阅读
- 【生信技能树】R语言练习题|【生信技能树】R语言练习题 - 中级
- 一起来学习C语言的字符串转换函数
- C语言字符函数中的isalnum()和iscntrl()你都知道吗
- C语言浮点函数中的modf和fmod详解
- C语言中的时间函数clock()和time()你都了解吗
- C语言学习|第十一届蓝桥杯省赛 大学B组 C/C++ 第一场
- C语言解方程的根和判断是否是闰年
- C语言的版本比较
- Flutter的ListView
- 【C】题目|【C语言】题集 of ⑥