lme4: 如何在不添加随机斜率之间的相关性的情况下指定两个具有随机截距的相关性

4

(转载自 stats.stackexchange.com)

我正在尝试在R的lme4包中指定一个模型,在该模型中,我有两个随机截距和随机斜率之间的相关性,但是不允许随机斜率相互相关。

lmer (Y ~ A + B + (1+A+B|Subject), data=mydata)

这是有问题的,因为它对A和B的随机斜率之间的相关性进行了建模。

而:

lmer (Y ~ A + B + (1+A|Subject) + (1+B|Subject), data=mydata)

之所以不好,是因为受试者的随机截距被引入模型两次。是否有第三种方式,可能更加巧妙?

1个回答

7

这个比我想象中的要难!

lme4 中的方差-协方差矩阵是根据其 Cholesky 因子进行参数化的(本质上是一个矩阵平方根);因此,如果我们想建立一个特定相关性被固定为零的模型,我们需要:

t1  0  0     t1 t2 t3      t1^2   t1*t2          t1*t3
t2 t4  0     0  t4 t5   =  t1*t2  t2^2 + t4^2    t2*t3 + t4*t5
t3 t5 t6     0   0 t6   =  t1*t3  t2*t3 + t4*t5  t3^2 + t5^2 + t6^2

并且解决[3,2]元素(AB之间的相关性)等于零;换句话说,我们需要 t2 t3 + t4 t5 == 0,或者一个6元素向量,其中t5 == -t2*t3/t4

tfun <- function(theta) {
  theta5 <- -theta[2]*theta[3]/theta[4] 
  c(theta[1:4],theta5,theta[5])
}

模拟一些数据:

set.seed(101)
dd <- data.frame(A=rnorm(1000),B=rnorm(1000),
                 Subject=factor(rep(1:20,50)))

library("lme4")
dd$Y <- simulate(~A+B+(1+A+B|Subject),
         newdata=dd,
         family=gaussian(),
         newparams=list(beta=c(1,2,3),
                        theta=tfun(c(1,0.2,0.3,2,3)),
                        sigma=1))[[1]]

现在按照?modular中的步骤进行操作:

lmod <- lFormula(Y ~ A + B + (1+A+B|Subject), data=dd)
devfun <- do.call(mkLmerDevfun, lmod)

这是一个封装函数,用于对devfun()进行调用。该函数将接收一个由5个元素组成的向量,并计算相应的受限制的theta向量,然后将其传递给devfun()函数进行处理。

devfun2 <- function(theta) {
    devfun(tfun(theta))
}

从下限向量中删除一个术语:
lwr <- lmod$reTrms$lower
## [1]    0 -Inf -Inf    0 -Inf    0
lwr <- lwr[c(1:4,6)]
library("minqa")
## n.b. optwrap fails with minqa::bobyqa
opt <- lme4:::optwrap(optimizer=bobyqa,
                      par=ifelse(lwr==0,1,0),
                      fn=devfun2,
                      lower=lwr)

现在根据参数转换调整结果:

opt$par <- tfun(opt$par)
m1 <- mkMerMod(environment(devfun), opt, lmod$reTrms, fr = lmod$fr)

VarCorr(m1)    
##  Groups   Name        Std.Dev. Corr       
##  Subject  (Intercept) 1.41450             
##           A           1.49374  0.019      
##           B           2.47895  0.316 0.000
##  Residual             0.96617             

期望的相关性现在被固定为零。

哇,这确实比我预想的更像黑客式的操作,谢谢!虽然我不理解所有的步骤,但至少我可以将其扩展到将方差-协方差矩阵的任何其他元素归零。你认为lme4语法是否有可能允许将方差-相关矩阵的所有元素都归零吗? - themeo
“all elements”是什么意思?你是指“任何指定元素”吗?还是你在寻找对角线方差-协方差矩阵? - Ben Bolker
抱歉表述不够准确 - 我的意思是任何指定的元素。 - themeo
2
这个问题已经摆在桌面上一段时间了,但我真的不会抱太大希望。lme4flexLambda 分支和 lme4ord 项目(均在 github 上)都朝着这个方向发展……还可以参见 https://github.com/bbolker/mixedmodels-misc/blob/master/mixed_interface.rmd。 - Ben Bolker

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接