Este parece ser um cenário de modelo de crescimento. Suponha que tivéssemos as seguintes variáveis:
occasion
: Tomando valores 1
, 2
, 3
, 4
, 5
para refletir a ocasião que teste foi tomada, 1
sendo o primeiro, ou linha de base.
ID
: o identificador de cada participante.
score
: a pontuação do teste para este participante nesta ocasião do teste.
As interceptações aleatórias ID
cuidarão das diferentes linhas de base (sujeitas a ter participantes suficientes.
Portanto, um modelo linear simples de efeitos mistos para esses dados é (usando a lme4
sintaxe):
score ~ occasion + (1|ID)
ou
score ~ occasion + (occasion|ID)
onde o último permite que a inclinação linear da ocasião varie entre os participantes
No entanto, para o exemplo específico no OP, temos o problema adicional de que a score
variável é delimitada acima pela pontuação máxima no teste. Para permitir isso, precisamos atender ao crescimento não linear. Isso pode ser alcançado de várias maneiras, sendo a mais simples a adição de termos quadráticos e possivelmente cúbicos ao modelo:
score ~ occasion + I(occasion^2) + I(occasion^3) + (1|ID)
Vejamos um exemplo de brinquedo:
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")
Aqui, temos gráficos para 6 participantes, medidos em 5 ocasiões sucessivas, e plotamos os efeitos fixos com a linha preta sólida. Claramente, esse não é um bom modelo para esses dados; portanto, introduzimos um termo quadrático e depois um termo cúbico, depois de centralizar os dados para reduzir a colinearidade:
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")
Aqui vemos que o modelo quadrático é uma melhoria óbvia em relação ao modelo linear, mas não é ideal porque subestima as pontuações da medição final e superestima a da anterior.
O modelo cúbico, por outro lado, parece funcionar muito bem:
p2 + stat_function(fun=fun3, geom="line", size=1, colour="black")
Uma abordagem um pouco mais sofisticada é reconhecer a explicidade do limite superior e usar (por exemplo) um modelo de curva de crescimento logístico. Uma maneira de conseguir isso é transformar o resultado em uma proporção (do limite superior), digamos e modelar o logit dessa proporção, como o resultado de um modelo linear de efeitos mistos . Além de reconhecer o limite superior, isso tem a vantagem adicional de modelar a heteroscasticidade nos resíduos dos dados não transformados, uma vez que parece provável que em testes sucessivos (assumindo que os resultados melhorem) haverá menos variação.ππ/(1−π)
Colocando isso em prática, como esperado, isso também modela muito bem a tendência geral dos dados:
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")
A seguir, mostramos o modo cúbico e os modelos de crescimento logístico plotados juntos, e vemos muito pouca diferença entre eles, embora, como mencionado acima, possamos preferir o modelo de crescimento logístico devido ao problema da heterocedasticidade:
p2 + stat_function(fun=fun3, geom="line", size=1, colour="black") +
stat_function(fun=funlogis, geom="line", size=1, colour="blue")
Uma abordagem mais sofisticada ainda seria o uso de um modelo não linear de efeitos mistos, em que a curva de crescimento logístico é modelada explicitamente, permitindo variações aleatórias nos parâmetros da própria função logística.