I have a mer object that has fixed and random effects. How do I extract the variance estimates for the random effects? Here is a simplified version of my question.
study <- lmer(Reaction ~ Days + (1|Subject), data = sleepstudy)
study
This gives a long output - not too long in this case. Anyway, how do I explicitly select the
Random effects:
Groups Name Variance Std.Dev.
Subject (Intercept) 1378.18 37.124
Residual 960.46 30.991
part of the output? I want the values themselves.
I have taken long looks at
str(study)
and there's nothing there! Also checked any extractor functions in the lme4 package to no avail. Please help!
lmer
returns an S4 object, so this should work:
remat <- summary(study)@REmat
print(remat, quote=FALSE)
Which prints:
Groups Name Variance Std.Dev.
Subject (Intercept) 1378.18 37.124
Residual 960.46 30.991
...In general, you can look at the source of the print
and summary
methods for "mer" objects:
class(study) # mer
selectMethod("print", "mer")
selectMethod("summary", "mer")
Some of the other answers are workable, but I claim that the best answer is to use the accessor method that is designed for this -- VarCorr
(this is the same as in lme4
's predecessor, the nlme
package).
UPDATE in recent versions of lme4
(version 1.1-7, but everything below is probably applicable to versions >= 1.0), VarCorr
is more flexible than before, and should do everything you want without ever resorting to fishing around inside the fitted model object.
library(lme4)
study <- lmer(Reaction ~ Days + (1|Subject), data = sleepstudy)
VarCorr(study)
## Groups Name Std.Dev.
## Subject (Intercept) 37.124
## Residual 30.991
By default VarCorr()
prints standard deviations, but you can get variances instead if you prefer:
print(VarCorr(study),comp="Variance")
## Groups Name Variance
## Subject (Intercept) 1378.18
## Residual 960.46
(comp=c("Variance","Std.Dev.")
will print both).
For more flexibility, you can use the as.data.frame
method to convert the VarCorr
object, which gives the grouping variable, effect variable(s), and the variance/covariance or standard deviation/correlations:
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
Finally, the raw form of the VarCorr
object (which you probably shouldn't mess with you if you don't have to) is a list of variance-covariance matrices with additional (redundant) information encoding the standard deviations and correlations, as well as attributes ("sc"
) giving the residual standard deviation and specifying whether the model has an estimated scale parameter ("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
##
> attributes(summary(study))$REmat
Groups Name Variance Std.Dev.
"Subject" "(Intercept)" "1378.18" "37.124"
"Residual" "" " 960.46" "30.991"
Try
attributes(study)
As an example:
> 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
The end.