ช่วงเวลาความเชื่อมั่นที่น่าเชื่อถือสำหรับวัตถุ lmer ผ่านแพ็คเกจเอฟเฟกต์เป็นอย่างไร?


36

Effectsแพคเกจมีวิธีการอย่างรวดเร็วและสะดวกสบายสำหรับการวางแผนเชิงเส้นผสมผลผลรูปแบบที่ได้รับผ่านแพคเกจlme4 effectช่วงความเชื่อมั่นฟังก์ชั่นคำนวณ (CIS) ได้รวดเร็วมาก แต่วิธีการที่น่าเชื่อถือมีช่วงความเชื่อมั่นเหล่านี้หรือไม่

ตัวอย่างเช่น:

library(lme4)
library(effects)
library(ggplot)

data(Pastes)

fm1  <- lmer(strength ~ batch + (1 | cask), Pastes)
effs <- as.data.frame(effect(c("batch"), fm1))
ggplot(effs, aes(x = batch, y = fit, ymin = lower, ymax = upper)) + 
  geom_rect(xmax = Inf, xmin = -Inf, ymin = effs[effs$batch == "A", "lower"],
        ymax = effs[effs$batch == "A", "upper"], alpha = 0.5, fill = "grey") +
  geom_errorbar(width = 0.2) + geom_point() + theme_bw()

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

ตาม CIs ที่คำนวณโดยใช้effectsแพ็คเกจชุด "E" จะไม่ทับซ้อนกับชุด "A"

ถ้าฉันลองใช้confint.merModฟังก์ชั่นเดียวกันและวิธีการเริ่มต้น:

a <- fixef(fm1)
b <- confint(fm1)
# Computing profile confidence intervals ...
# There were 26 warnings (use warnings() to see them)

b <- data.frame(b)
b <- b[-1:-2,]

b1 <- b[[1]]
b2 <- b[[2]]

dt <- data.frame(fit   = c(a[1],  a[1] + a[2:length(a)]), 
                 lower = c(b1[1],  b1[1] + b1[2:length(b1)]), 
                 upper = c(b2[1],  b2[1] + b2[2:length(b2)]) )
dt$batch <- LETTERS[1:nrow(dt)]

ggplot(dt, aes(x = batch, y = fit, ymin = lower, ymax = upper)) +
  geom_rect(xmax = Inf, xmin = -Inf, ymin = dt[dt$batch == "A", "lower"], 
        ymax = dt[dt$batch == "A", "upper"], alpha = 0.5, fill = "grey") + 
  geom_errorbar(width = 0.2) + geom_point() + theme_bw()

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

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

ฉันลองทำอะไร: ดูที่ซอร์สโค้ดฉันสังเกตว่าeffectฟังก์ชั่นนั้นขึ้นอยู่กับEffect.merModฟังก์ชั่นซึ่งจะนำไปสู่การEffect.merทำงานซึ่งมีลักษณะดังนี้:

effects:::Effect.mer
function (focal.predictors, mod, ...) 
{
    result <- Effect(focal.predictors, mer.to.glm(mod), ...)
    result$formula <- as.formula(formula(mod))
    result
}
<environment: namespace:effects>

mer.to.glmฟังก์ชั่นดูเหมือนว่าจะคำนวณความแปรปรวน - โควต้าเมทริกซ์จากlmerวัตถุ:

effects:::mer.to.glm

function (mod) 
{
...
mod2$vcov <- as.matrix(vcov(mod))
...
mod2
}

ในทางกลับกันนี่อาจใช้ในEffect.defaultการคำนวณ CIs (ฉันอาจเข้าใจผิดในส่วนนี้):

effects:::Effect.default
...
     z <- qnorm(1 - (1 - confidence.level)/2)
        V <- vcov.(mod)
        eff.vcov <- mod.matrix %*% V %*% t(mod.matrix)
        rownames(eff.vcov) <- colnames(eff.vcov) <- NULL
        var <- diag(eff.vcov)
        result$vcov <- eff.vcov
        result$se <- sqrt(var)
        result$lower <- effect - z * result$se
        result$upper <- effect + z * result$se
...

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


1
เมื่อคุณมีโค้ดยาว ๆ ฉันจะขอบคุณมันมากถ้าคุณแบ่งมันเป็นหลายบรรทัดดังนั้นเราไม่จำเป็นต้องเลื่อนดูทั้งหมด
rvl

1
@rvl รหัสควรอ่านได้ง่ายขึ้นในขณะนี้
Mikko

คำตอบ:


52

ผลลัพธ์ทั้งหมดนั้นเป็นสิ่งเดียวกัน ( สำหรับตัวอย่างนี้โดยเฉพาะ ) ความแตกต่างทางทฤษฎีคือ:

  • @rvl ชี้ให้เห็นว่าการสร้าง CIs ของคุณใหม่โดยไม่คำนึงถึงความแปรปรวนร่วมระหว่างพารามิเตอร์นั้นผิด (ขออภัย)
  • ช่วงความเชื่อมั่นสำหรับพารามิเตอร์จะขึ้นอยู่กับช่วงความเชื่อมั่น Wald (สมมติว่าพื้นผิวเข้าสู่ระบบความน่าจะเป็นกำลังสอง): lsmeans, effects, confint(.,method="Wald"); ยกเว้นสำหรับlsmeansวิธีการเหล่านี้ไม่สนใจผลขนาด จำกัด ("องศาอิสระ") แต่ในกรณีนี้มันแทบจะไม่ทำให้เกิดความแตกต่างใด ๆ ( df=40แทบจะแยกไม่ออกจากอนันต์df)
  • ... หรือในช่วงความเชื่อมั่นของโปรไฟล์ (วิธีการเริ่มต้นโดยไม่สนใจเอฟเฟกต์ขนาด จำกัด แต่อนุญาตสำหรับพื้นผิวที่ไม่มีกำลังสอง)
  • ... หรือพาราเมทริกบูตสแตรป (มาตรฐานทองคำ - สมมติว่าโมเดลถูกต้อง [การตอบสนองเป็นปกติเอฟเฟกต์แบบสุ่มมีการแจกแจงแบบปกติข้อมูลมีความเป็นอิสระตามเงื่อนไข ฯลฯ ] แต่มีข้อสันนิษฐานบางประการ)

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

(PS: ฉันจะไม่ทำให้น้ำหนักมากเกินไปกับความจริงที่ว่าช่วงความเชื่อมั่นของAและEไม่ทับซ้อนกันคุณจะต้องทำตามขั้นตอนในการเปรียบเทียบจากจำนวนที่เหมาะสมในการให้ข้อสรุปที่เชื่อถือได้เกี่ยวกับความแตกต่างระหว่างนี้. โดยเฉพาะคู่ของประมาณการ .. )

95% CIs:

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

รหัสเปรียบเทียบ:

library(lme4)
fm2 <- lmer(strength ~ batch - 1 + (1 | cask), Pastes)
c0 <- confint(fm2,method="Wald")
c1 <- confint(fm2)
c2 <- confint(fm2,method="boot")
library(effects)
library(lsmeans)
c3 <- with(effect("batch",fm2),cbind(lower,upper))
c4 <- with(summary(lsmeans(fm2,spec="batch")),cbind(lower.CL,upper.CL))
tmpf <- function(method,val) {
    data.frame(method=method,
               v=LETTERS[1:10],
               setNames(as.data.frame(tail(val,10)),
                        c("lwr","upr")))
}
library(ggplot2); theme_set(theme_bw())
allCI <- rbind(tmpf("lme4_wald",c0),
      tmpf("lme4_prof",c1),
      tmpf("lme4_boot",c2),
      tmpf("effects",c3),
               tmpf("lsmeans",c4))
ggplot(allCI,aes(v,ymin=lwr,ymax=upr,colour=method))+
    geom_linerange(position=position_dodge(width=0.8))

ggsave("pastes_confint.png",width=10)

2
ฉันยอมรับคำตอบนี้เพราะถูกต้องตรงประเด็นและให้การเปรียบเทียบที่ดีระหว่างวิธีการต่างๆ อย่างไรก็ตามตรวจสอบคำตอบที่ยอดเยี่ยมของ rlv สำหรับข้อมูลเพิ่มเติม
Mikko

ขอบคุณสำหรับคำตอบที่ยอดเยี่ยมและเป็นประโยชน์มาก ฉันเข้าใจถูกต้องหรือไม่ว่าไม่สามารถใช้ CIs เพื่อเปรียบเทียบกลุ่ม / แบทช์ แต่สามารถเปรียบเทียบผลกระทบได้ บอกว่าฉันมีสองการรักษาบุคคลหลายคนและหลายวัดภายในบุคคล ฉันจะใช้แต่ละคนเป็นเอฟเฟกต์แบบสุ่มเพราะแต่ละคนจะมีการวัด x จากนั้นฉันอยากรู้ว่าการรักษาทั้งสองนี้ส่งผลให้เกิดการตอบสนองที่แตกต่างกันหรือไม่ ฉันสามารถใช้effectsแพคเกจและ CI ทับซ้อนกันในกรณีนี้ได้ไหม
Mikko

5
นี่เป็นคำถามทั่วไปที่เกี่ยวข้องกับวิธีการตามรูปแบบมาตรฐานใด ๆ อาจจะคุ้มคำถามที่แยกต่างหาก (1) โดยทั่วไปแล้ววิธีการหนึ่งที่ตอบคำถามเกี่ยวกับความแตกต่างระหว่างการรักษาคือการตั้งค่าแบบจำลองเพื่อให้ความแตกต่างระหว่างการรักษาแบบโฟกัสนั้นแตกต่างกัน (เช่นการประมาณพารามิเตอร์) ในแบบจำลองแล้วคำนวณค่า p-value หรือตรวจสอบว่าช่วงความเชื่อมั่นในระดับอัลฟ่านั้นรวมศูนย์หรือไม่ (ต่อ)
Ben Bolker

4
(2) CIs ที่ทับซ้อนกันเป็นเกณฑ์ที่ดีที่สุดและโดยประมาณเป็นเกณฑ์สำหรับความแตกต่างระหว่างพารามิเตอร์ (มีเอกสารเผยแพร่หลายฉบับในหัวข้อนี้) (3) มีปัญหาแยก / orthogonal ที่มีการเปรียบเทียบแบบคู่ซึ่งเป็นสิ่งที่ต้องควบคุมอย่างเหมาะสมสำหรับหลายหลากและไม่เป็นอิสระของการเปรียบเทียบ (นี้สามารถทำได้เช่นโดยวิธีการในmultcompแพคเกจ แต่อย่างน้อยต้องมี การดูแลนิดหน่อย)
Ben Bolker

1
เพื่ออะไร? คุณอาจต้องการถามคำถามใหม่
Ben Bolker

20

ดูเหมือนว่าสิ่งที่คุณทำในวิธีที่สองคือการคำนวณช่วงความเชื่อมั่นสำหรับสัมประสิทธิ์การถดถอยแล้วแปลงค่าเหล่านั้นเพื่อให้ได้ค่า CIs สำหรับการทำนาย สิ่งนี้จะละเว้นความแปรปรวนร่วมระหว่างสัมประสิทธิ์การถดถอย

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

ภาคผนวก 1

ฉันทำสิ่งที่ฉันแนะนำข้างต้นทั้งหมด:

> fm2 <- lmer(strength ~ batch - 1 + (1 | cask), Pastes)
> confint(fm2)
Computing profile confidence intervals ...
           2.5 %    97.5 %
.sig01  0.000000  1.637468
.sigma  2.086385  3.007380
batchA 60.234772 64.298581
batchB 57.268105 61.331915
batchC 60.018105 64.081915
batchD 57.668105 61.731915
batchE 53.868105 57.931915
batchF 59.001439 63.065248
batchG 57.868105 61.931915
batchH 61.084772 65.148581
batchI 56.651439 60.715248
batchJ 56.551439 60.615248

effectsช่วงเวลาเหล่านี้ดูเหมือนจะเสียดสีกับผลที่ได้จาก

ภาคผนวก 2

อีกทางเลือกหนึ่งคือแพ็คเกจlsmeans มันได้รับองศาอิสระและเมทริกซ์ความแปรปรวนร่วมที่ปรับจากแพ็คเกจpbkrtest

> library("lsmeans")
> lsmeans(fm1, "batch")
Loading required namespace: pbkrtest
 batch   lsmean       SE    df lower.CL upper.CL
 A     62.26667 1.125709 40.45 59.99232 64.54101
 B     59.30000 1.125709 40.45 57.02565 61.57435
 C     62.05000 1.125709 40.45 59.77565 64.32435
 D     59.70000 1.125709 40.45 57.42565 61.97435
 E     55.90000 1.125709 40.45 53.62565 58.17435
 F     61.03333 1.125709 40.45 58.75899 63.30768
 G     59.90000 1.125709 40.45 57.62565 62.17435
 H     63.11667 1.125709 40.45 60.84232 65.39101
 I     58.68333 1.125709 40.45 56.40899 60.95768
 J     58.58333 1.125709 40.45 56.30899 60.85768

Confidence level used: 0.95 

เหล่านี้มีมากขึ้นในทิศทางเดียวกับeffectผล: ข้อผิดพลาดมาตรฐานเหมือนกัน แต่effectใช้ที่แตกต่างกัน DF confintผลลัพธ์ในภาคผนวก 1 จะยิ่งแคบกว่าคน asymptotic อยู่บนพื้นฐานของการใช้{} ดังนั้นตอนนี้ฉันคิดว่าสิ่งเหล่านี้ไม่น่าเชื่อถือมาก±1.96×se

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


ขอบคุณสำหรับการแก้ปัญหานี้ ช่วงเวลานี้คล้ายกันมากขึ้นแม้ว่าจะไม่เหมือนกันทุกประการ คำตอบของคุณยังไม่ตอบคำถามว่า CIs จากeffectsแพ็คเกจสามารถเชื่อถือได้สำหรับlmerวัตถุหรือไม่ ฉันกำลังพิจารณาใช้ผลลัพธ์ในสิ่งพิมพ์และต้องการตรวจสอบให้แน่ใจว่า CIs คำนวณโดยใช้วิธีการที่ได้รับอนุมัติสำหรับ LMM
Mikko

คุณช่วยกรุณาบอก: ในภาคผนวก 1 พารามิเตอร์สองครั้งแรก.sig01และ.sigmaผลิตโดยconfintเป็นผู้ที่ช่วงความเชื่อมั่นความแปรปรวน ? หรือช่วงความเชื่อมั่นของ ส่วนเบี่ยงเบนมาตรฐาน ?
ABC

พวกเขาคือ CIs สำหรับพารามิเตอร์ใด ๆ ที่มีข้อความว่าแบบนั้นในแบบจำลอง คุณควรดูเอกสารประกอบสำหรับlmerคำตอบที่ชัดเจน อย่างไรก็ตามผู้คนมักใช้สัญลักษณ์ที่ต้องการsigmaอ้างอิงถึงส่วนเบี่ยงเบนมาตรฐานและsigma.squareหรือsigma^2เพื่ออ้างถึงความแปรปรวน
rvl

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