Diferenças entre PROC Mixed e lme / lmer em R - graus de liberdade

12

Nota: esta pergunta é um repost, pois minha pergunta anterior teve que ser excluída por razões legais.


Ao comparar o PROC MIXED do SAS com a função lmedo nlmepacote no R, deparei-me com algumas diferenças bastante confusas. Mais especificamente, os graus de liberdade nos diferentes testes diferem entre PROC MIXEDe lme, e eu me perguntava o porquê.

Comece pelo seguinte conjunto de dados (código R fornecido abaixo):

  • ind: fator que indica o indivíduo onde a medição é realizada
  • fac: órgão onde a medição é feita
  • trt: fator que indica o tratamento
  • y: alguma variável de resposta contínua

A ideia é criar os seguintes modelos simples:

y ~ trt + (ind): indcomo um fator aleatório y ~ trt + (fac(ind)): facaninhado indcomo um fator aleatório

Observe que o último modelo deve causar singularidades, pois há apenas 1 valor de ypara cada combinação de inde fac.

Primeiro modelo

No SAS, construo o seguinte modelo:

PROC MIXED data=Data;
    CLASS ind fac trt;
    MODEL y = trt /s;
    RANDOM ind /s;
run;

De acordo com os tutoriais, o mesmo modelo em R usando nlmedeve ser:

> require(nlme)
> options(contrasts=c(factor="contr.SAS",ordered="contr.poly"))
> m2<-lme(y~trt,random=~1|ind,data=Data)

Ambos os modelos fornecem as mesmas estimativas para os coeficientes e seus SE, mas ao realizar um teste F para o efeito de trt, eles usam uma quantidade diferente de graus de liberdade:

SAS : 
Type 3 Tests of Fixed Effects 
Effect Num DF Den DF     F  Value Pr > F 
trt         1      8  0.89        0.3724 

R : 
> anova(m2)
            numDF denDF  F-value p-value
(Intercept)     1     8 70.96836  <.0001
trt             1     6  0.89272  0.3812

Question1: Qual é a diferença entre os dois testes? Ambos são ajustados usando REML e usam os mesmos contrastes.

NOTA: Tentei valores diferentes para a opção DDFM = (incluindo BETWITHIN, que teoricamente deve fornecer os mesmos resultados que o lme)

Segundo modelo

No SAS:

PROC MIXED data=Data;
    CLASS ind fac trt;
    MODEL y = trt /s;
    RANDOM fac(ind) /s;
run;

O modelo equivalente em R deve ser:

> m4<-lme(y~trt,random=~1|ind/fac,data=Data)

Nesse caso, existem algumas diferenças muito estranhas:

  • R se encaixa sem reclamar, enquanto o SAS observa que o hessian final não é definitivo (o que não me surpreende nem um pouco, veja acima)
  • O SE nos coeficientes difere (é menor no SAS)
  • Novamente, o teste F usou uma quantidade diferente de DF (de fato, no SAS, essa quantidade = 0)

Saída SAS:

Effect     trt Estimate Std Error  DF t Value Pr > |t| 
Intercept        0.8863    0.1192  14    7.43 <.0001 
trt       Cont  -0.1788    0.1686   0   -1.06 . 

Saída R:

> summary(m4)
...
Fixed effects: y ~ trt 
               Value Std.Error DF   t-value p-value
(Intercept)  0.88625 0.1337743  8  6.624963  0.0002
trtCont     -0.17875 0.1891855  6 -0.944840  0.3812
...

(Observe que, nesse caso, os testes F e T são equivalentes e usam o mesmo DF.)

Curiosamente, ao usar lme4em R, o modelo nem se encaixa:

> require(lme4)
> m4r <- lmer(y~trt+(1|ind/fac),data=Data)
Error in function (fr, FL, start, REML, verbose)  : 
  Number of levels of a grouping factor for the random effects
must be less than the number of observations

Pergunta 2 : Qual é a diferença entre esses modelos com fatores aninhados? Eles foram especificados corretamente e, em caso afirmativo, como é que os resultados são tão diferentes?


Dados simulados em R:

Data <- structure(list(y = c(1.05, 0.86, 1.02, 1.14, 0.68, 1.05, 0.22, 
1.07, 0.46, 0.65, 0.41, 0.82, 0.6, 0.49, 0.68, 1.55), ind = structure(c(1L, 
2L, 3L, 1L, 3L, 4L, 4L, 2L, 5L, 6L, 7L, 8L, 6L, 5L, 7L, 8L), .Label = c("1", 
"2", "3", "4", "5", "6", "7", "8"), class = "factor"), fac = structure(c(1L, 
1L, 1L, 2L, 2L, 1L, 2L, 2L, 2L, 1L, 1L, 1L, 2L, 1L, 2L, 2L), .Label = c("l", 
"r"), class = "factor"), trt = structure(c(2L, 2L, 2L, 2L, 2L, 
2L, 2L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L), .Label = c("Cont", 
"Treat"), class = "factor")), .Names = c("y", "ind", "fac", "trt"
), row.names = c(NA, -16L), class = "data.frame")

Dados simulados:

   y ind fac   trt
1.05   1   l Treat
0.86   2   l Treat
1.02   3   l Treat
1.14   1   r Treat
0.68   3   r Treat
1.05   4   l Treat
0.22   4   r Treat
1.07   2   r Treat
0.46   5   r  Cont
0.65   6   l  Cont
0.41   7   l  Cont
0.82   8   l  Cont
0.60   6   r  Cont
0.49   5   l  Cont
0.68   7   r  Cont
1.55   8   r  Cont
Joris Meys
fonte
@ Aaron: Por favor, encontre sua resposta incluída neste post. Se você pode copiar e colar isso como resposta, eu lhe dou o representante. Tem sido muito útil, então eu realmente quero mantê-lo aqui com validação cruzada. Depois de fazer isso, excluo sua resposta da pergunta.
Joris Meys
Estou tentando fazer com que a equipe reviva seu Q original com essa revisão infeliz eliminada para sempre - portanto, há uma grande chance de restaurar respostas originais e mesclá-las aqui.
@mbq: Seria bom, embora simulei alguns dados (que uso aqui) e editei a resposta de Aaron de acordo. Para a outra resposta, isso será um pouco mais complicado, mas também posso tentar.
Joris Meys
A resposta de Aaron é incrivelmente boa. Espero que eles vejam. Infelizmente, seu @Aaron não entrará em contato com ele, a menos que ele tenha participado deste tópico.
Wayne
1
Sim, essa foi uma boa resposta. Aqui, dei um link para a postagem excluída: stats.stackexchange.com/questions/26556/… Vou adicionar o link à postagem atual.
Stéphane Laurent

Respostas:

11

Para a primeira pergunta, o método padrão no SAS para encontrar o df não é muito inteligente; ele procura termos no efeito aleatório que incluem sintaticamente o efeito fixo e o usa. Nesse caso, como trtnão é encontrado em ind, não está fazendo a coisa certa. Eu nunca tentei BETWITHINe não conheço os detalhes, mas a opção Satterthwaite ( satterth) ou o uso ind*trtcomo efeito aleatório fornecem resultados corretos.

PROC MIXED data=Data;
    CLASS ind fac trt;
    MODEL y = trt /s ddfm=satterth;
    RANDOM ind /s;
run;

PROC MIXED data=Data;
    CLASS ind fac trt;
    MODEL y = trt /s;
    RANDOM ind*trt /s;
run;

Quanto à segunda pergunta, seu código SAS não corresponde exatamente ao seu código R; ele tem apenas um termo para fac*ind, enquanto o código R tem um termo para ambos inde fac*ind. (Veja a saída dos componentes de variação para ver isso.) A adição disso fornece o mesmo SE para trttodos os modelos em Q1 e Q2 (0,1892).

Como você observa, este é um modelo ímpar para se ajustar, pois o fac*indtermo possui uma observação para cada nível; portanto, é equivalente ao termo do erro. Isso se reflete na saída do SAS, onde o fac*indtermo tem variação zero. É também o que a mensagem de erro do lme4 está lhe dizendo; o motivo do erro é que você provavelmente especificou algo errado, incluindo o termo do erro no modelo de duas maneiras diferentes. Curiosamente, há uma pequena diferença no modelo nlme; de alguma forma, é encontrar um termo de variação para o fac*indtermo, além do termo de erro, mas você notará que a soma dessas duas variações é igual ao termo de erro do SAS e do nlme sem o fac*indtermo. No entanto, o SE para trtpermanece o mesmo (0,1892) que trtestá aninhado emind, para que esses termos de menor variação não o afetem.

Finalmente, uma observação geral sobre os graus de liberdade nesses modelos: Eles são calculados após o ajuste do modelo e, portanto, as diferenças nos graus de liberdade entre diferentes programas ou opções de um programa não significam necessariamente que o modelo está sendo ajustado de maneira diferente. Para isso, é preciso examinar as estimativas dos parâmetros, parâmetros de efeito fixo e parâmetros de covariância.

Além disso, o uso das aproximações t e F com um determinado número de graus de liberdade é bastante controverso. Não só existem várias maneiras de aproximar o DF, como alguns acreditam que a prática de fazê-lo não é uma boa ideia. Algumas palavras de conselho:

  1. Se tudo estiver equilibrado, compare os resultados com o método tradicional dos mínimos quadrados, como eles devem concordar. Se estiver próximo do equilíbrio, calcule-os você mesmo (assumindo o equilíbrio) para garantir que os que você está usando estejam no estádio certo.

  2. Se você tem um tamanho de amostra grande, os graus de liberdade não importam muito, pois as distribuições se aproximam do normal e do qui-quadrado.

  3. Confira os métodos de inércia de Doug Bates. Seu método mais antigo é baseado na simulação do MCMC; seu método mais recente baseia-se na criação de perfil da probabilidade.

Aaron deixou Stack Overflow
fonte
Na verdade, é uma boa resposta, embora eu ache que o perfil da probabilidade resolva uma pergunta diferente (ICs apropriados nos parâmetros de variação onde o perfil não é quadrático) do que fazer a simulação do MCMC (que lida com a correção de tamanho finito e a não quadraticidade). Acho bootMer (de bootstrap paramétrico) está mais perto do equivalente para mcmcsamp que CONFINT (perfil (...)) ...
Ben Bolker
@BenBolker: Claro que sim. Doug Bates deu uma palestra aqui no mês passado e ele falou sobre suas idéias sobre o perfil da probabilidade. É tudo o que sei até agora.
Aaron saiu de Stack Overflow