lme () และ lmer () ให้ผลลัพธ์ที่ขัดแย้งกัน


20

ฉันทำงานกับข้อมูลบางอย่างที่มีปัญหากับการวัดซ้ำ ๆ ในการทำเช่นนั้นฉันสังเกตเห็นพฤติกรรมที่แตกต่างกันมากระหว่างlme()และlmer()ใช้ข้อมูลทดสอบของฉันและต้องการทราบสาเหตุ

ชุดข้อมูลปลอมที่ฉันสร้างขึ้นนั้นมีการวัดส่วนสูงและน้ำหนักสำหรับ 10 วิชาถ่ายสองครั้ง ฉันตั้งค่าข้อมูลเพื่อให้ระหว่างวิชาจะมีความสัมพันธ์เชิงบวกระหว่างความสูงและน้ำหนัก แต่ความสัมพันธ์เชิงลบระหว่างการวัดซ้ำภายในแต่ละบุคคล

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

นี่คือพล็อตของข้อมูลที่มีเส้นเชื่อมต่อการวัดทั้งสองจากแต่ละบุคคล ป้อนคำอธิบายรูปภาพที่นี่

ดังนั้นผมจึงวิ่งสองรุ่นหนึ่งที่มีlme()จากnlmeแพคเกจและเป็นหนึ่งเดียวกับจากlmer() lme4ในทั้งสองกรณีฉันทำการถดถอยของน้ำหนักเทียบกับส่วนสูงโดยใช้เอฟเฟกต์แบบสุ่มของ ID เพื่อควบคุมการวัดซ้ำของแต่ละคน

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

ทั้งสองรุ่นมักจะ (แต่ไม่ได้ขึ้นอยู่กับเมล็ดเสมอ) สร้างผลลัพธ์ที่แตกต่างอย่างสิ้นเชิง ฉันได้เห็นว่าพวกเขาสร้างการประมาณค่าความแปรปรวนที่แตกต่างกันเล็กน้อยคำนวณองศาอิสระที่แตกต่างกัน ฯลฯ แต่ที่นี่สัมประสิทธิ์อยู่ในทิศทางตรงกันข้าม

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

เพื่อแสดงให้เห็นด้วยสายตาให้ทำโมเดลด้วย lme()

ป้อนคำอธิบายรูปภาพที่นี่

และรูปแบบด้วย lmer()

ป้อนคำอธิบายรูปภาพที่นี่

ทำไมแบบจำลองเหล่านี้ถึงได้แตกต่างกันมาก?


2
เป็นตัวอย่างที่ยอดเยี่ยม นอกจากนี้ยังเป็นตัวอย่างที่มีประโยชน์ของกรณีที่การปรับค่าคงที่และเอฟเฟกต์แบบสุ่มของแต่ละคนจะให้ค่าสัมประสิทธิ์การประมาณค่าที่แตกต่างกันอย่างสมบูรณ์สำหรับคำว่าน้ำหนัก
Jacob Socolar

คำตอบ:


25

tl; drหากคุณเปลี่ยนเครื่องมือเพิ่มประสิทธิภาพเป็น "nloptwrap" ฉันคิดว่ามันจะหลีกเลี่ยงปัญหาเหล่านี้ (อาจ)

ขอแสดงความยินดีคุณพบหนึ่งในตัวอย่างที่ง่ายที่สุดของหลาย optima ในปัญหาการประมาณทางสถิติ! พารามิเตอร์ที่lme4ใช้ภายใน (สะดวกสำหรับภาพประกอบ) คือค่าเบี่ยงเบนมาตรฐานที่ปรับสัดส่วนของเอฟเฟกต์แบบสุ่มนั่นคือ std dev ระหว่างกลุ่มแบ่งออกโดยส่วนที่เหลือ std dev

แยกค่าเหล่านี้สำหรับต้นฉบับlmeและlmerพอดี:

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

แก้ไขใหม่ด้วยเครื่องมือเพิ่มประสิทธิภาพอื่น (ซึ่งอาจเป็นค่าเริ่มต้นในรุ่นถัดไปlme4):

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

ตรงกันlme... เรามาดูกันว่าเกิดอะไรขึ้น ฟังก์ชั่นอันซ์ (-2 โอกาสบันทึก *) หรือในกรณีนี้ฟังก์ชั่น REML-เกณฑ์คล้ายคลึงสำหรับ LMMS มีผลสุ่มเดียวใช้เวลาเพียงหนึ่งอาร์กิวเมนต์เพราะพารามิเตอร์การแก้ไขผลกระทบที่มีประวัติออก ; สามารถคำนวณได้โดยอัตโนมัติสำหรับค่าเบี่ยงเบนมาตรฐาน 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()

ป้อนคำอธิบายรูปภาพที่นี่

ฉันยังคงครอบงำต่อไปมากกว่านี้และวิ่งเหมาะสำหรับเมล็ดสุ่ม 1-1000 เหมาะสมlme, lmerและlmer+ nloptwrap สำหรับแต่ละกรณี นี่คือตัวเลขจาก 1,000 วิธีที่กำหนดให้ได้รับคำตอบที่อย่างน้อย 0.001 หน่วยเบี่ยงเบนเลวร้ายยิ่งกว่าอีก ...

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

กล่าวอีกนัยหนึ่ง (1) ไม่มีวิธีที่ดีที่สุดเสมอ (2) lmerด้วยเครื่องมือเพิ่มประสิทธิภาพเริ่มต้นที่เลวร้ายที่สุด (ล้มเหลวประมาณ 1/3 ของเวลา) (3) lmerด้วย "nloptwrap" ดีที่สุด (แย่กว่าlme4% ของเวลาไม่ค่อยแย่กว่าlmer)

เพื่อความมั่นใจเล็กน้อยฉันคิดว่าสถานการณ์นี้น่าจะเลวร้ายที่สุดสำหรับผู้ป่วยรายเล็กที่ไม่ได้รับการชำระเงิน (เช่นข้อผิดพลาดที่เหลือที่นี่มีความสม่ำเสมอมากกว่าปกติ มันน่าสนใจที่จะสำรวจสิ่งนี้อย่างเป็นระบบมากขึ้น ...

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.