我认为这可能更多是一个统计问题,而不是 R 问题,但在尝试将 nlmer 函数拟合到数据时,出现错误错误:步长因子降低到 0.001 以下,而没有降低 pwrss
。我的数据是: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 值有关,但我不太了解它在做什么,因此任何简短的指导都会有所帮助。
最佳答案
有人要求我改进我的答案,因此我尝试这样做。
此错误通常会发生,因为您的起始值与“真实”值不够接近,因此优化器无法通过远离它们来找到任何适合的局部改进。您需要尝试提供更好的起始猜测——有时可以通过在几个点上代数求解方程来完成,如许多地方所述,例如 this article 。其他时候,如果您了解参数在非线性函数中的“作用”(即参数 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))
关于r - 使用nlmer时错误错误: step factor reduced below 0. 001而不减少pwrss,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26412299/