ความแตกต่างระหว่าง PROC Mixed และ lme / lmer ใน R - degree of freedom


12

หมายเหตุ: คำถามนี้เป็นคำถามใหม่เนื่องจากต้องลบคำถามก่อนหน้านี้ด้วยเหตุผลทางกฎหมาย


ในขณะที่เปรียบเทียบ PROC MIXED จาก SAS กับฟังก์ชันlmeจากnlmeแพ็คเกจใน R ฉันพบความแตกต่างที่ค่อนข้างสับสน โดยเฉพาะอย่างยิ่งองศาอิสระในการทดสอบที่แตกต่างกันระหว่างPROC MIXEDและlmeและฉันสงสัยว่าทำไม

เริ่มจากชุดข้อมูลต่อไปนี้ (รหัส R ระบุด้านล่าง):

  • ind: ปัจจัยบ่งชี้บุคคลที่จะทำการวัด
  • fac: อวัยวะที่ใช้ทำการวัด
  • trt: ปัจจัยบ่งชี้การรักษา
  • y: ตัวแปรตอบสนองต่อเนื่องบางอย่าง

ความคิดคือการสร้างแบบจำลองง่ายๆดังต่อไปนี้:

y ~ trt + (ind): indเป็นปัจจัยสุ่ม y ~ trt + (fac(ind)): facซ้อนกันindเป็นปัจจัยสุ่ม

โปรดทราบว่ารุ่นสุดท้ายที่ควรทำให้เกิดเอกเป็นมีเพียง 1 ค่าของyสำหรับการรวมกันของทุกและindfac

แบบจำลองแรก

ใน SAS ฉันสร้างโมเดลต่อไปนี้:

PROC MIXED data=Data;
    CLASS ind fac trt;
    MODEL y = trt /s;
    RANDOM ind /s;
run;

ตามบทเรียนแบบเดียวกันในการใช้ R nlmeควรเป็น:

> require(nlme)
> options(contrasts=c(factor="contr.SAS",ordered="contr.poly"))
> m2<-lme(y~trt,random=~1|ind,data=Data)

ทั้งสองรุ่นมีการประมาณค่าสัมประสิทธิ์และ SE เท่ากัน แต่เมื่อทำการทดสอบแบบ F สำหรับเอฟเฟ็กtrtต์พวกเขาใช้จำนวนองศาอิสระต่างกัน:

SAS : 
Type 3 Tests of Fixed Effects 
Effect Num DF Den DF     F  Value Pr > F 
trt         1      8  0.89        0.3724 

R : 
> anova(m2)
            numDF denDF  F-value p-value
(Intercept)     1     8 70.96836  <.0001
trt             1     6  0.89272  0.3812

คำถามที่ 1:ความแตกต่างระหว่างการทดสอบทั้งสองคืออะไร? ทั้งสองถูกติดตั้งโดยใช้ REML และใช้ความแตกต่างเดียวกัน

หมายเหตุ: ฉันลองใช้ค่าที่แตกต่างกันสำหรับตัวเลือก DDFM = (รวมถึง BETWITHIN ซึ่งในทางทฤษฎีควรให้ผลลัพธ์เดียวกันกับ lme)

รุ่นที่สอง

ใน SAS:

PROC MIXED data=Data;
    CLASS ind fac trt;
    MODEL y = trt /s;
    RANDOM fac(ind) /s;
run;

โมเดลที่เทียบเท่าใน R ควรเป็น:

> m4<-lme(y~trt,random=~1|ind/fac,data=Data)

ในกรณีนี้มีความแตกต่างที่แปลกมาก:

  • R เหมาะสมโดยไม่ต้องบ่นในขณะที่ SAS ตั้งข้อสังเกตว่ารัฐสุดท้ายไม่ได้เป็นบวกแน่นอน (ซึ่งไม่แปลกใจฉันเล็กน้อยดูด้านบน)
  • SE ในสัมประสิทธิ์ต่างกัน (เล็กกว่าใน SAS)
  • อีกครั้งการทดสอบ F ใช้จำนวน DF ที่แตกต่างกัน (อันที่จริงแล้วใน SAS นั้นจำนวน = 0)

เอาท์พุท SAS:

Effect     trt Estimate Std Error  DF t Value Pr > |t| 
Intercept        0.8863    0.1192  14    7.43 <.0001 
trt       Cont  -0.1788    0.1686   0   -1.06 . 

เอาท์พุท R:

> summary(m4)
...
Fixed effects: y ~ trt 
               Value Std.Error DF   t-value p-value
(Intercept)  0.88625 0.1337743  8  6.624963  0.0002
trtCont     -0.17875 0.1891855  6 -0.944840  0.3812
...

(โปรดทราบว่าในกรณีนี้การทดสอบ F และ T จะเทียบเท่าและใช้ DF เดียวกัน)

ที่น่าสนใจเมื่อใช้lme4ใน R โมเดลไม่เหมาะ:

> require(lme4)
> m4r <- lmer(y~trt+(1|ind/fac),data=Data)
Error in function (fr, FL, start, REML, verbose)  : 
  Number of levels of a grouping factor for the random effects
must be less than the number of observations

คำถามที่ 2 : อะไรคือความแตกต่างระหว่างรุ่นเหล่านี้กับปัจจัยซ้อนกัน? พวกเขาระบุไว้ถูกต้องหรือไม่และถ้าเป็นเช่นนั้นผลลัพธ์ที่ได้จะแตกต่างกันอย่างไร


ข้อมูลจำลองใน R:

Data <- structure(list(y = c(1.05, 0.86, 1.02, 1.14, 0.68, 1.05, 0.22, 
1.07, 0.46, 0.65, 0.41, 0.82, 0.6, 0.49, 0.68, 1.55), ind = structure(c(1L, 
2L, 3L, 1L, 3L, 4L, 4L, 2L, 5L, 6L, 7L, 8L, 6L, 5L, 7L, 8L), .Label = c("1", 
"2", "3", "4", "5", "6", "7", "8"), class = "factor"), fac = structure(c(1L, 
1L, 1L, 2L, 2L, 1L, 2L, 2L, 2L, 1L, 1L, 1L, 2L, 1L, 2L, 2L), .Label = c("l", 
"r"), class = "factor"), trt = structure(c(2L, 2L, 2L, 2L, 2L, 
2L, 2L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L), .Label = c("Cont", 
"Treat"), class = "factor")), .Names = c("y", "ind", "fac", "trt"
), row.names = c(NA, -16L), class = "data.frame")

ข้อมูลจำลอง:

   y ind fac   trt
1.05   1   l Treat
0.86   2   l Treat
1.02   3   l Treat
1.14   1   r Treat
0.68   3   r Treat
1.05   4   l Treat
0.22   4   r Treat
1.07   2   r Treat
0.46   5   r  Cont
0.65   6   l  Cont
0.41   7   l  Cont
0.82   8   l  Cont
0.60   6   r  Cont
0.49   5   l  Cont
0.68   7   r  Cont
1.55   8   r  Cont

@Aaron: โปรดหาคำตอบของคุณรวมอยู่ในโพสต์นี้ หากคุณสามารถคัดลอกและวางเป็นคำตอบได้ฉันให้คำตอบกับคุณ มันมีประโยชน์มากดังนั้นฉันอยากเก็บไว้ที่นี่ผ่านการทดสอบเชิงซ้อน หลังจากที่ทำเสร็จแล้วฉันจะลบคำตอบออกจากคำถาม
Joris Meys

ฉันกำลังพยายามทำให้ทีมฟื้นคิวเดิมของคุณด้วยการแก้ไขที่โชคร้ายที่ลบล้างความดี - ดังนั้นจึงมีโอกาสที่ดีในการกู้คืนคำตอบดั้งเดิมและรวมไว้ที่นี่

@mbq: มันจะดีแม้ว่าฉันจะจำลองข้อมูลบางอย่าง (ซึ่งฉันใช้ที่นี่) และแก้ไขคำตอบของแอรอนตามนั้น สำหรับคำตอบอื่น ๆ มันจะซับซ้อนกว่านี้เล็กน้อย แต่ฉันก็สามารถลองได้เช่นกัน
Joris Meys

คำตอบของแอรอนเป็นคำตอบที่ดีมาก ฉันหวังว่าพวกเขาจะเห็นมัน น่าเสียดายที่ @Aaron ของคุณจะไม่ติดต่อเขาเว้นแต่เขาจะเข้าร่วมในกระทู้นี้
Wayne

1
ใช่นี่เป็นคำตอบที่ดี ที่นี่ฉันให้ลิงค์ไปยังโพสต์ที่ถูกลบ: stats.stackexchange.com/questions/26556/…ฉันจะเพิ่มลิงค์ไปยังโพสต์ปัจจุบัน
Stéphane Laurent

คำตอบ:


11

สำหรับคำถามแรกวิธีการเริ่มต้นใน SAS เพื่อค้นหา df ไม่ได้ฉลาดมาก มันจะค้นหาคำศัพท์ในเอฟเฟกต์แบบสุ่มซึ่งรวมถึงเอฟเฟกต์แบบคงที่และใช้ ในกรณีนี้เนื่องจากtrtไม่พบสิ่งindนั้นมันไม่ได้ทำในสิ่งที่ถูกต้อง ฉันไม่เคยลองBETWITHINและไม่ทราบรายละเอียด แต่ตัวเลือก Satterthwaite ( satterth) หรือการใช้ind*trtเป็นเอฟเฟกต์แบบสุ่มให้ผลลัพธ์ที่ถูกต้อง

PROC MIXED data=Data;
    CLASS ind fac trt;
    MODEL y = trt /s ddfm=satterth;
    RANDOM ind /s;
run;

PROC MIXED data=Data;
    CLASS ind fac trt;
    MODEL y = trt /s;
    RANDOM ind*trt /s;
run;

สำหรับคำถามที่สองรหัส SAS ของคุณไม่ตรงกับรหัส R ของคุณเลย มีเพียงคำที่ใช้เรียกfac*indในขณะที่รหัส R มีระยะสำหรับทั้งสองและind fac*ind(ดูเอาต์พุตส่วนประกอบความแปรปรวนเพื่อดูสิ่งนี้) การเพิ่มสิ่งนี้ให้ SE เท่ากันสำหรับtrtทุกรุ่นในไตรมาสที่ 1 และไตรมาสที่ 2 (0.1892)

ดังที่คุณทราบนี่เป็นรูปแบบแปลก ๆ ที่พอดีกับfac*indคำที่มีการสังเกตหนึ่งครั้งสำหรับแต่ละระดับดังนั้นจึงเท่ากับคำที่ผิดพลาด สิ่งนี้สะท้อนให้เห็นในเอาต์พุต SAS ซึ่งfac*indคำนี้มีความแปรปรวนเป็นศูนย์ นี่คือสิ่งที่ข้อความผิดพลาดจาก lme4 กำลังบอกคุณ สาเหตุของข้อผิดพลาดคือคุณมักจะพลาดสิ่งบางอย่างเนื่องจากคุณรวมคำที่เป็นข้อผิดพลาดในโมเดลด้วยสองวิธีที่แตกต่างกัน น่าสนใจมีความแตกต่างเล็กน้อยในรุ่น nlme; แต่อย่างใดfac*indคุณจะพบว่าผลรวมของความแปรปรวนทั้งสองนี้เท่ากับเทอมข้อผิดพลาดจากทั้ง SAS และ nlme โดยไม่ต้องใช้fac*indคำนั้น อย่างไรก็ตาม SE สำหรับtrtยังคงเหมือนเดิม (0.1892) ที่trtซ้อนอยู่ในindดังนั้นคำแปรปรวนที่ต่ำกว่าเหล่านี้จะไม่มีผลกับมัน

ในที่สุดบันทึกทั่วไปเกี่ยวกับดีกรีอิสระในโมเดลเหล่านี้: พวกเขาจะคำนวณหลังจากแบบจำลองมีความเหมาะสมและความแตกต่างขององศาอิสระระหว่างโปรแกรมหรือตัวเลือกต่าง ๆ ของโปรแกรมไม่จำเป็นต้องหมายความว่าแบบจำลองนั้นเหมาะสมแตกต่างกัน สำหรับสิ่งนั้นเราต้องดูการประมาณค่าพารามิเตอร์ทั้งพารามิเตอร์เอฟเฟกต์คงที่และพารามิเตอร์ความแปรปรวนร่วม

นอกจากนี้การใช้การประมาณ t และ F ด้วยจำนวนองศาอิสระที่กำหนดนั้นยังเป็นที่ถกเถียงกันอยู่ ไม่เพียง แต่มีหลายวิธีในการประมาณค่า df แต่บางคนเชื่อว่าการกระทำเช่นนั้นไม่ใช่ความคิดที่ดี คำแนะนำสองสามคำ:

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

  2. หากคุณมีตัวอย่างขนาดใหญ่องศาความเป็นอิสระนั้นไม่สำคัญมากนักเมื่อการแจกแจงใกล้เคียงกับค่าปกติและค่าไคสแควร์

  3. ตรวจสอบวิธีการของ Doug Bates เพื่อหาข้อสรุป วิธีการที่เก่ากว่าของเขาอยู่บนพื้นฐานของการจำลอง MCMC; วิธีการใหม่ของเขานั้นขึ้นอยู่กับการทำโปรไฟล์ความน่าจะเป็น


คำตอบที่ดีถึงแม้ว่าฉันคิดว่าการทำโปรไฟล์ความน่าจะเป็นแก้คำถามที่แตกต่าง (CIs ที่เหมาะสมกับพารามิเตอร์ความแปรปรวนที่โปรไฟล์ไม่สมการกำลังสอง) กว่าการจำลอง MCMC (ซึ่งจัดการทั้งการแก้ไขขนาด จำกัด และไม่ใช่กำลังสอง) ฉันคิดว่า bootMer (parametric bootstrap) ใกล้เคียงกับ mcmcsamp มากกว่า confint (profile (... )) ... ...
Ben Bolker

@BenBolker: ได้แน่นอน เมื่อเดือนที่แล้วดั๊กเบตส์พูดคุยเกี่ยวกับความคิดของเขาเกี่ยวกับการทำโปรไฟล์โอกาส นั่นคือทั้งหมดที่ฉันรู้เกี่ยวกับมันจนถึงตอนนี้
แอรอนออกจาก Stack Overflow ใน
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.