R 从混合模型中获得随机效应矩阵

R 从混合模型中获得随机效应矩阵,r,regression,lme4,mixed-models,nlme,R,Regression,Lme4,Mixed Models,Nlme,在下面的代码中,我想知道如何从library(nlme)中的lme()对象中获得与out和Ts等效的代码 dat我强烈建议您阅读文档!lme4和nlme使用固有的不同方法来拟合混合模型——lme4使用基于较低Cholesky因子(θ)的惩罚最小二乘公式nlme4使用广义最小二乘公式,可以选择存储为Cholesky因子——但他们的文档提供了从内部表示中获得所需信息的信息。在那之后,由您来进行数学运算,以便在表示之间进行转换 如果您执行了?lme,则有一行 有关配合的部件,请参见LME对象 然后执行

在下面的代码中,我想知道如何从
library(nlme)
中的
lme()
对象中获得与
out
Ts
等效的代码


dat我强烈建议您阅读文档!lme4和nlme使用固有的不同方法来拟合混合模型——lme4使用基于较低Cholesky因子(θ)的惩罚最小二乘公式nlme4使用广义最小二乘公式,可以选择存储为Cholesky因子——但他们的文档提供了从内部表示中获得所需信息的信息。在那之后,由您来进行数学运算,以便在表示之间进行转换

如果您执行了
?lme
,则有一行

有关配合的部件,请参见
LME对象

然后执行
?lmobject
,您会发现两个有希望的条目:

apVar

方差-协方差系数的近似协方差矩阵。如果调用
lme
时使用的控制值中
apVar=FALSE
,则此组件为
NULL

modelStruct
从类
lmestuct
继承的对象,表示混合效果模型组件的列表,例如
struct
corStruct
varFunc
对象

实际上,我们不需要var-cov系数,而是随机效应矩阵。所以我们可以看看
重构
。这在nlme中比lme4灵活得多,但通常只是随机效应矩阵。要做任何与lme4类似的事情,您需要将它们转换为较低的Cholesky因子。下面是一个使用
睡眠研究
数据的示例:

> library("nlme")
> library("lme4")
> 
> data("sleepstudy")
> m_nlme <- lme(fixed=Reaction ~ 1 + Days,
+               random=~ 1 + Days | Subject,
+               data=sleepstudy,
+               method = "ML")
> m_lme4 <- lmer(Reaction ~ 1 + Days + (1 + Days|Subject),
+                data=sleepstudy,
+                REML=FALSE)
> 
> re_lme4 <- getME(m_lme4, "Tlist")$Subject
> print(re_lme4)
           [,1]      [,2]
[1,] 0.92919061 0.0000000
[2,] 0.01816575 0.2226432
> 
> re_nlme <- m_nlme$modelStruct$reStruct$Subject
> # entire covariance matrix
> print(re_nlme)
Positive definite matrix structure of class pdLogChol representing
            (Intercept)       Days
(Intercept)  0.86344433 0.01688228
Days         0.01688228 0.04990040
> # get the lower cholesky factor
> re_nlme <- t(chol(re_nlme)) # could also use pdMatrix(re_nlme, TRUE)
> print(re_nlme)
            (Intercept)      Days
(Intercept)  0.92921705 0.0000000
Days         0.01816829 0.2226439
我们可以为nlme实现这一点(这不是最有效的方法,但它显示了事物是如何构建的):


>lowerbd注意,对于MWE来说,使用一个内置数据集通常比链接到远程数据集更好,而不必解释该数据集的结构。此外,您的MWE不应该要求禁用健全性检查(例如,
check.nobs.vs.nRE
),除非问题是关于那些健全性检查Dear Livius,再次感谢你的回答。是否也在您的专业范围内?
> library("nlme")
> library("lme4")
> 
> data("sleepstudy")
> m_nlme <- lme(fixed=Reaction ~ 1 + Days,
+               random=~ 1 + Days | Subject,
+               data=sleepstudy,
+               method = "ML")
> m_lme4 <- lmer(Reaction ~ 1 + Days + (1 + Days|Subject),
+                data=sleepstudy,
+                REML=FALSE)
> 
> re_lme4 <- getME(m_lme4, "Tlist")$Subject
> print(re_lme4)
           [,1]      [,2]
[1,] 0.92919061 0.0000000
[2,] 0.01816575 0.2226432
> 
> re_nlme <- m_nlme$modelStruct$reStruct$Subject
> # entire covariance matrix
> print(re_nlme)
Positive definite matrix structure of class pdLogChol representing
            (Intercept)       Days
(Intercept)  0.86344433 0.01688228
Days         0.01688228 0.04990040
> # get the lower cholesky factor
> re_nlme <- t(chol(re_nlme)) # could also use pdMatrix(re_nlme, TRUE)
> print(re_nlme)
            (Intercept)      Days
(Intercept)  0.92921705 0.0000000
Days         0.01816829 0.2226439
> re_lme4[lower.tri(re_lme4,diag = TRUE)]
[1] 0.92919061 0.01816575 0.22264321
> getME(m_lme4, "theta")
     Subject.(Intercept) Subject.Days.(Intercept)             Subject.Days 
              0.92919061               0.01816575               0.22264321 
> getME(m_lme4, "lower")
[1]    0 -Inf    0
> lowerbd <- function(x){
+   dd <- diag(0, nrow=nrow(x))
+   dd[lower.tri(dd)] <- -Inf
+   dd[lower.tri(dd, diag=TRUE)]
+ }
> lowerbd(re_nlme)
[1]    0 -Inf    0
> lowerbd(re_lme4)
[1]    0 -Inf    0