Várias comparações em um modelo de efeitos mistos

31

Estou tentando analisar alguns dados usando um modelo de efeito misto. Os dados que eu coletei representam o peso de alguns animais jovens de diferentes genótipos ao longo do tempo.

Estou usando a abordagem proposta aqui: https://gribblelab.wordpress.com/2009/03/09/repeated-measures-anova-using-r/

Em particular, estou usando a solução 2

Então eu tenho algo como

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

Agora, eu gostaria de fazer algumas comparações múltiplas. Usando multcompeu posso fazer:

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

E, é claro, eu poderia fazer o mesmo com o tempo.

Eu tenho duas perguntas:

  1. Como eu uso mcppara ver a interação entre Time e Genotype?
  2. Quando corro glht, recebo este aviso:

    covariate interactions found -- default contrast might be inappropriate

    O que isso significa? Posso ignorá-lo com segurança? Ou o que devo fazer para evitá-lo?

EDIT: Encontrei este PDF que diz:

Como é impossível determinar os parâmetros de interesse automaticamente nesse caso, mcp () no multcomp, por padrão, gera comparações apenas para os principais efeitos, ignorando covariáveis ​​e interações . Desde a versão 1.1-2, pode-se especificar a média dos termos de interação e covariáveis ​​usando os argumentos interação_average = TRUE e covariate_average = TRUE, respectivamente, enquanto as versões anteriores a 1.0-0 calculam a média automática dos termos de interação. Sugerimos aos usuários, no entanto, que escrevam, manualmente, o conjunto de contrastes que desejam.Deve-se fazer isso sempre que houver dúvida sobre o que os contrastes padrão medem, o que normalmente acontece em modelos com termos de interação de ordem superior. Nós nos referimos a Hsu (1996), capítulo ~ 7, e Searle (1971), capítulo ~ 7.3, para discussões e exemplos adicionais sobre esse assunto.

Eu não tenho acesso a esses livros, mas talvez alguém aqui tenha?

nico
fonte
Dê uma olhada no InvivoStat ( invivostat.co.uk ), ele deve fazer o tipo de análise que você está procurando

Respostas:

29

Se timee Genotypesão ambos preditores categóricos como parecem ser, e você está interessado em comparar todos os pares de tempo / genótipo entre si, basta criar uma variável de interação e usar os contrastes de Tukey:

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 você estiver interessado em outros contrastes, poderá usar o fato de que o linfctargumento pode ter uma matriz de coeficientes para os contrastes - dessa forma, você pode configurar exatamente as comparações que deseja.

EDITAR

Parece haver alguma preocupação nos comentários de que o modelo equipado com o TimeGenopreditor é diferente do modelo original equipado com o Time * Genotypepreditor. Não é esse o caso , os modelos são equivalentes. A única diferença está na parametrização dos efeitos fixos, configurada para facilitar o uso da glhtfunção.

Eu usei um dos conjuntos de dados internos (tem Diet em vez de Genotype) para demonstrar que as duas abordagens têm a mesma probabilidade, valores previstos, etc:

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

A única diferença é que quais hipóteses são fáceis de testar. Por exemplo, no primeiro modelo, é fácil testar se os dois preditores interagem; no segundo modelo, não há teste explícito para isso. Por outro lado, o efeito conjunto dos dois preditores é fácil de testar no segundo modelo, mas não no primeiro. As outras hipóteses são testáveis, é apenas mais trabalho para configurá-las.

Aniko
fonte
3
glhtusa os graus de liberdade dados no modelo lme. Não tenho certeza se esses graus de liberdade são adequados ...?
Stéphane Laurent
2
Também estou curioso para saber como isso é melhor feito. Essa abordagem, no entanto, está produzindo efeitos de um modelo diferente - que essencialmente apenas testa uma interação. O segundo modelo não inclui os dois principais efeitos potenciais. Este não parece ser um método apropriado para verificar os efeitos no primeiro modelo.
Marcus Morrisey
@ Aniko, eu estava pensando em combinar 2 variáveis ​​categóricas em uma como você acabou de fazer, mas hesitei porque apenas uma das variáveis ​​está dentro do assunto e a outra está entre elas. Você pode confirmar que isso não é importante? Percebi que no exemplo que você mantém, o Animal/timeque agora não é um dos fatores. Será que realmente understandisso?
Toto_tico 27/10/2015
@toto_tico, editei a resposta para mostrar que o segundo modelo é equivalente ao primeiro.
Aniko
3
@toto_tico, dei um exemplo reproduzível. Por que você não tenta all.equal(resid(model1), resid(model2))ver que eles são os mesmos antes de adivinhar o contrário? Somente a parametrização de efeitos fixos é diferente. TimeDietnão é um termo de interação puro e não é equivalente a Time:Diet, mas sim a Time + Diet + Time:Diet.
Aniko