Подгонка трехпараметрической нелинейной модели к четырем точкам данных будет в любом случае довольно сложной задачей, хотя в этом случае данные ведут себя хорошо. Точка # 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()
, являются хорошими способами сбора этой информации.