modelos - Extrae variaciones de efectos aleatorios del objeto modelo lme4 mer
efecto anidado (4)
Algunas de las otras respuestas son viables, pero afirmo que la mejor respuesta es usar el método de acceso diseñado para esto: VarCorr
(este es el mismo que en el predecesor de nlme
, el paquete nlme
).
ACTUALIZACIÓN en versiones recientes de lme4
(versión 1.1-7, pero todo lo que sigue puede aplicarse a las versiones> = 1.0), VarCorr
es más flexible que antes y debe hacer todo lo que quiera sin recurrir a la pesca dentro del objeto 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
De forma predeterminada, VarCorr()
imprime las desviaciones estándar, pero puede obtener varianzas en su lugar si lo prefiere:
print(VarCorr(study),comp="Variance")
## Groups Name Variance
## Subject (Intercept) 1378.18
## Residual 960.46
( comp=c("Variance","Std.Dev.")
imprimirá ambos).
Para mayor flexibilidad, puede usar el método as.data.frame
para convertir el objeto VarCorr
, que proporciona la variable de agrupación, las variables de efecto, y la varianza / covarianza o desviación estándar / correlaciones:
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, la forma cruda del objeto VarCorr
(que probablemente no debería meterse con usted si no es necesario) es una lista de matrices de varianza-covarianza con información adicional (redundante) que codifica las desviaciones y correlaciones estándar, así como también como atributos ( "sc"
) dando la desviación estándar residual y especificando si el modelo tiene un 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
##
Tengo un objeto mer que tiene efectos fijos y aleatorios. ¿Cómo extraigo las estimaciones de varianza para los efectos aleatorios? Aquí hay una versión simplificada de mi pregunta.
study <- lmer(Reaction ~ Days + (1|Subject), data = sleepstudy)
study
Esto proporciona una salida larga, no demasiado larga en este caso. De todos modos, ¿cómo selecciono explícitamente el
Random effects:
Groups Name Variance Std.Dev.
Subject (Intercept) 1378.18 37.124
Residual 960.46 30.991
parte de la salida? Quiero los valores en sí mismos.
He echado un largo vistazo a
str(study)
¡y no hay nada allí! También verifiqué todas las funciones de extractor en el paquete lme4 en vano. ¡Por favor ayuda!
Tratar
attributes(study)
Como ejemplo:
> 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
El fin.
lmer
devuelve un objeto S4, por lo que debería funcionar:
remat <- summary(study)@REmat
print(remat, quote=FALSE)
Que impresiones:
Groups Name Variance Std.Dev.
Subject (Intercept) 1378.18 37.124
Residual 960.46 30.991
... En general, puede ver la fuente de los métodos de print
y summary
para los objetos "mer":
class(study) # mer
selectMethod("print", "mer")
selectMethod("summary", "mer")
> attributes(summary(study))$REmat
Groups Name Variance Std.Dev.
"Subject" "(Intercept)" "1378.18" "37.124"
"Residual" "" " 960.46" "30.991"