Многократные сравнения на модели смешанных эффектов

31

Я пытаюсь проанализировать некоторые данные, используя модель смешанного эффекта. Собранные мной данные показывают вес некоторых молодых животных с различным генотипом с течением времени.

Я использую предлагаемый здесь подход: https://gribblelab.wordpress.com/2009/03/09/repeated-measures-anova-using-r/

В частности я использую решение № 2

Так у меня что то типа

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

Теперь я хотел бы провести несколько сравнений. Используя multcompя могу сделать:

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

И, конечно, я мог сделать то же самое со временем.

У меня есть два вопроса:

  1. Как мне использовать, mcpчтобы увидеть взаимодействие между временем и генотипом?
  2. Когда я бегу, glhtя получаю это предупреждение:

    covariate interactions found -- default contrast might be inappropriate

    Что это означает? Могу ли я безопасно проигнорировать это? Или что я должен сделать, чтобы избежать этого?

РЕДАКТИРОВАТЬ: я нашел этот PDF, который говорит:

Поскольку в этом случае невозможно автоматически определить интересующие параметры, mcp () в multcomp по умолчанию будет генерировать сравнения только для основных эффектов, игнорируя ковариаты и взаимодействия . Начиная с версии 1.1-2, можно указать усреднение по терминам взаимодействия и ковариатам с использованием аргументов взаимодействия_верация = ИСТИНА и covariate_average = ИСТИНА соответственно, тогда как версии старше 1.0-0 автоматически усредняются по условиям взаимодействия. Тем не менее, мы предлагаем пользователям вручную написать набор желаемых контрастов.Это следует делать всякий раз, когда возникает сомнение в том, что измеряют контрасты по умолчанию, что обычно происходит в моделях с терминами взаимодействия более высокого порядка. Мы обращаемся к Hsu (1996), глава ~ 7, и Searle (1971), глава ~ 7.3, для дальнейшего обсуждения и примеров по этому вопросу.

У меня нет доступа к этим книгам, но, может быть, кто-то здесь есть?

Nico
источник
Взгляните на InvivoStat ( invivostat.co.uk ), он должен выполнить тот тип анализа, который вы ищете

Ответы:

29

Если timeи Genotypeоба являются категориальными предикторами, какими они кажутся, и вы заинтересованы в сравнении всех пар время / генотип друг с другом, то вы можете просто создать одну переменную взаимодействия и использовать на ней контрасты Тьюки:

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

Если вас интересуют другие контрасты, то вы можете использовать тот факт, что linfctаргумент может принимать матрицу коэффициентов для контрастов - таким образом, вы можете установить именно те сравнения, которые вы хотите.

РЕДАКТИРОВАТЬ

В комментариях появляется некоторая обеспокоенность тем, что модель, снабженная TimeGenoпредиктором, отличается от исходной модели, снабженной Time * Genotypeпредиктором. Это не так , модели эквивалентны. Единственная разница заключается в параметризации фиксированных эффектов, которая настраивается для облегчения использования glhtфункции.

Я использовал один из встроенных наборов данных (в нем есть Diet вместо Genotype), чтобы продемонстрировать, что два подхода имеют одинаковую вероятность, прогнозируемые значения и т. Д .:

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

Разница лишь в том, что какие гипотезы легко проверить. Например, в первой модели легко проверить, взаимодействуют ли два предиктора, во второй модели нет явного теста для этого. С другой стороны, совместный эффект двух предикторов легко проверить во второй модели, но не в первой. Другие гипотезы проверяемы, это просто больше работы, чтобы установить их.

Анико
источник
3
glhtиспользует степени свободы, указанные в модели lme. Я не уверен, что эти степени свободы являются подходящими ...?
Стефан Лоран
2
Мне также любопытно, как это лучше всего сделать. Этот подход, однако, дает эффекты от другой модели - той, которая по существу только проверяет взаимодействие. Вторая модель вообще не включает в себя два потенциальных основных эффекта. Это не кажется подходящим методом для проверки эффектов в первой модели.
Маркус Морриси
@Aniko, я думал о том, чтобы объединить 2 категориальные переменные в одну, как вы только что сделали, но я колебался, потому что только одна из переменных находится в пределах субъекта, а другая - между ними. Можете ли вы подтвердить, что это не важно? Я заметил, что в приведенном вами примере, Animal/timeкоторый сейчас не является одним из факторов. Это правда understand?
toto_tico
@toto_tico, я отредактировал ответ, чтобы показать, что вторая модель эквивалентна первой.
Анико
3
@toto_tico, я дал вам воспроизводимый пример. Почему бы вам не попытаться all.equal(resid(model1), resid(model2))увидеть, что они одинаковы, прежде чем угадать иначе? Только фиксированная параметризация эффектов отличается. TimeDietэто не просто термин взаимодействия, и он не эквивалентен Time:Diet, а скорее Time + Diet + Time:Diet.
Анико