楼主: Dirk47
16726 9

[问答] 跪求!R语言中非线性函数模型nls()起始参数的设置方法,解决后可付报酬 [推广有奖]

  • 0关注
  • 1粉丝

高中生

7%

还不是VIP/贵宾

-

威望
0
论坛币
543 个
通用积分
5.6752
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
141 点
帖子
13
精华
0
在线时间
19 小时
注册时间
2016-6-28
最后登录
2024-5-16

300论坛币
我在使用R语言做非线性函数模型nls()拟合,起始参数的设置始终解决不了,参阅了一些相关资料,找到了一些解决方法,但始终未能解决我要处理的问题,以下是我运行的脚本及出现的问题,希望能得到高手的指点,跪求解决方法
> cl<-data.frame(
+ Area=c(521.5, 689.78, 1284.71, 2018.8, 2560.46, 524.91, 989.05, 1646.32, 2239.65, 2972.96, 478.54, 875.52, 1432.5, 2144.74, 2629.2),
+ Retention=c(95.3, 87.18, 44.94, 26.36, 18.12, 84.68, 37.24, 33.04, 23.46, 9.72, 97.92, 71.44, 44.52, 24.44, 15.26) )#模型拟合的数据
> expFct1 <- function(Area, b0, b1) {exp(b0*Area^b1)}#模型1
> expFct2 <- function(Area, b0, b1,th) {exp(b0*exp(th*Area^b1))}#模型2
> nls.m1<- nls(Retention ~ expFct1(Area, b0, b1), data =cl, start = list(b0 = 2, b1 = 0.02))#对模型1进行初始参数设置
> #经过几次尝试后蒙对了,成功
> nls.m2<- nls(Retention ~ expFct2(Area, b0, b1, th), data = cl, start = list(b0 = 0.2, b1 = 0.02, th = 0.01))#尝试对模型二进行初始参数设置
Error in nls(Retention ~ expFct2(Area, b0, b1, th), data = cl, start = list(b0 = 0.2,  :
  奇异梯度
> #失败,此后尝试多次均失败
> #参阅资料从《Nonlinear Regression with R》这本书上看到一种可以通过nls2()函数计算初始参数的方法(pp.27-29)
> #安装程序包nls2并加载
> local({pkg <- select.list(sort(.packages(all.available = TRUE)),graphics=TRUE)
+ if(nchar(pkg)) library(pkg, character.only=TRUE)})
载入需要的程辑包:proto
> grid.Disperse <- expand.grid(list(b0 = seq(0.01,4, by = 0.01), b1 = c(0.02),th = seq(0.01, 4, by = 0.01)))#固定参数b1并对其他参数设置取值范围
> Disperse.m2a <- nls2(Retention~expFct2(Area, b0, b1,th), data = cl, start = grid.Disperse, algorithm = "brute-force")
> Disperse.m2a
Nonlinear regression model
  model: Retention ~ expFct2(Area, b0, b1, th)
   data: cl
  b0   b1   th
3.82 0.02 0.01
residual sum-of-squares: 13596

Number of iterations to convergence: 160000
Achieved convergence tolerance: NA
> #经过漫长的运算程序运行成功
> nls.m2<- nls(Retention ~ expFct2(Area, b0, b1, th), data = cl, start = list(b0 = 3.82, b1 = 0.02, th = 0.01))#将计算得到的起始参数带入进行尝试
Error in nls(Retention ~ expFct2(Area, b0, b1, th), data = cl, start = list(b0 = 3.82,  :
  奇异梯度
> #失败,为什么?
> grid.Disperse <- expand.grid(list(b0 = seq(0.01,4, by = 0.01), b1 = c(0.02),th = seq(0.01, 4, by = 0.01)))#减小参数b1进行另一次尝试
> Disperse.m2a <- nls2(Retention~expFct2(Area, b0, b1,th), data = cl, start = grid.Disperse, algorithm = "brute-force")
> Disperse.m2a
Nonlinear regression model
  model: Retention ~ expFct2(Area, b0, b1, th)
   data: cl
  b0   b1   th
3.82 0.01 0.01
residual sum-of-squares: 13584

Number of iterations to convergence: 160000
Achieved convergence tolerance: NA
>#计算得到b0和th没有发生变化
> nls.m2<- nls(Retention ~ expFct2(Area, b0, b1, th), data = cl, start = list(b0 = 3.82, b1 = 0.01, th = 0.01))#尝试将起始参数带入
Error in nls(Retention ~ expFct2(Area, b0, b1, th), data = cl, start = list(b0 = 3.82,  :
  奇异梯度
>依旧失败,后又分别对参数b1或th的起始值固定分别进行运算,错误“Error in numericDeriv(form[[3L]], names(ind), env) :
  在计算模型的时候产生了缺省值或无限值”,彻底崩溃

> #之后又在《Modern Applied Statistics with S》中看到一种不需要精确起始参数,即可进行非线性函数模型拟合的方法(pp.216-217)
> #加载MASS程序包
> local({pkg <- select.list(sort(.packages(all.available = TRUE)),graphics=TRUE)
+ if(nchar(pkg)) library(pkg, character.only=TRUE)})
> negexp <- selfStart(model = ~ exp(b0*exp(b1*x^th)),initial = negexp.SSival, parameters = c("b0", "b1", "th"),
+ template = function(x, b0, b1, th) {})
> Disperse.ss <- nls(Retention ~ negexp(Area, B0, B1, theta),data = cl, trace = T)
         B0          B1       theta
   4.208763  144.205455 1035.324595
Error in qr.default(.swts * attr(rhs, "gradient")) :
  外接函数调用时不能有NA/NaN/Inf(arg1)
> #出现错误,此方法可能是解决本问题的途径,错误如何消除呢?

关键词:nls R语言 非线性 付报酬 Convergence R语言 起始参数
沙发
Whig 在职认证  发表于 2016-8-23 15:11:30 |只看作者 |坛友微信交流群
模型1可以转化为线性,模型2只能做非线性,试试其他的算法吧,nls默认是高斯-牛顿算法
已有 1 人评分热心指数 收起 理由
求证1加1 + 1 热心帮助其他会员

总评分: 热心指数 + 1   查看全部评分

使用道具

藤椅
Dirk47 发表于 2016-8-25 16:05:20 |只看作者 |坛友微信交流群
Whig 发表于 2016-8-23 15:11
模型1可以转化为线性,模型2只能做非线性,试试其他的算法吧,nls默认是高斯-牛顿算法
可以介绍些其他的算法么?

使用道具

板凳
Whig 在职认证  发表于 2016-8-25 16:25:21 |只看作者 |坛友微信交流群
?nls
你的程序我没试运行过,你自己查查文档吧,我只是感觉这地方用高斯牛顿算法貌似不是很合适

使用道具

报纸
Dirk47 发表于 2016-8-27 10:26:18 |只看作者 |坛友微信交流群
好的谢谢,我再尝试一下其他方法

使用道具

地板
yiyumo123 发表于 2017-9-4 10:17:33 来自手机 |只看作者 |坛友微信交流群
Dirk47 发表于 2016-8-27 10:26
好的谢谢,我再尝试一下其他方法
你好,我想问一下你的问题怎么解决的呢?

使用道具

7
yiyumo123 发表于 2017-9-4 10:19:16 来自手机 |只看作者 |坛友微信交流群
Dirk47 发表于 2016-8-23 10:58
我在使用R语言做非线性函数模型nls()拟合,起始参数的设置始终解决不了,参阅了一些相关资料,找到了一些 ...
你可以教我一下吗?我的邮箱850817042@qq.com.谢谢,不甚感激

使用道具

8
大头的脑袋 学生认证  发表于 2017-9-4 18:07:27 |只看作者 |坛友微信交流群
Whig 发表于 2016-8-23 15:11
模型1可以转化为线性,模型2只能做非线性,试试其他的算法吧,nls默认是高斯-牛顿算法
请问模型转换为线性之后计算得到的一些精度指标可以代表转换前方程的精度指标吗?比如R2

使用道具

9
shihuachen 发表于 2019-12-11 18:09:35 |只看作者 |坛友微信交流群
用其他软件先做做,最好用CURVEXPERT,不需要是手工设置初始值,可以直接输出结果如果感兴趣,再可以根据实际结果,设置初始值,再进行分析。

使用道具

10
nieluyi 发表于 2019-12-19 16:59:44 |只看作者 |坛友微信交流群
非线性回归的初始值设置方法:
1.查阅他人已有文献,采用其参数作为初始值;
2.将可线性化的方程进行变换(如对数变换),将其线性化后采用线性回归的计算参数,得到的参数进行相应的变换后代入原方程作为初始值;
3.更改算法,R语言可以尝试minpack包的nls.LM()函数,quantreg包的 dynrq()函数进行分位数回归
4.瞎蒙

使用道具

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-11-5 14:43