it-swarm-pt.tech

Extrair variações de efeito aleatório do objeto de modelo lme4 mer

Eu tenho um objeto mer que tem efeitos fixos e aleatórios. Como extraio as estimativas de variação para os efeitos aleatórios? Aqui está uma versão simplificada da minha pergunta.

study <- lmer(Reaction ~ Days + (1|Subject), data = sleepstudy)
study

Isso produz uma saída longa - não muito longa neste caso. De qualquer forma, como faço para selecionar explicitamente o

Random effects:
Groups   Name        Variance Std.Dev.
Subject  (Intercept) 1378.18  37.124  
Residual              960.46  30.991  

parte da saída? Eu quero os próprios valores.

Dei uma longa olhada em

str(study)

e não há nada lá! Também verifiquei todas as funções do extrator no pacote lme4 sem sucesso. Por favor ajude!

40
dynamo

lmer retorna um objeto S4, portanto, isso deve funcionar:

remat <- summary(study)@REmat
print(remat, quote=FALSE)

Que imprime:

 Groups   Name        Variance Std.Dev.
 Subject  (Intercept) 1378.18  37.124  
 Residual              960.46  30.991  

... Em geral, você pode procurar a fonte dos métodos print e summary para objetos "mer":

class(study) # mer
selectMethod("print", "mer")
selectMethod("summary", "mer")
14
Tommy

Algumas das outras respostas são viáveis, mas eu afirmo que a melhor resposta é usar o método acessador projetado para isso - VarCorr (é o mesmo que no antecessor de lme4 , o pacote nlme).

UPDATE nas versões recentes de lme4 (versão 1.1-7, mas tudo abaixo é provavelmente aplicável às versões> = 1.0), VarCorr é mais flexível do que antes e deve fazer tudo o que você deseja, sem nunca recorrer a pescar dentro do objeto de modelo ajustado.

library(lme4)
study <- lmer(Reaction ~ Days + (1|Subject), data = sleepstudy)
VarCorr(study)
##  Groups   Name        Std.Dev.
##  Subject  (Intercept) 37.124  
##  Residual             30.991

Por padrão VarCorr() imprime desvios padrão, mas você pode obter variações se preferir:

print(VarCorr(study),comp="Variance")
##  Groups   Name        Variance
##  Subject  (Intercept) 1378.18 
##  Residual              960.46 

(comp=c("Variance","Std.Dev.") imprimirá ambos).

Para obter mais flexibilidade, você pode usar o método as.data.frame Para converter o objeto VarCorr, que fornece a variável de agrupamento, a (s) variável (s) de efeito e a variação/covariância ou desvio/correlação padrão:

as.data.frame(VarCorr(study))
##        grp        var1 var2      vcov    sdcor
## 1  Subject (Intercept) <NA> 1378.1785 37.12383
## 2 Residual        <NA> <NA>  960.4566 30.99123

Finalmente, a forma bruta do objeto VarCorr (que você provavelmente não deve mexer com você, se não precisar) é uma lista de matrizes de variância-covariância com informações adicionais (redundantes) que codificam os desvios padrão e correlações, bem como atributos ("sc"), fornecendo o desvio padrão residual e especificando se o modelo possui um parâmetro de escala estimado ("useSc").

unclass(VarCorr(fm1))
## $Subject
##             (Intercept)      Days
## (Intercept)  612.089748  9.604335
## Days           9.604335 35.071662
## attr(,"stddev")
## (Intercept)        Days 
##   24.740448    5.922133 
## attr(,"correlation")
##             (Intercept)       Days
## (Intercept)  1.00000000 0.06555134
## Days         0.06555134 1.00000000
## 
## attr(,"sc")
## [1] 25.59182
## attr(,"useSc")
## [1] TRUE
## 
72
Ben Bolker
> attributes(summary(study))$REmat
 Groups     Name          Variance  Std.Dev.
 "Subject"  "(Intercept)" "1378.18" "37.124"
 "Residual" ""            " 960.46" "30.991"
5
John Colby

Essa resposta baseia-se fortemente na do @Ben Bolker, mas se as pessoas forem novas e quiserem os próprios valores, em vez de apenas uma impressão dos valores (como o OP parece ter desejado), você poderá extrair os valores da seguinte maneira :

Converta o objeto VarCorr em um quadro de dados.

re_dat = as.data.frame(VarCorr(study))

Em seguida, acesse cada valor individual:

int_vcov = re_dat[1,'vcov']
resid_vcov = re_dat[2,'vcov']

Com esse método (especificando linhas e colunas no período que você criou), você pode acessar os valores desejados.

0
arranjdavis