如何使用nlmer()对重复测量数据拟合非线性混合效应模型?


12

我正在尝试分析重复测量的数据,并努力使其在R。我的数据基本上如下,我有两个治疗组。每组中的每个主题每天都要接受测试,并给出分数(测试正确率)。数据为长格式:

Time Percent Subject   Group
   1       0    GK11 Ethanol
   2       0    GK11 Ethanol
   3       0    GK11 Ethanol
   4       0    GK11 Ethanol
   5       0    GK11 Ethanol
   6       0    GK11 Ethanol

数据类似于对数曲线,受试者在几天内表现很差,随后迅速改善,随后达到平稳状态。我想知道这种处理方法是否会对测试性能曲线产生影响。我的想法是在中使用nlmer()lme4软件包R。我可以使用以下方法为每个组拟合线条:

print(nm1 <- nlmer(Percent ~ SSlogis(Time,Asym, xmid, scal) ~ Asym | Subject,
salinedata, start = c(Asym =.60,  xmid = 23, scal = 5)), corr = FALSE)

然后,我可以通过查看不同参数的估计值和估计线的标准偏差来比较组,但是我不确定这是否是正确的方法。任何帮助将不胜感激。

Answers:


4

您可以使用正常似然比检验。这是一个简单的例子。首先,让我们根据您的参数从10个人创建观察值:

Asym = .6
xmid = 23
scal = 5

n = 10
time = seq(1,60,5)

d = data.frame(time=rep(time,10),
               Asym, xmid, scal, group=0)
d$subj = factor(rep(1:n, each=length(time)))

现在让其中的一半具有不同的渐近线和中点参数:

ind = (nrow(d)/2):nrow(d)
d$Asym[ind] = d$Asym[ind] + .1
d$xmid[ind] = d$xmid[ind] + 10
d$group[ind] = 1
d$group=factor(d$group)

我们可以基于模型为所有个体模拟响应值:

set.seed(1)
d = transform(d, y = Asym/(1+exp((xmid-time)/scal)) +
                     rnorm(nrow(d), sd=.04))
library(lattice)
xyplot(y~time | group, group=subj,
       data=d, type=c("g","l"), col="black")

数据的意大利面条图

我们可以看到两组之间明显的差异,这些差异应该可以体现。现在让我们首先尝试拟合一个简单的模型,而忽略组:

> fm1 = nls(y ~ SSlogis(time, Asym, xmid, scal), data=d)
> coef(fm1)
      Asym       xmid       scal 
 0.6633042 28.5219166  5.8286082

也许和预期的一样,对Asym和的估计xmid值介于两组的实际参数值之间。(不过,这种情况并不明显,因为scale参数也已更改,以调整模型的错误指定。)现在,让我们拟合一个完整的模型,为两组使用不同的参数:

> fm2 = nls(y ~ SSlogis(time, Asym[group], xmid[group], scal[group]),
          data=d,
          start=list(Asym=rep(.6,2), xmid=rep(23,2), scal=rep(5,2)))
> coef(fm2)
    Asym1     Asym2     xmid1     xmid2     scal1     scal2 
 0.602768  0.714199 22.769315 33.331976  4.629332  4.749555

由于这两个模型是嵌套的,因此我们可以进行似然比检验:

> anova(fm1, fm2)
Analysis of Variance Table

Model 1: y ~ SSlogis(time, Asym, xmid, scal)
Model 2: y ~ SSlogis(time, Asym[group], xmid[group], scal[group])
  Res.Df Res.Sum Sq Df  Sum Sq F value    Pr(>F)    
1    117    0.70968                                 
2    114    0.13934  3 0.57034  155.54 < 2.2e-16 ***
---
Signif. codes:  0***0.001**0.01*0.05 ‘.’ 0.1 ‘ ’ 1

极小的p值清楚地表明简单模型太简单了。两组的参数确实不同。

但是,两个标尺参数估计值几乎相同,相差仅为1.。也许我们只需要一个比例参数?(当然,我们知道答案是肯定的,因为我们有模拟数据。)

(两个渐近线参数之间的差异也仅为0.1,但是当我们考虑标准误差时,这是一个很大的差异–参见summary(fm2)。)

因此,我们拟合了一个新模型,该模型scale的两组参数相同,但参数Asym和相同xmid,如前所述:

> fm3 = nls(y ~ SSlogis(time, Asym[group], xmid[group], scal),
          data=d,
          start=list(Asym=rep(.6,2), xmid=rep(23,2), scal=5))
> coef(fm3)
     Asym1      Asym2      xmid1      xmid2       scal 
 0.6035251  0.7129002 22.7821155 33.3080264  4.6928316

由于简化模型嵌套在完整模型中,因此我们可以再次进行似然比检验:

> anova(fm3, fm2)
Analysis of Variance Table

Model 1: y ~ SSlogis(time, Asym[group], xmid[group], scal)
Model 2: y ~ SSlogis(time, Asym[group], xmid[group], scal[group])
  Res.Df Res.Sum Sq Df     Sum Sq F value Pr(>F)
1    115    0.13945                             
2    114    0.13934  1 0.00010637   0.087 0.7685

大的p值表明缩小的模型与整个模型一样符合预期。

当然,我们可以进行类似的测试来检查just Asym,just xmid或两者是否需要不同的参数值。也就是说,我建议像这样进行逐步回归以消除参数。相反,只需fm2针对简单模型(fm1)测试完整模型(),并对结果感到满意。为了量化任何差异,绘图将很有帮助。


这是一个很好的答案。如果对几个个体进行两次测量,并且您想控制个体内部的相关性,您将如何改变此分析?如果您能帮助您,我将感激您的两分钱!(stats.stackexchange.com/questions/203040/...
新星

与使用这种方法nlmer()来说明随时间推移对样本进行重复测量相比,该方法有何不同?您可以执行相同的策略,但将1个具有随机效果的模型拟合为subject,将1个具有随机效果的group模型拟合为subject仅和比较的模型。
Stefan Avey '18
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.