- 阅读权限
- 255
- 威望
- 0 级
- 论坛币
- 543 个
- 通用积分
- 5.6752
- 学术水平
- 0 点
- 热心指数
- 0 点
- 信用等级
- 0 点
- 经验
- 141 点
- 帖子
- 13
- 精华
- 0
- 在线时间
- 19 小时
- 注册时间
- 2016-6-28
- 最后登录
- 2024-5-16
高中生
还不是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)
> #出现错误,此方法可能是解决本问题的途径,错误如何消除呢? |
|