幂函数数据的混合效应模型

机器算法验证 r 混合模式 幂律 lme4-nlme
2022-03-31 16:32:36

我有数据,我怀疑随着时间的推移遵循幂函数。它是从具有不同截距的几个单元中收集的。因此,我想做一个混合模型,将幂函数的参数作为固定效应,截距作为随机效应。我可以这样做lme4::nlmer吗?如果没有,我可以用其他方式吗?

用一个可重现的例子来说明,假设我有这个数据,D

x = 1:100
y1 = 7 + 2 * x^0.4 + rnorm(100); plot(y1, main='y1')  # unit 1
y2 = 4 + 2 * x^0.4 + rnorm(100); plot(y2, main='y2')  # unit 2
y3 = 1 + 2 * x^0.4 + rnorm(100); plot(y3, main='y3')  # unit 3
D = data.frame(y=c(y1, y2, y3), id=rep(c(1,2,3), each=100), time=rep(x, 3))
plot(y ~ time, D, main='all')  # combined data

在此处输入图像描述

nls我可以将其建模为具有公共截距的函数的幂函数:

nls(y ~ k + a * time ^ b, D, start=c(a=1, b=1, k=5))

这给了我像 a=1.3(它是 2)、b=0.47(它是 0.4)和 k=5.4(它是 1、4 和 7)这样的估计值。我想做这样的事情:

nlmer(y ~ k + a * time ^ b + (1|id), D)  # doesn't work of course

稍后我将添加更多随机效果。这只是一个最小的可重现示例。

1个回答

(免责声明:摆弄后回答我自己的问题 - 我真的不是这方面的专家,所以请认真阅读)

第 1 步:deriv使用向对象添加必要属性的函数创建一个幂函数,包括截距。您必须有点冗长,指定要估计的参数 ( namevec) 以及nlmer可以使用的参数 ( namevec)。在这种情况下,这有点微不足道,但是如果您有大量复杂的事情正在进行,并且有很多内部变量nlmer在找到最佳拟合时确实不感兴趣,那么这很方便。所以:

power.f = deriv(~k + a*time^b, namevec=c('k', 'a', 'b'), function.arg=c('time','k', 'a','b'))

第 2 步:使用语法拟合非线性模型的参数dependent ~ non-linear ~ fixed + random,其中非线性部分是我们刚刚在上面创建的那种对象。

fit.nlmer = nlmer(y ~ power.f(time, k, a, b) ~ k|id, start=list(nlpars=c(k=2, a=1, b=1)), data=D)

关于第 2 步的一些评论:后一部分是您可能习惯使用的内容,lmer但它不接受仅拦截的内容(例如1|id)。所以这就是为什么你不只是制作 power.f 公式~ a*time^b并在固定随机部分中放置一个随机截距。取而代之的是,您将随机截距“放入”非线性函数中-在这种情况下,它等效于线性截距。

此外:这些start值只是帮助您nlmer从正确的解决方案附近开始,因为可能性景观可能比线性景观更复杂并且包含更多陷阱(高原、局部最小值等)。但是不要太在意是否准确(毕竟,您进行推理是有原因的)。我只是查看了数据并放入了一些并非完全关闭的东西。

要了解为什么这种混合模型的努力与像这样的通用截距模型相比是富有成效的nls,请考虑拟合(观察到的y与模型预测的y):

在此处输入图像描述