gpt4 book ai didi

r - 如何为 nls 函数找到好的起始值?

转载 作者:行者123 更新时间:2023-12-04 09:42:02 27 4
gpt4 key购买 nike

我不明白为什么我不能为这些数据使用 nls 函数。
我尝试了很多不同的起始值,但总是出现相同的错误。

这是我一直在做的事情:

expFct2 = function (x, a, b,c)
{
a*(1-exp(-x/b)) + c
}
vec_x <- c(77.87,87.76,68.6,66.29)
vec_y <- c(1,1,0.8,0.6)
dt <- data.frame(vec_x=vec_x,vec_y=vec_y)
ggplot(data = dt,aes(x = vec_x, y = vec_y)) + geom_point() +
geom_smooth(data=dt, method="nls", formula=y~expFct2(x, a, b, c),
se=F, start=list(a=1, b=75, c=-5)

我一直有这个错误:
Error in method(formula, data = data, weights = weight, ...) : 
singular gradient

最佳答案

在任何情况下,将三参数非线性模型拟合到四个数据点都将具有适度的挑战性,尽管在这种情况下数据表现良好。第 1 点是您 c 的起始值参数 (-5) 离得很远。绘制与您的起始参数相对应的曲线图(见下文)将帮助您理解这一点(因此认识到您得到的曲线的范围将从最小值 c 到最大值 c+a,以及你的数据是从 0.6 到 1 ...)

然而,即使有更好的开始猜测,我发现自己对控制参数(即 control=nls.control(maxiter=200) )大惊小怪,接着是更多的警告 -- nls并不以其稳健性而著称。所以我尝试了 SSasympOff模型,它实现了您想要拟合的曲线的自启动版本。

start1 <- list(a=1, b=75, c=-5)
start2 <- list(a=0.5, b=75, c=0.5) ## a better guess

pfun <- function(params) {
data.frame(vec_x=60:90,
vec_y=do.call(expFct2,c(list(x=60:90),params)))
}
library(ggplot2)
ggplot(data = dt,aes(x = vec_x, y = vec_y)) + geom_point() +
geom_line(data=pfun(start1))+
geom_line(data=pfun(start2),colour="red")+
geom_smooth(data=dt, method="nls", formula=y~SSasympOff(x, a, b, c),
se=FALSE)

我的一般建议是,如果您适合 nls 更容易弄清楚发生了什么并解决问题 geom_smooth 之外并使用 predict.nls 构建要添加的曲线...

更一般地说,获得好的起始参数的方法是了解您正在拟合的函数的几何形状,以及哪些参数控制曲线的哪些方面。正如我上面提到的, c是偏移的饱和指数曲线的最小值, a是范围,而 b是一个尺度参数(你可以看到当 x=b 时,曲线是 1-exp(-1) 或者大约是从最小值到最大值的 2/3)。要么有点代数和微积分(即限制),要么玩弄 curve()函数,是收集这些信息的好方法。

关于r - 如何为 nls 函数找到好的起始值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9692677/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com