Некоторые другие ответы работоспособны, но я утверждаю, что лучший ответ - использовать метод доступа, разработанный для этого - VarCorr
(это то же самое, что и в предшественнике lme4
, nlme
пакет).
ОБНОВЛЕНИЕ в последних версиях lme4
(версия 1.1-7, но все, что ниже, вероятно, применимо к версиям> = 1.0), VarCorr
более гибкочем раньше, и должен делать все, что вы хотите, не прибегая к рыбалке внутри приспособленного модельного объекта.
library(lme4)
study <- lmer(Reaction ~ Days + (1|Subject), data = sleepstudy)
VarCorr(study)
## Groups Name Std.Dev.
## Subject (Intercept) 37.124
## Residual 30.991
По умолчанию VarCorr()
печатает стандартные отклонения, но вместо этого можно получить отклонения, если вы предпочитаете:
print(VarCorr(study),comp="Variance")
## Groups Name Variance
## Subject (Intercept) 1378.18
## Residual 960.46
(comp=c("Variance","Std.Dev.")
напечатает оба).
Для большей гибкости вы можете использовать метод as.data.frame
для преобразования объекта VarCorr
, который дает группирующую переменную, переменную (и) эффекта и дисперсию / ковариацию или стандартное отклонение / корреляции:
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
Наконец, необработанная форма объекта VarCorr
(с которым вам, вероятно, не стоит связываться, если вам не нужно), представляет собой список матриц дисперсии-ковариации с дополнительной (избыточной) информацией, кодирующей стандарт.отклонения и корреляции, а также атрибуты ("sc"
), дающие остаточное стандартное отклонение и указывающие, имеет ли модель оценочный масштабный параметр ("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
##