Đây dường như là một kịch bản mô hình tăng trưởng. Giả sử chúng ta có các biến sau:
occasion
: Lấy giá trị 1
, 2
, 3
, 4
, 5
để phản ánh các dịp mà thử nghiệm đã được thực hiện, 1
là người đầu tiên, hay đường cơ sở.
ID
: định danh của từng người tham gia.
score
: điểm kiểm tra cho người tham gia trong dịp kiểm tra này.
Chặn ngẫu nhiên ID
sẽ chăm sóc các đường cơ sở khác nhau (có đủ người tham gia.
Do đó, một mô hình hiệu ứng hỗn hợp tuyến tính đơn giản cho các dữ liệu này là (sử dụng lme4
cú pháp):
score ~ occasion + (1|ID)
hoặc là
score ~ occasion + (occasion|ID)
trong đó cái sau cho phép độ dốc tuyến tính thay đổi giữa những người tham gia
Tuy nhiên, đối với ví dụ cụ thể trong OP, chúng tôi có thêm một vấn đề là score
biến bị giới hạn ở trên bởi điểm tối đa trong bài kiểm tra. Để cho phép điều này, chúng ta cần phục vụ cho sự tăng trưởng phi tuyến tính. Điều này có thể đạt được bằng nhiều cách khác nhau, đơn giản nhất là bổ sung các thuật ngữ bậc hai và có thể là khối cho mô hình:
score ~ occasion + I(occasion^2) + I(occasion^3) + (1|ID)
Hãy xem một ví dụ về đồ chơi:
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")
Ở đây chúng tôi có các ô cho 6 người tham gia đã được đo trong 5 lần liên tiếp và chúng tôi đã vẽ các hiệu ứng cố định với đường màu đen. Rõ ràng đây không phải là một mô hình tốt cho những dữ liệu này, vì vậy chúng tôi giới thiệu một thuật ngữ bậc hai và sau đó là một thuật ngữ bậc ba, sau khi căn giữa dữ liệu để giảm sự cộng tuyến:
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")
Ở đây chúng ta thấy rằng mô hình bậc hai là một cải tiến rõ ràng so với mô hình chỉ tuyến tính, nhưng không lý tưởng vì nó đánh giá thấp điểm số cho phép đo cuối cùng và đánh giá quá cao cho mô hình trước đó.
Mặt khác, mô hình khối có vẻ hoạt động rất tốt:
p2 + stat_function(fun=fun3, geom="line", size=1, colour="black")
Một cách tiếp cận phức tạp hơn một chút là nhận ra sự khám phá ràng buộc phía trên và sử dụng (ví dụ) một mô hình đường cong tăng trưởng logistic. Một cách để thực hiện điều này là chuyển đổi kết quả thành tỷ lệ (của giới hạn trên), nóiπ và sau đó mô hình hóa logit của tỷ lệ này, π/(1−π)như kết quả của một mô hình hiệu ứng hỗn hợp tuyến tính. Ngoài việc nhận ra giới hạn trên, điều này còn có thêm lợi thế của việc mô hình hóa tính không đồng nhất trong phần dư của dữ liệu chưa được xử lý, vì có vẻ như qua các thử nghiệm liên tiếp (giả sử rằng kết quả sẽ tốt hơn) sẽ có ít phương sai hơn.
Đưa điều này vào thực tế, như mong đợi, điều này cũng mô hình hóa xu hướng chung trong dữ liệu rất tốt:
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")
Dưới đây cho thấy chế độ hình khối và các mô hình tăng trưởng logistic được vẽ với nhau và chúng tôi thấy rất ít sự khác biệt giữa chúng, mặc dù như đã đề cập ở trên, chúng tôi có thể thích mô hình tăng trưởng logistic do vấn đề không đồng nhất:
p2 + stat_function(fun=fun3, geom="line", size=1, colour="black") +
stat_function(fun=funlogis, geom="line", size=1, colour="blue")
Một cách tiếp cận phức tạp hơn vẫn sẽ là sử dụng mô hình hiệu ứng hỗn hợp phi tuyến trong đó đường cong tăng trưởng logistic được mô hình hóa rõ ràng, cho phép thay đổi ngẫu nhiên các tham số của chính hàm logistic.