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