这似乎是一种增长模式情景。假设我们有以下变量:
occasion
:取值1
, 2
, 3
, 4
,5
以反映进行测试的场合,1
是第一个或基线。
ID
:每个参与者的标识符。
score
:该参与者在此测试场合的测试分数。
随机截取ID
将处理不同的基线(取决于有足够的参与者。
因此,这些数据的简单线性混合效应模型是(使用lme4
语法):
score ~ occasion + (1|ID)
或者
score ~ occasion + (occasion|ID)
后者允许场合的线性斜率在参与者之间变化
但是,对于 OP 中的特定示例,我们还有一个额外的问题,即该score
变量受测试最高分数的限制。为此,我们需要迎合非线性增长。这可以通过多种方式实现,最简单的是将二次项和可能的三次项添加到模型中:
score ~ occasion + I(occasion^2) + I(occasion^3) + (1|ID)
让我们看一个玩具示例:
require(lme4)
require(ggplot2)
dt2 <- structure(list(occasion = c(0, 1, 2, 3, 4, 0, 1, 2, 3, 4, 0, 1, 2, 3, 4, 0, 1, 2, 3, 4, 0, 1, 2, 3, 4, 0, 1, 2, 3, 4), score = c(55.5, 74.5, 92.5, 97.5, 98.5, 54.5, 81.5, 94.5, 97.5, 98.5, 47.5, 68.5, 86.5, 96.5, 98.5, 56.5, 86.5, 91.5, 97.5, 98.5, 60.5, 84.5, 95.5, 97.5, 99.5, 73.5, 87.5, 96.5, 98.5, 99.5), ID = structure(c(1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L, 3L, 4L, 4L, 4L, 4L, 4L, 5L, 5L, 5L, 5L, 5L, 6L, 6L, 6L, 6L, 6L), .Label = c("1", "2", "3", "4", "5", "6"), class = "factor")), .Names = c("occasion", "score", "ID"), row.names = c(25L, 26L, 27L, 28L, 29L, 31L, 32L, 33L, 34L, 35L, 37L, 38L, 39L, 40L, 41L, 43L, 44L, 45L, 46L, 47L, 49L, 50L, 51L, 52L, 53L, 55L, 56L, 57L, 58L, 59L), class = "data.frame")
m1 <- lmer(score~occasion+(1|ID),data=dt2)
fun1 <- function(x) fixef(m1)[1] + fixef(m1)[2]*x
ggplot(dt2,aes(x=occasion,y=score, color=ID)) + geom_line(size=0.65) + geom_point() +
stat_function(fun=fun1, geom="line", size=1, colour="black")

在这里,我们绘制了 6 名参与者连续 5 次测量的图,并且我们用黑色实线绘制了固定效应。显然,对于这些数据来说,这不是一个好的模型,因此我们在将数据居中以减少共线性之后,引入一个二次项,然后是一个三次项:
dt2$occasion <- dt2$occasion - mean(dt2$occasion)
m2 <- lmer(score~occasion + I(occasion^2) + (1|ID),data=dt2)
fun2 <- function(x) fixef(m2)[1] + fixef(m2)[2]*x + fixef(m2)[3]*(x^2)
m3 <- lmer(score~occasion + I(occasion^2) + I(occasion^3) + (1|ID),data=dt2)
fun3 <- function(x) fixef(m3)[1] + fixef(m3)[2]*x + fixef(m3)[3]*(x^2) + fixef(m3)[4]*(x^3)
p2 <- ggplot(dt2,aes(x=occasion,y=score, color=ID)) + geom_line(size=0.5) + geom_point()
p2 + stat_function(fun=fun2, geom="line", size=1, colour="black")

在这里,我们看到二次模型比仅线性模型有明显的改进,但并不理想,因为它低估了最终测量的分数,而高估了前一个测量的分数。
另一方面,立方模型似乎工作得很好:
p2 + stat_function(fun=fun3, geom="line", size=1, colour="black")

稍微复杂一点的方法是明确识别上限,并使用(例如)逻辑增长曲线模型。实现此目的的一种方法是将结果转换为(上限的)比例,例如π然后对这个比例的logit建模,π/(1−π)作为线性混合效应模型的结果。除了识别上限之外,这还具有在未转换数据的残差中建模异方差性的额外优势,因为在连续测试中(假设结果变得更好)似乎可能会有更少的方差。
正如预期的那样,将其付诸实践,这也很好地模拟了数据的整体趋势:
pi <- dt2$score/100
dt2$logitpi <- log(pi/(1-pi))
m0 <- lmer(logitpi~occasion+(1|ID),data=dt2)
funlogis <- function(x) 100*exp(fixef(m0)[1] + fixef(m0)[2]*x)/(1+exp(fixef(m0)[1] + fixef(m0)[2]*x))
p2 + stat_function(fun=funlogis, geom="line", size=0.5, colour="black")

下面显示了三次模式和逻辑增长模型一起绘制的图,我们看到它们之间的差异很小,尽管如上所述,由于异方差问题,我们可能更喜欢逻辑增长模型:
p2 + stat_function(fun=fun3, geom="line", size=1, colour="black") +
stat_function(fun=funlogis, geom="line", size=1, colour="blue")

更复杂的方法仍然是使用非线性混合效应模型,其中逻辑增长曲线被明确建模,允许逻辑函数本身的参数随机变化。