作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我不明白为什么我不能为这些数据使用 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/
我是一名优秀的程序员,十分优秀!