Confronti multipli su un modello di effetti misti


31

Sto cercando di analizzare alcuni dati usando un modello a effetti misti. I dati che ho raccolto rappresentano il peso di alcuni giovani animali di diverso genotipo nel tempo.

Sto usando l'approccio proposto qui: https://gribblelab.wordpress.com/2009/03/09/repeated-measures-anova-using-r/

In particolare sto usando la soluzione n. 2

Quindi ho qualcosa del genere

require(nlme)
model <- lme(weight ~ time * Genotype, random = ~1|Animal/time, 
         data=weights)    
av <- anova(model)

Ora, vorrei avere alcuni confronti multipli. Usando multcompposso fare:

require(multcomp)
comp.geno <- glht(model, linfct=mcp(Genotype="Tukey"))
print(summary(comp.geno))

E, naturalmente, potrei fare lo stesso con il tempo.

Ho due domande:

  1. Come posso usare mcpper vedere l'interazione tra Tempo e Genotipo?
  2. Quando corro glhtricevo questo avviso:

    covariate interactions found -- default contrast might be inappropriate

    Cosa significa? Posso tranquillamente ignorarlo? O cosa devo fare per evitarlo?

EDIT: ho trovato questo PDF che dice:

Poiché in questo caso è impossibile determinare automaticamente i parametri di interesse, mcp () in multcomp genererà per impostazione predefinita confronti solo per gli effetti principali, ignorando le covariate e le interazioni . Dalla versione 1.1-2, è possibile specificare la media dei termini di interazione e delle covariate usando gli argomentiaction_average = TRUE e covariate_average = TRUE rispettivamente, mentre le versioni precedenti alla 1.0-0 calcolano automaticamente la media dei termini di interazione. Suggeriamo agli utenti, tuttavia, di scrivere manualmente l'insieme di contrasti che desiderano.Si dovrebbe fare questo ogni volta che vi è il dubbio su ciò che misura i contrasti predefiniti, che in genere accade nei modelli con termini di interazione di ordine superiore. Ci riferiamo a Hsu (1996), Capitolo ~ 7, e Searle (1971), Capitolo ~ 7.3, per ulteriori discussioni ed esempi su questo argomento.

Non ho accesso a quei libri, ma forse qualcuno qui ha?


Dai un'occhiata a InvivoStat ( invivostat.co.uk ), dovrebbe fare il tipo di analisi che stai cercando

Risposte:


29

Se timee Genotypesono entrambi predittori categorici come sembrano, e sei interessato a confrontare tutte le coppie tempo / genotipo tra loro, puoi semplicemente creare una variabile di interazione e utilizzare i contrasti di Tukey su di essa:

weights$TimeGeno <- interaction(weigths$Time, weights$Geno)
model <- lme(weight ~ TimeGeno, random = ~1|Animal/time, data=weights) 
comp.timegeno <- glht(model, linfct=mcp(TimeGeno="Tukey")) 

Se sei interessato ad altri contrasti, puoi usare il fatto che l' linfctargomento può assumere una matrice di coefficienti per i contrasti - in questo modo puoi impostare esattamente i confronti che desideri.

MODIFICARE

Vi è una certa preoccupazione nei commenti secondo cui il modello dotato del TimeGenopredittore è diverso dal modello originale dotato del Time * Genotypepredittore. Questo non è il caso , i modelli sono equivalenti. L'unica differenza è nella parametrizzazione degli effetti fissi, che è impostata per rendere più semplice l'uso della glhtfunzione.

Ho usato uno dei set di dati integrati (ha Diet anziché Genotype) per dimostrare che i due approcci hanno la stessa probabilità, i valori previsti, ecc.

> # extract a subset of a built-in dataset for the example
> data(BodyWeight)
> ex <- as.data.frame(subset(BodyWeight, Time %in% c(1, 22, 44)))
> ex$Time <- factor(ex$Time)
> 
> #create interaction variable
> ex$TimeDiet <- interaction(ex$Time, ex$Diet)
    > 
    > model1 <- lme(weight ~ Time * Diet, random = ~1|Rat/Time,  data=ex)    
    > model2 <- lme(weight ~ TimeDiet, random = ~1|Rat/Time, data=ex)    
    > 
    > # the degrees of freedom, AIC, BIC, log-likelihood are all the same 
    > anova(model1, model2)
           Model df      AIC      BIC    logLik
    model1     1 12 367.4266 387.3893 -171.7133
    model2     2 12 367.4266 387.3893 -171.7133
    Warning message:
    In anova.lme(model1, model2) :
      fitted objects with different fixed effects. REML comparisons are not meaningful.
    > 
    > # the second model collapses the main and interaction effects of the first model
    > anova(model1)
                numDF denDF   F-value p-value
    (Intercept)     1    26 1719.5059  <.0001
    Time            2    26   28.9986  <.0001
    Diet            2    13   85.3659  <.0001
    Time:Diet       4    26    1.7610  0.1671
    > anova(model2)
                numDF denDF   F-value p-value
    (Intercept)     1    24 1719.5059  <.0001
    TimeDiet        8    24   29.4716  <.0001
    > 
    > # they give the same predicted values
    > newdata <- expand.grid(Time=levels(ex$Time), Diet=levels(ex$Diet))
    > newdata$TimeDiet <- interaction(newdata$Time, newdata$Diet)
> newdata$pred1 <- predict(model1, newdata=newdata, level=0)
    > newdata$pred2 <- predict(model2, newdata=newdata, level=0)
> newdata
  Time Diet TimeDiet   pred1   pred2
1    1    1      1.1 250.625 250.625
2   22    1     22.1 261.875 261.875
3   44    1     44.1 267.250 267.250
4    1    2      1.2 453.750 453.750
5   22    2     22.2 475.000 475.000
6   44    2     44.2 488.750 488.750
7    1    3      1.3 508.750 508.750
8   22    3     22.3 518.250 518.250
9   44    3     44.3 530.000 530.000

L'unica differenza è che quali ipotesi sono facili da verificare. Ad esempio, nel primo modello è facile verificare se i due predittori interagiscono, nel secondo modello non esiste un test esplicito per questo. D'altra parte, l'effetto congiunto dei due predittori è facile da testare nel secondo modello, ma non nel primo. Le altre ipotesi sono verificabili, è solo più lavoro per impostarle.


3
glhtutilizza i gradi di libertà indicati nel modello lme. Non sono sicuro che questi gradi di libertà siano appropriati ...?
Stéphane Laurent,

2
Sono anche curioso di sapere come farlo nel modo migliore. Questo approccio, tuttavia, sta dando effetti da un modello diverso, che essenzialmente verifica solo un'interazione. Il secondo modello non include affatto i due potenziali effetti principali. Questo non sembra essere un metodo appropriato per controllare gli effetti nel primo modello.
Marcus Morrisey,

@Aniko, stavo pensando di combinare 2 variabili categoriali in una come hai appena fatto, ma ho esitato perché solo una delle variabili è all'interno del soggetto, l'altra è tra. Puoi confermare che questo non si riunisce? Ho notato che nell'esempio si mantiene Animal/timeche ora non è uno dei fattori. Davvero, understandquesto?
toto_tico,

@toto_tico, ho modificato la risposta per mostrare che il secondo modello è equivalente al primo.
Aniko,

3
@toto_tico, ti ho dato un esempio riproducibile. Perché non provi a all.equal(resid(model1), resid(model2))vedere che sono uguali prima di indovinare altrimenti? Solo la parametrizzazione degli effetti fissi è diversa. TimeDietnon è un termine di pura interazione e non equivale a Time:Diet, ma piuttosto a Time + Diet + Time:Diet.
Aniko,
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.