R中的非线性混合效应回归


14

令人惊讶的是,我无法使用Google找到以下问题的答案:

我有一些个体的生物学数据,这些数据显示了乙状结肠的及时生长行为。因此,我希望使用标准的物流增长对其进行建模

P(t) = k*p0*exp(r*t) / (k+p0*(exp(r*t)-1))

其中p0是t = 0处的起始值,k是t-> infinity处的渐近极限,r是生长速度。据我所知,我可以使用nls对此模型轻松地建模(我缺乏理解:为什么我不能通过缩放时间和数据来使用标准logit回归建模类似的东西?感谢:Nick,显然人们这样做了,例如比例,但很少见http://www.stata-journal.com/article.html?article=st0147。关于此切线的下一个问题是模型是否可以处理> 1的离群值。

现在,我希望允许对三个参数k,p0和r进行固定(主要是分类)和随机(单个ID,还可能是研究ID)影响。nlme是这样做的最好方法吗?SSlogis模型对于我想做的事情似乎很明智,这是正确的吗?以下任一个是明智的模型吗?我似乎无法正确设置起始值,并且update()仅适用于随机效果,而不适用于固定效果-有任何提示吗?

nlme(y ~ k*p0*exp(r*t) / (k+p0*(exp(r*t)-1)), ## not working at all (bad numerical properties?)
            data = data,
            fixed = k + p0 + r ~ var1 + var2,
            random = k + p0 + r ~ 1|UID,
            start = c(p0=1, k=100, r=1))

nlme(y ~ SSlogis(t, Asym, xmid, scal), ## not working, as start= is inappropriate
            data = data,
            fixed = Asym + xmid + scal ~ var1 + var2, ## works fine with ~ 1
            random = Asym + xmid + scal ~ 1|UID,
            start = getInitial(y ~ SSlogis(Dauer, Asym, xmid, scal), data = data))

因为我是非线性混合模型(尤其是非线性模型)的新手,所以我希望获得一些阅读建议或带有新手问题的教程/常见问题解答的链接。


2
如果您认为k是已知的,则可以按P / k缩放总体。如果k是要估计的东西,那仅意味着您的问题不是标准的logit回归。
尼克·考克斯

1
谢谢尼克。是的,最后我认为需要估计k并将其包括在回归中。我对使用logit回归的兴趣纯粹是学术性的。我认为在进行非线性建模之前,这可能是一个很好的模型,但是我无法找到使用Google对非二进制数据进行logit回归的任何示例。我想知道是否有某种原因(例如,关于错误的分布假设)使使用glmer和具有连续数据的logit链接成为一个坏主意。
罗伯·霍尔

3
连续比例响应的Logit建模已经存在了一段时间,但似乎并不为人所知。请参阅stata-journal.com/sjpdf.html?articlenum=st0147中的 Baum。尽管如此,这不是您的情况。我无法评论R实现。
Nick Cox

谢谢尼克提供的这个有趣的链接-为我清除了一些内容。可悲的是,我似乎无法接受您的回应。(以防人们无法访问直接链接,以下代码对我有用stata-journal.com/article.html?article=st0147
Rob Hall,

1
逻辑增长意味着单调上升曲线。如果数据不匹配,则取决于您正在执行的操作,否则安装不正确或软件无法播放。
尼克·考克斯

Answers:


12

我想分享自问这个问题以来我学到的一些东西。nlme似乎是在R中建模非线性混合效果的合理方法。从一个简单的基本模型开始:

library(nlme)
data <- groupedData(y ~ t | UID, data=data) ## not strictly necessary
initVals <- getInitial(y ~ SSlogis(t, Asym, xmid, scal), data = data)
baseModel<- nlme(y ~ SSlogis(t, Asym, xmid, scal),
    data = data,
    fixed = list(Asym ~ 1, xmid ~ 1, scal ~ 1),
    random = Asym + xmid + scal ~ 1|UID,
    start = initVals
)

然后使用更新来增加模型的复杂性。start参数的使用有些棘手,可能需要进行一些修补才能弄清楚顺序。注意var1在Asym上的新固定效果如何遵循Asym的常规固定效果。

 nestedModel <- update(baseModel, fixed=list(Asym ~ var1, xmid ~ 1, scal ~ 1), start = c(fixef(baseModel)[1], 0, fixef(baseModel)[2], fixef(baseModel)[3]))

对于我的数据集中的离群值,lme4似乎更健壮,并且似乎为更复杂的模型提供了更可靠的收敛。但是,不利的一面是需要手动指定相关的似然函数。以下是具有var1(二进制)对Asym固定影响的逻辑增长模型。您可以以类似方式在xmid和scal上添加固定效果。注意使用双公式作为结果〜固定效应〜随机效应指定模型的奇怪方式。

library(lme4) ## careful loading nlme and lme4 concurrently
customLogitModel <- function(t, Asym, AsymVar1, xmid, scal) {
    (Asym+AsymVar1*var1)/(1+exp((xmid-t)/scal))
}

customLogitModelGradient <- deriv(
    body(customLogitModel)[[2]], 
    namevec = c("Asym", "AsymVar1", "xmid", "scal"), 
    function.arg=customLogitModel
)

## find starting parameters
initVals <- getInitial(y ~ SSlogis(t, Asym, xmid, scal), data = data)

# Fit the model
model <- nlmer(
    y ~ customLogitModelGradient(t=t, Asym, AsymVar1, xmid, scal, var1=var) ~ 
    # Random effects with a second ~
    (Asym | UID) + (xmid | UID) + (scal | UID), 
    data = data, 
    start = c(Asym=initVals[1], AsymVar1=0, xmid=initVals[2], scal=initVals[3])
)

1
谢谢Rob的来信,这实际上正是我要处理的数据。我不了解Asym上nestedModel中的var1是什么,以及如何计算它?

这只是一个有关如何包含某些变量对Asym的影响的示例:“以下是具有var1(二进制)对Asym的固定影响的逻辑增长模型”。例如,您具有两个值0和1的变量“ Treated”,因此将“ Treated”替换为“ var1”。
PA6OTA
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.