Меня попросили улучшить мой ответ, так что вот моя попытка сделать это.
Эта ошибка обычно возникает из-за того, что ваши начальные значения недостаточно близки к «истинным» значениям, поэтому оптимизатору не удается найти какие-либо локальные улучшения соответствия, удаляясь от них. Вам нужно попытаться предоставить лучшие начальные предположения - иногда это можно сделать, алгебраически решив уравнение в нескольких точках, как описано во многих местах, таких как эта статья. В других случаях вы можете построить данные и попытаться сделать обоснованные предположения о том, какими могут быть параметры, если вы знаете, что параметры «делают» в нелинейной функции (то есть, возможно, параметр a
представляет собой асимптоту, b
— масштаб, c
— средняя скорость изменения и т. д.). Лично для меня это сложно, потому что у меня нет математического образования, но большую часть времени я могу сделать разумное предположение.
Однако, чтобы ответить на вопрос более прямо, вот некоторый воспроизводимый код, который должен показать, что рассматриваемая ошибка возникает из-за неверных начальных предположений.
#Create independentand dependent variables, X and Y, and a grouping variable Z.
xs = rep(1:10, times = 10)
ys = 3 + 2*exp(-0.5*xs)
zs = rep(1:10, each=10)
#Put random noise in X.
for (i in 1:100) {
xs[i] = rnorm(1, xs[i], 2)
}
df1 = data.frame(xs, ys, zs) #Assemble data into data frame.
require(lme4) #Turn on our package.
#Define our custom function--in this case, a three-parameter exponential model.
funct1 = funct1 = deriv(~beta0 + beta1*exp(beta2*xs), namevec=c('beta0',
'beta1', 'beta2'), function.arg=c('xs','beta0', 'beta1','beta2'))
#This will return the exact same error because our starting guesses are way off.
test1 = nlmer(ys ~ funct1(xs, beta0, beta1, beta2) ~ (beta0|zs), data = df1,
start=c(beta0=-50,beta1=200,beta2=3))
#Our starting guesses are much better now, and so nlmer is able to converge this time.
test1 = nlmer(ys ~ funct1(xs, beta0, beta1, beta2) ~ (beta0|zs), data = df1,
start=c(beta0=3.2,beta1=1.8,beta2=-0.3))
person
Bajcz
schedule
30.08.2016