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


20

我一直在处理一些重复测量有问题的数据。在这样做的过程中,我注意到测试数据之间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()来自nlmepackage,一个模型来自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()

在此处输入图片说明

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


2
多么酷的例子。这也是一个有用的例子,其中个体的固定效应与随机效应的拟合给出了权重项的系数估计完全不同的情况。
Jacob Socolar

Answers:


25

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

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

提取原始值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 *对数似然函数)或本例中的类似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,装修lmelmerlmer+每个案例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)。

可以放心一点,我认为这种情况对于较小的,错误指定的情况可能是最糟糕的(即,此处的残留错误是统一的,而不是正常的)。不过,更系统地探索这一点将很有趣。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.