lme() 和 lmer() 给出相互矛盾的结果

机器算法验证 r 混合模式 lme4-nlme
2022-01-30 16:55:59

我一直在处理一些重复测量存在问题的数据。在这样做的过程中,我注意到我的测试数据之间lme()lmer()使用我的测试数据之间的行为非常不同,并且想知道为什么。

我创建的假数据集包含 10 名受试者的身高和体重测量值,每人测量两次。我设置了数据,以便受试者之间的身高和体重之间存在正相关关系,但每个个体内部的重复测量之间存在负相关关系。

set.seed(21)
Height=1:10; Height=Height+runif(10,min=0,max=3) #First height measurement
Weight=1:10; Weight=Weight+runif(10,min=0,max=3) #First weight measurement

Height2=Height+runif(10,min=0,max=1) #second height measurement
Weight2=Weight-runif(10,min=0,max=1) #second weight measurement

Height=c(Height,Height2) #combine height and wight measurements
Weight=c(Weight,Weight2)

DF=data.frame(Height,Weight) #generate data frame
DF$ID=as.factor(rep(1:10,2)) #add subject ID
DF$Number=as.factor(c(rep(1,10),rep(2,10))) #differentiate between first and second measurement

这是数据图,用线连接每个人的两次测量。 在此处输入图像描述

所以我运行了两个模型,一个带有lme()fromnlme包,一个带有lmer()from lme4在这两种情况下,我使用 ID 的随机效应对体重与身高进行回归,以控制每个人的重复测量。

library(nlme)
Mlme=lme(Height~Weight,random=~1|ID,data=DF)
library(lme4)
Mlmer=lmer(Height~Weight+(1|ID),data=DF)

这两个模型经常(尽管并不总是取决于种子)产生完全不同的结果。我已经看到它们在哪里产生略有不同的方差估计,计算不同的自由度等,但这里的系数是相反的方向。

coef(Mlme)
#   (Intercept)    Weight
#1   1.57102183 0.7477639
#2  -0.08765784 0.7477639
#3   3.33128509 0.7477639
#4   1.09639883 0.7477639
#5   4.08969282 0.7477639
#6   4.48649982 0.7477639
#7   1.37824171 0.7477639
#8   2.54690995 0.7477639
#9   4.43051687 0.7477639
#10  4.04812243 0.7477639

coef(Mlmer)
#   (Intercept)    Weight
#1     4.689264 -0.516824
#2     5.427231 -0.516824
#3     6.943274 -0.516824
#4     7.832617 -0.516824
#5    10.656164 -0.516824
#6    12.256954 -0.516824
#7    11.963619 -0.516824
#8    13.304242 -0.516824
#9    17.637284 -0.516824
#10   18.883624 -0.516824

为了直观地说明,使用lme()

在此处输入图像描述

和模型lmer()

在此处输入图像描述

为什么这些模型差异如此之大?

1个回答

tl;博士如果您将优化器更改为“nloptwrap”,我认为它将避免这些问题(可能)。

恭喜,您在统计估计问题中找到了多重最优的最简单示例之一!内部使用的参数lme4(因此便于说明)是随机效应的缩放标准偏差,即组间标准差除以残差标准差。

提取这些原始值lmelmer拟合值:

(sd1 <- sqrt(getVarCov(Mlme)[[1]])/sigma(Mlme))
## 2.332469
(sd2 <- getME(Mlmer,"theta")) ## 14.48926

用另一个优化器改装(这可能是下一个版本的默认值lme4):

Mlmer2 <- update(Mlmer,
  control=lmerControl(optimizer="nloptwrap"))
sd3 <- getME(Mlmer2,"theta")   ## 2.33247

比赛lme......让我们看看发生了什么。对于具有单个随机效应的 LMM,偏差函数(-2*log 似然性),或者在这种情况下是类似的 REML 标准函数,只需要一个参数,因为固定效应参数已被分析出来对于给定的 RE 标准偏差值,它们可以自动计算。

ff <- as.function(Mlmer)
tvec <- seq(0,20,length=101)
Lvec <- sapply(tvec,ff)
png("CV38425.png")
par(bty="l",las=1)
plot(tvec,Lvec,type="l",
     ylab="REML criterion",
     xlab="scaled random effects standard deviation")
abline(v=1,lty=2)
points(sd1,ff(sd1),pch=16,col=1)
points(sd2,ff(sd2),pch=16,col=2)
points(sd3,ff(sd3),pch=1,col=4)
dev.off()

在此处输入图像描述

我继续对此更加着迷,并为每个案例运行了从 1 到 1000 的随机种子的拟合,拟合lme,lmerlmer+nloptwrap。以下是 1000 个数字,其中给定方法得到的答案至少另一种方法差 0.001 个偏差单位......

          lme.dev lmer.dev lmer2.dev
lme.dev         0       64        61
lmer.dev      369        0       326
lmer2.dev      43        3         0

换句话说,(1)没有一种方法总是最有效的;(2)lmer使用默认优化器最差(大约 1/3 的时间失败);(3)lmer最好使用“nloptwrap”(比lme4% 的时间差,很少比 差lmer)。

稍微让人放心的是,我认为这种情况对于小的、错误指定的情况可能是最糟糕的(即这里的残差是统一的而不是正常的)。不过,更系统地探索这一点会很有趣……