R에서 lmer와 사용자 정의 대비를 설정하는 방법


9

R의 lmer를 사용하여 cond일부 결과에 대한 조건 ( ) 의 영향을 확인하고 있습니다. 몇 가지 이루어져의 피사체 식별자 데이터 및 인 a, bc조건은 다음과 같다.

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수준의 평균에 bc
  2. 레벨 b에서 레벨로 c.

제 질문은 절편이 세 가지 조건의 평균을 반영하고 계산 된 두 추정값이 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))

경우는 cond2OK 것 같다,하지만 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

다음 단계에서는 긴 형식의 데이터 프레임이 필요합니다. 데이터 프레임은 dat종속 변수가 포함되어 result상기 범주 예측기 cond(레벨 : a, b, 및 c), 및 랜덤 팩터 s.

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

다음에서는 비교하려는 조건에 해당하는 대비 행렬을 만드는 두 가지 방법을 설명합니다.

  1. +2

커스텀 콘트라스트

매트릭스 mat는 레벨 차이에 해당합니다.

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

실제 대비 행렬을 만들기 위해 ginv(from 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

이 대비 매트릭스 cMat는에서 사용할 수 있습니다 lmer.

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

그러나 순서가 질문에 지정한 순서와 일치하지 않습니다. 따라서 열과 행의 순서를 바꿔야합니다. 첫 번째 열은 bvs에 해당하고 두 번째 열 은 및 의 평균에 a해당합니다 .cba

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

이 대비 매트릭스는 사용자 정의 대비 매트릭스와 동일한 비교를 허용합니다. 그러나 행렬의 값이 다르기 때문에 고정 효과 계수도 다릅니다. 놀랍게도, 값은 동일합니다.


감사합니다! 그냥 확인하십시오 지금이 이해 - 나는, 4 수준 변수의 수준의 나머지 부분에 첫 번째 수준을 비교하기를 원한다면 matc(1, -1/3, -1/3, -1/3)? 따라서 항상 수식 (a + (b + c + d) / 3)에서와 같이 숫자를 설정 한 다음 ginv계수가 차이를 직접 반영하도록 적절하게 배율 을 조정합니다. 그리고 Helmert 예제에서 순서를 변경했을 때 질문과 일치하는 것입니까? 그렇지 않으면 대비 순서에 관계없이 결과가 동일해야합니다.
M4RT1NK4

@ M4RT1NK4 수식과 해당 대비가 정확하지 않습니다. 열 순서가 질문의 열 순서와 일치하도록 방금 변경되었습니다. 그러나 첫 번째 레벨이 참조 레벨이므로 행 순서가 중요합니다. 귀하의 예에서 참조 수준은 세 번째 수준입니다.
스벤 호헨 슈타인

@ SvenHohenstein 나는이 답변을 바탕으로 관련 질문이 있었지만, 마음을 보았습니까? stats.stackexchange.com/questions/357781/…
mat
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.