lme () và lmer () đưa ra kết quả mâu thuẫn


20

Tôi đã làm việc với một số dữ liệu có một số vấn đề với các phép đo lặp đi lặp lại. Khi làm như vậy tôi nhận thấy hành vi rất khác nhau giữa lme()lmer()sử dụng dữ liệu thử nghiệm của mình và muốn biết tại sao.

Bộ dữ liệu giả mà tôi tạo có số đo chiều cao và cân nặng cho 10 đối tượng, được thực hiện hai lần mỗi đối tượng. Tôi thiết lập dữ liệu để giữa các đối tượng sẽ có mối quan hệ tích cực giữa chiều cao và cân nặng, nhưng mối quan hệ tiêu cực giữa các biện pháp lặp đi lặp lại trong mỗi cá nhân.

set.seed(21)
Height=1:10; Height=Height+runif(10,min=0,max=3) #First height measurement
Weight=1:10; Weight=Weight+runif(10,min=0,max=3) #First weight measurement

Height2=Height+runif(10,min=0,max=1) #second height measurement
Weight2=Weight-runif(10,min=0,max=1) #second weight measurement

Height=c(Height,Height2) #combine height and wight measurements
Weight=c(Weight,Weight2)

DF=data.frame(Height,Weight) #generate data frame
DF$ID=as.factor(rep(1:10,2)) #add subject ID
DF$Number=as.factor(c(rep(1,10),rep(2,10))) #differentiate between first and second measurement

Dưới đây là một biểu đồ của dữ liệu, với các đường nối hai phép đo từ mỗi cá nhân. nhập mô tả hình ảnh ở đây

Vì vậy, tôi đã chạy hai mô hình, một với lme()từ nlmegói và một với lmer()từ lme4. Trong cả hai trường hợp, tôi chạy hồi quy cân nặng so với chiều cao với hiệu ứng ngẫu nhiên của ID để kiểm soát các phép đo lặp lại của mỗi cá nhân.

library(nlme)
Mlme=lme(Height~Weight,random=~1|ID,data=DF)
library(lme4)
Mlmer=lmer(Height~Weight+(1|ID),data=DF)

Hai mô hình này thường (mặc dù không phải luôn luôn phụ thuộc vào hạt giống) tạo ra kết quả hoàn toàn khác nhau. Tôi đã thấy nơi họ tạo ra các ước tính phương sai hơi khác nhau, tính toán các mức độ tự do khác nhau, v.v., nhưng ở đây các hệ số nằm ở hai hướng ngược nhau.

coef(Mlme)
#   (Intercept)    Weight
#1   1.57102183 0.7477639
#2  -0.08765784 0.7477639
#3   3.33128509 0.7477639
#4   1.09639883 0.7477639
#5   4.08969282 0.7477639
#6   4.48649982 0.7477639
#7   1.37824171 0.7477639
#8   2.54690995 0.7477639
#9   4.43051687 0.7477639
#10  4.04812243 0.7477639

coef(Mlmer)
#   (Intercept)    Weight
#1     4.689264 -0.516824
#2     5.427231 -0.516824
#3     6.943274 -0.516824
#4     7.832617 -0.516824
#5    10.656164 -0.516824
#6    12.256954 -0.516824
#7    11.963619 -0.516824
#8    13.304242 -0.516824
#9    17.637284 -0.516824
#10   18.883624 -0.516824

Để minh họa trực quan, mô hình với lme()

nhập mô tả hình ảnh ở đây

Và mô hình với lmer()

nhập mô tả hình ảnh ở đây

Tại sao các mô hình này phân kỳ rất nhiều?


2
Thật là một ví dụ tuyệt vời. Đây cũng là một ví dụ hữu ích về trường hợp phù hợp với hiệu ứng cố định so với ngẫu nhiên của từng cá nhân đưa ra ước tính hệ số hoàn toàn khác nhau cho thời hạn trọng số.
Jacob Socolar

Câu trả lời:


25

tl; dr nếu bạn thay đổi trình tối ưu hóa thành "nloptwrap" Tôi nghĩ rằng nó sẽ tránh được những vấn đề này (có thể).

Xin chúc mừng, bạn đã tìm thấy một trong những ví dụ đơn giản nhất về nhiều tối ưu trong bài toán ước tính thống kê! Tham số lme4sử dụng bên trong (do đó thuận tiện cho việc minh họa) là độ lệch chuẩn theo tỷ lệ của các hiệu ứng ngẫu nhiên, tức là dev std giữa các nhóm được chia cho dev std còn lại.

Trích xuất các giá trị này cho bản gốc lmelmerphù hợp:

(sd1 <- sqrt(getVarCov(Mlme)[[1]])/sigma(Mlme))
## 2.332469
(sd2 <- getME(Mlmer,"theta")) ## 14.48926

Refit với một trình tối ưu hóa khác (điều này có thể sẽ là mặc định trong phiên bản tiếp theo của lme4):

Mlmer2 <- update(Mlmer,
  control=lmerControl(optimizer="nloptwrap"))
sd3 <- getME(Mlmer2,"theta")   ## 2.33247

Các trận đấu lme... hãy xem điều gì đang diễn ra. Hàm lệch (khả năng ghi nhật ký -2 *) hoặc trong trường hợp này là hàm tiêu chí REML tương tự, đối với các LMM có hiệu ứng ngẫu nhiên duy nhất chỉ mất một đối số, vì các tham số hiệu ứng cố định được lược tả ; chúng có thể được tính toán tự động cho một giá trị nhất định của độ lệch chuẩn RE.

ff <- as.function(Mlmer)
tvec <- seq(0,20,length=101)
Lvec <- sapply(tvec,ff)
png("CV38425.png")
par(bty="l",las=1)
plot(tvec,Lvec,type="l",
     ylab="REML criterion",
     xlab="scaled random effects standard deviation")
abline(v=1,lty=2)
points(sd1,ff(sd1),pch=16,col=1)
points(sd2,ff(sd2),pch=16,col=2)
points(sd3,ff(sd3),pch=1,col=4)
dev.off()

nhập mô tả hình ảnh ở đây

Tôi tiếp tục ám ảnh hơn nữa trong này và chạy phù hợp cho hạt giống ngẫu nhiên 1-1000, phù hợp lme, lmerlmer+ nloptwrap cho từng trường hợp. Dưới đây là những con số trong số 1000 trong đó một phương thức nhất định nhận được câu trả lời có ít nhất 0,001 đơn vị sai lệch kém hơn ...

          lme.dev lmer.dev lmer2.dev
lme.dev         0       64        61
lmer.dev      369        0       326
lmer2.dev      43        3         0

Nói cách khác, (1) không có phương pháp nào luôn hoạt động tốt nhất; (2) lmervới trình tối ưu hóa mặc định là tồi tệ nhất (thất bại khoảng 1/3 thời gian); (3) lmervới "nloptwrap" là tốt nhất (tệ hơn lme4% thời gian, hiếm khi tệ hơn lmer).

Để yên tâm một chút, tôi nghĩ rằng tình huống này có thể là tồi tệ nhất đối với các trường hợp nhỏ, sai chính tả (nghĩa là lỗi dư ở đây là thống nhất chứ không phải Bình thường). Sẽ rất thú vị khi khám phá điều này một cách có hệ thống hơn mặc dù ...

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.