web-dev-qa-db-fra.com

Extraire les variances à effet aléatoire de l'objet de modèle lme4 mer

J'ai un objet mer qui a des effets fixes et aléatoires. Comment extraire les estimations de variance pour les effets aléatoires? Voici une version simplifiée de ma question.

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

Cela donne une sortie longue - pas trop longue dans ce cas. Quoi qu'il en soit, comment sélectionner explicitement le

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

une partie de la sortie? Je veux les valeurs elles-mêmes.

J'ai longuement regardé

str(study)

et il n'y a rien là-bas! Également vérifié en vain toutes les fonctions d'extraction dans le package lme4. Aidez-moi!

40
dynamo

lmer renvoie un objet S4, donc cela devrait fonctionner:

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

Qui imprime:

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

... En général, vous pouvez regarder la source des méthodes print et summary pour les objets "mer":

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

Certaines des autres réponses sont réalisables, mais je prétends que la meilleure réponse est d'utiliser la méthode d'accesseur conçue pour cela - VarCorr (c'est la même chose que dans le prédécesseur de lme4 , le package nlme).

MISE À JOUR dans les versions récentes de lme4 (version 1.1-7, mais tout ce qui suit s'applique probablement aux versions> = 1.0), VarCorr est plus flexible qu'auparavant et devrait faire tout ce que vous voulez sans jamais avoir à pêcher à l'intérieur de l'objet modèle ajusté.

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

Par défaut, VarCorr() affiche les écarts-types, mais vous pouvez obtenir des écarts à la place si vous préférez:

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

(comp=c("Variance","Std.Dev.") imprimera les deux).

Pour plus de flexibilité, vous pouvez utiliser la méthode as.data.frame Pour convertir l'objet VarCorr, qui donne la variable de regroupement, les variables d'effet et la variance/covariance ou l'écart-type/corrélations:

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

Enfin, la forme brute de l'objet VarCorr (que vous ne devriez probablement pas jouer avec vous si vous n'y êtes pas obligé) est une liste de matrices de variance-covariance avec des informations supplémentaires (redondantes) codant les écarts-types et les corrélations, ainsi que les attributs ("sc") donnant l'écart type résiduel et spécifiant si le modèle a un paramètre d'échelle estimé ("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

Cette réponse est fortement basée sur celle de @Ben Bolker, mais si les gens sont nouveaux dans ce domaine et veulent les valeurs elles-mêmes, au lieu d'une simple impression des valeurs (comme OP semble l'avoir voulu), alors vous pouvez extraire les valeurs comme suit :

Convertissez l'objet VarCorr en un bloc de données.

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

Accédez ensuite à chaque valeur individuelle:

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

Avec cette méthode (en spécifiant des lignes et des colonnes dans le cadre de date que vous avez créé), vous pouvez accéder aux valeurs que vous souhaitez.

0
arranjdavis