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 lme
do nlme
pacote no R, deparei-me com algumas diferenças bastante confusas. Mais especificamente, os graus de liberdade nos diferentes testes diferem entre PROC MIXED
e 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)
: ind
como um fator aleatório
y ~ trt + (fac(ind))
: fac
aninhado ind
como um fator aleatório
Observe que o último modelo deve causar singularidades, pois há apenas 1 valor de y
para cada combinação de ind
e 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 nlme
deve 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 lme4
em 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
fonte
Respostas:
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
trt
não é encontrado emind
, não está fazendo a coisa certa. Eu nunca tenteiBETWITHIN
e não conheço os detalhes, mas a opção Satterthwaite (satterth
) ou o usoind*trt
como efeito aleatório fornecem resultados corretos.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 ambosind
efac*ind
. (Veja a saída dos componentes de variação para ver isso.) A adição disso fornece o mesmo SE paratrt
todos os modelos em Q1 e Q2 (0,1892).Como você observa, este é um modelo ímpar para se ajustar, pois o
fac*ind
termo possui uma observação para cada nível; portanto, é equivalente ao termo do erro. Isso se reflete na saída do SAS, onde ofac*ind
termo 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 ofac*ind
termo, 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 ofac*ind
termo. No entanto, o SE paratrt
permanece o mesmo (0,1892) quetrt
está 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:
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.
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.
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.
fonte