Come impostare contrasti personalizzati con lmer in R


9

Sto usando lmer in R per verificare l'effetto di condition ( cond) su alcuni risultati. Ecco alcuni dati inventati, dove s è l'identificatore del soggetto e a, be csono le condizioni.

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)) 

Vorrei confrontare

  1. livello aalla media dei livelli be ce
  2. livello bper livello c.

La mia domanda è: come posso impostare i contrasti per farlo in modo tale che l'intercettazione rifletta la media delle tre condizioni e le due stime calcolate riflettano direttamente le differenze come definite in 1. e 2.?

Ci ho provato

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))

dove cond2sembra essere OK, ma cond1non lo è.

Seguendo Come interpretare questi contrasti personalizzati? , Ho cercato di utilizzare invece l'inverso generalizzato, ma queste stime non hanno nemmeno senso.

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

Ho provato anche i contrasti di Helmert, ma i mezzi non corrispondono ancora.

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))

Qual è il modo corretto per farlo?


Sembra un contrasto di Helmert (c è il primo livello, quindi b, quindi a).
Michael M,

Ho provato anche Helmert, ma i numeri non sono i mezzi che sto cercando. Ho modificato la domanda per includere i contrasti di Helmert, grazie.
M4RT1NK4,

Risposte:


13

Per i seguenti passaggi, abbiamo bisogno del frame di dati nel formato lungo. Il frame di dati datcontiene la variabile dipendente result, i categorica predittive cond(livelli: a, be c), e il fattore casuale s.

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

Di seguito, illustrerò due approcci per creare una matrice di contrasto corrispondente alle condizioni che si desidera confrontare:

  1. un'-B+c2
  2. B-c

Contrasti personalizzati

La matrice matcorrisponde alle differenze di livello.

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

Per creare la matrice di contrasto effettiva, calcoliamo l'inverso generalizzato con ginv(da 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

Questa matrice di contrasto cMatpuò essere utilizzata in 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

Come puoi vedere, le stime a effetto fisso corrispondono alle differenze sopra specificate. Inoltre, l'intercettazione rappresenta la media complessiva.

Contrasto di Helmert con contr.helmert

È inoltre possibile utilizzare la contr.helmertfunzione integrata per creare la matrice di contrasto.

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

Tuttavia, l'ordine non corrisponde a quello specificato nella domanda. Quindi, dobbiamo invertire l'ordine di colonne e righe. La prima colonna corrisponde a bvs. ae la seconda corrisponde a cvs. la media di be a.

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

Confronta la matrice di contrasto cHelmert2con cMat. Noterai che le colonne sono versioni ridimensionate dell'altra matrice.

Il risultato di 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


Grazie mille! Giusto per essere sicuro di capirlo adesso - se volessi confrontare il primo livello con il resto dei livelli in una variabile a 4 livelli, matsarebbe c(1, -1/3, -1/3, -1/3)? Quindi ho sempre impostato i numeri come sarebbero nella formula (a + (b + c + d) / 3) e quindi ginvli ridimensiono in modo appropriato in modo che i coefficienti riflettano direttamente la differenza. E quando hai cambiato l'ordine nell'esempio di Helmert, quello era solo per abbinare la domanda? Altrimenti, i risultati dovrebbero essere gli stessi, indipendentemente dall'ordine dei contrasti, giusto?
M4RT1NK4,

@ M4RT1NK4 La tua formula e il contrasto corrispondente sono corretti. L'ordine delle colonne è stato appena modificato per corrispondere all'ordine delle colonne nella domanda. L'ordine delle righe, tuttavia, è importante, poiché il primo livello è il livello di riferimento. Nel tuo esempio, il livello di riferimento è il terzo livello.
Sven Hohenstein,

@SvenHohenstein Avevo una domanda correlata basata su questa risposta, ti dispiace dare un'occhiata? stats.stackexchange.com/questions/357781/…
mat
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.