ошибка Ошибка: шаговой коэффициент уменьшен ниже 0,001 без снижения pwrss при использовании nlmer

Я думаю, что это может быть больше вопрос статистики, чем вопрос R, но у меня есть ошибка Error: step factor reduced below 0.001 without reducing pwrss при попытке подогнать функцию nlmer к данным. Мои данные: https://www.dropbox.com/s/cri5n7lewhc8j02/chweight.RData?dl=0

Я пытаюсь подогнать модель так, чтобы можно было прогнозировать вес цыплят в зависимости от времени для цыплят на диете 1. Я сделал следующее:

   cw1<-subset(ChickWeight, ChickWeight$Diet==1)
m1 <- nlmer(weight~ SSlogis(Time, Asym, xmid, scal) ~ Asym|Chick, cw1, start=c(Asym = 190, xmid = 730, scal = 350))

Могут ли быть другие способы решения этой ошибки? Я думаю, что ошибка связана со значениями Asym, но я плохо понимаю, что она делает, поэтому поможет любое краткое руководство.


person song0089    schedule 16.10.2014    source источник
comment
У меня такая же проблема для подмножества моих данных. Центрирование, масштабирование и логарифмическое преобразование отклика и ковариат мне не помогли. Но вы можете попробовать.   -  person Jonas Lindeløv    schedule 08.03.2015


Ответы (1)


Меня попросили улучшить мой ответ, так что вот моя попытка сделать это.

Эта ошибка обычно возникает из-за того, что ваши начальные значения недостаточно близки к «истинным» значениям, поэтому оптимизатору не удается найти какие-либо локальные улучшения соответствия, удаляясь от них. Вам нужно попытаться предоставить лучшие начальные предположения - иногда это можно сделать, алгебраически решив уравнение в нескольких точках, как описано во многих местах, таких как эта статья. В других случаях вы можете построить данные и попытаться сделать обоснованные предположения о том, какими могут быть параметры, если вы знаете, что параметры «делают» в нелинейной функции (то есть, возможно, параметр 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
comment
Я думаю, что это правильный ответ. Один из способов получить хороший набор начальных значений — заранее сопоставить его с чем-то, что угадывает начальные значения для вас, например. m0 <- nls(weight ~ SSlogis(Time, Asym, xmid, scal), cw1). Тогда коэффициенты m0 (coef(m0)) можно использовать в качестве начальных значений. - person alexforrence; 30.08.2016
comment
Этот ответ оказался в очереди на проверку низкого качества, предположительно потому, что у вас нет кода. Если у вас есть мотивация, было бы здорово, если бы вы могли привести пример, в котором это происходит, а затем показать, как это можно исправить с помощью лучшего первоначального предположения. Таким образом, у вас гораздо больше шансов получить больше голосов и помочь спрашивающему узнать что-то новое. - person lmo; 31.08.2016
comment
Привет @Имо. Я попытался улучшить качество своего ответа. Спасибо! - person Bajcz; 31.08.2016