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

j'ai un objet mer qui a des effets fixes et aléatoires. Comment puis-je extraire les estimations de la 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 puis-je 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 production? Je veux que les valeurs elles-mêmes.

j'ai pris de longues regarde

str(study)

et il n'y a rien! Également vérifié l' fonctions de l'extracteur dans le paquet lme4 en vain. S'il vous plaît aider!

37
demandé sur dynamo 2011-12-16 01:13:39

4 réponses

lmer retourne un objet S4, donc cela devrait fonctionner:

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

Qui affiche:

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

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

class(study) # mer
selectMethod("print", "mer")
selectMethod("summary", "mer")
14
répondu Tommy 2011-12-15 21:50:50

Certains des autres réponses sont réalisables, mais je prétends que la meilleure réponse est d'utiliser la méthode d'accesseur qui est conçu pour cela -- VarCorr (c'est le même que dans , le nlme paquet).

UPDATE dans les versions récentes de lme4 (version 1.1-7, mais tout ci-dessous est probablement applicable pour les versions >= 1.0), VarCorr est plus flexible qu'avant, et devrait faire tout ce que vous voulez sans jamais recourir à la pêche autour à l'intérieur le modèle ajusté objet.

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 déviations standard, mais vous pouvez obtenir des variances à 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.") imprimer).

Pour plus de flexibilité, vous pouvez utiliser le as.data.frame méthode pour convertir le VarCorr objet, qui donne la variable de regroupement, la ou 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 la VarCorr object (que vous ne devriez probablement pas vous embêter si vous n'en avez pas besoin) est une liste de matrices de variance-covariance avec des informations supplémentaires (redondantes) encodant les déviations et les corrélations standard, ainsi que des attributs ("sc") donnant l'écart-type résiduel et précisant 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
## 
69
répondu Ben Bolker 2014-08-29 17:24:37
> attributes(summary(study))$REmat
 Groups     Name          Variance  Std.Dev.
 "Subject"  "(Intercept)" "1378.18" "37.124"
 "Residual" ""            " 960.46" "30.991"
6
répondu John Colby 2011-12-15 21:41:38

attributes(study)

un exemple:

> women
   height weight
1      58    115
2      59    117
3      60    120
4      61    123
5      62    126
6      63    129
7      64    132
8      65    135
9      66    139
10     67    142
11     68    146
12     69    150
13     70    154
14     71    159
15     72    164

> lm1 <- lm(height ~ weight, data=women)
> attributes(lm1)
$names
 [1] "coefficients"  "residuals"     "effects"       "rank"         
 [5] "fitted.values" "assign"        "qr"            "df.residual"  
 [9] "xlevels"       "call"          "terms"         "model"        

$class
[1] "lm"

> lm1$coefficients
(Intercept)      weight 
 25.7234557   0.2872492 

> lm1$coefficients[[1]]

[1] 25.72346


> lm1$coefficients[[2]]

[1] 0.2872492

La fin.

-7
répondu abcde123483 2011-12-15 21:38:52