วิธีการตั้งค่าความแตกต่างที่กำหนดเองกับ lmer ใน R


9

ฉันใช้ lmer ใน R เพื่อตรวจสอบผลกระทบของ condition ( cond) ต่อผลลัพธ์บางรายการ นี่คือบางส่วนทำข้อมูลที่อยู่ที่ระบุเรื่องและa, bและcเงื่อนไข

library("tidyr")
library("dplyr")
set.seed(123)
temp <- data.frame(s = paste0("S", 1:30), 
                   a = rnorm(30, -2, 1), 
                   b = rnorm(30, -3, 1), 
                   c = rnorm(30, -4, 1)) 

ฉันต้องการจะเปรียบเทียบ

  1. ระดับaของค่าเฉลี่ยของระดับbและcและ
  2. ระดับไปที่ระดับbc

คำถามของฉันคือฉันจะตั้งค่าความแตกต่างได้อย่างไรในวิธีที่การสกัดกั้นสะท้อนค่าเฉลี่ยของสามเงื่อนไขและประมาณการที่คำนวณได้ทั้งสองสะท้อนถึงความแตกต่างโดยตรงตามที่กำหนดใน 1 และ 2?

ฉันลองด้วย

c1 <- cbind(c(-0.5, 0.25, 0.25), c(0, -0.5, 0.5))
gather(temp, cond, result, a, b, c) %>%
  lmer(result ~ cond + (1|s), data = ., contrasts = list(cond = c1))

ที่cond2ดูเหมือนจะตกลง แต่cond1ไม่ใช่

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

c2 <- t(ginv(c1))
gather(temp, cond, result, a, b, c) %>%
  lmer(result ~ cond + (1|s), data = ., contrasts = list(cond = c2))

ฉันลองใช้ Helmert ตรงกันข้ามเช่นกัน แต่ค่าเฉลี่ยยังไม่ตรงกัน

gather(temp, cond, result, a, b, c) %>%
  mutate(cond = factor(cond, levels = c("c", "b", "a"))) %>%
  lmer(result ~ cond + (1|s), data = ., contrasts = list(cond = contr.helmert))

วิธีที่ถูกต้องในการทำเช่นนี้คืออะไร?


ฟังดูเหมือนความแตกต่างของ Helmert (c คือระดับแรกจากนั้น b และ a)
Michael M

ฉันลองใช้ Helmert เหมือนกัน แต่ตัวเลขไม่ใช่วิธีที่ฉันกำลังมองหา ฉันได้แก้ไขคำถามเพื่อรวมความแตกต่างของ Helmert แล้วขอบคุณ
M4RT1NK4

คำตอบ:


13

สำหรับขั้นตอนต่อไปนี้เราต้องการ data frame ในรูปแบบยาว กรอบข้อมูลที่datมีตัวแปรตามresultที่ทำนายเด็ดขาดcond(ระดับa, bและc) sและปัจจัยสุ่ม

library(tidyr)
dat <- gather(temp, cond, result, a, b, c)

ในต่อไปนี้ฉันจะแสดงสองวิธีในการสร้างเมทริกซ์ความคมชัดที่สอดคล้องกับเงื่อนไขที่คุณต้องการเปรียบเทียบ:

  1. ab+c2
  2. bc

ความแตกต่างที่กำหนดเอง

เมทริกซ์matสอดคล้องกับความแตกต่างของระดับ

mat <- rbind(c(1, -0.5, -0.5),     # a vs. (b + c) / 2
             c(0, 1, -1))          # b vs. c

ในการสร้างเมทริกซ์คอนทราสต์ที่แท้จริงเราจะคำนวณอินเวอร์สทั่วไปกับginv(จากMASS)

library(MASS)
cMat <- ginv(mat)
#            [,1]          [,2]
# [1,]  0.6666667 -7.130169e-17
# [2,] -0.3333333  5.000000e-01
# [3,] -0.3333333 -5.000000e-01

เมทริกซ์ความคมชัดนี้สามารถนำมาใช้ในการcMatlmer

library(lme4)
res <- lmer(result ~ cond + (1|s), data = dat, 
            contrasts = list(cond = cMat))
coef(summary(res))    
#              Estimate Std. Error    t value
# (Intercept) -2.948115  0.0946025 -31.163182
# cond1        1.351517  0.2006822   6.734612
# cond2        1.153918  0.2317279   4.979625

อย่างที่คุณเห็นการประมาณผลกระทบคงที่สอดคล้องกับความแตกต่างที่ระบุข้างต้น นอกจากนี้การสกัดกั้นหมายถึงค่าเฉลี่ยโดยรวม

Helmert ตรงกันข้ามกับ contr.helmert

คุณยังสามารถใช้contr.helmertฟังก์ชันในตัวเพื่อสร้างเมทริกซ์คอนทราสต์

cHelmert <- contr.helmert(3)
#   [,1] [,2]
# 1   -1   -1
# 2    1   -1
# 3    0    2

อย่างไรก็ตามคำสั่งซื้อไม่สอดคล้องกับคำสั่งซื้อที่คุณระบุในคำถาม ดังนั้นเราต้องกลับลำดับของคอลัมน์และแถว สอดคล้องคอลัมน์แรกที่จะbเทียบกับaและครั้งที่สองหนึ่งสอดคล้องกับcเทียบกับค่าเฉลี่ยและba

cHelmert2 <- cHelmert[c(3:1), 2:1]
#   [,1] [,2]
# 3    2    0
# 2   -1    1
# 1   -1   -1

เปรียบเทียบเมทริกซ์ความคมชัดในการcHelmert2 cMatคุณจะสังเกตเห็นว่าคอลัมน์นั้นเป็นเมทริกซ์อื่น ๆ

ผลลัพธ์ของlmerคือ:

library(lme4)
res2 <- lmer(result ~ cond + (1|s), data = dat, 
             contrasts = list(cond = cHelmert2))
coef(summary(res2))    
#               Estimate Std. Error    t value
# (Intercept) -2.9481150 0.09460250 -31.163182
# cond1        0.4505056 0.06689407   6.734612
# cond2        0.5769590 0.11586393   4.979625

เมทริกซ์คอนทราสต์นี้ช่วยให้การเปรียบเทียบเช่นเดียวกับเมทริกซ์คอนทราสต์ที่กำหนดเอง อย่างไรก็ตามเนื่องจากค่าในเมทริกซ์นั้นแตกต่างกันสัมประสิทธิ์ผลคงที่ก็แตกต่างกันเช่นกัน ไม่น่าแปลกใจที่ค่าเหมือนกันt


เยี่ยมมากขอบคุณ! เพื่อให้แน่ใจว่าฉันเข้าใจสิ่งนี้แล้ว - ถ้าฉันต้องการเปรียบเทียบระดับแรกกับระดับที่เหลือในตัวแปร 4 ระดับmatจะเป็นc(1, -1/3, -1/3, -1/3)อย่างไร ดังนั้นฉันมักจะตั้งค่าตัวเลขตามที่ควรจะเป็นในสูตร (a + (b + c + d) / 3) จากนั้นginvปรับขนาดให้เหมาะสมเพื่อให้สัมประสิทธิ์สะท้อนความแตกต่างโดยตรง และเมื่อคุณเปลี่ยนลำดับในตัวอย่างของ Helmert นั่นเป็นเพียงเพื่อให้ตรงกับคำถามหรือไม่ มิฉะนั้นผลลัพธ์ควรเหมือนกันโดยไม่คำนึงถึงลำดับความแตกต่างใช่ไหม
M4RT1NK4

@ M4RT1NK4 สูตรและความคมชัดที่สอดคล้องกันนั้นไม่ถูกต้อง ลำดับของคอลัมน์ถูกเปลี่ยนเพื่อให้ตรงกับลำดับของคอลัมน์ในคำถาม อย่างไรก็ตามลำดับของแถวมีความสำคัญเนื่องจากระดับแรกคือระดับการอ้างอิง ในตัวอย่างของคุณระดับการอ้างอิงคือระดับที่สาม
Sven Hohenstein

@SvenHohenstein ฉันมีคำถามที่เกี่ยวข้องตามคำตอบนี้ใจมีลักษณะ? stats.stackexchange.com/questions/357781/...
เสื่อ
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.