lme()とlmer()が矛盾する結果を与える


20

私は、繰り返し測定に問題のあるいくつかのデータを扱ってきました。間そうすることで、私は非常に異なる行動に気づいたlme()し、lmer()私のテストデータを使用して理由を知りたいです。

私が作成した偽のデータセットには、10人の被験者の身長と体重の測定値があり、それぞれ2回取得されています。被験者間では身長と体重の間には正の関係があり、各個人内で繰り返される測定の間には負の関係があるようにデータを設定しました。

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

これは、各個人の2つの測定値を結ぶ線を使用したデータのプロットです。 ここに画像の説明を入力してください

だから私は2つのモデルを実行しました。1つlme()nlmeパッケージから、もう1つは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)

これらの2つのモデルは、多くの場合(常にシードに依存するわけではありませんが)、まったく異なる結果を生成しました。それらがわずかに異なる分散推定値を生成する場所、異なる自由度を計算する場所などを見てきましたが、ここでは係数は反対方向にあります。

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
なんてクールな例でしょう。また、個人の固定効果とランダム効果をフィッティングすると、重み項に対してまったく異なる係数推定値が得られる場合の便利な例です。
ジェイコブソコラー

回答:


25

tl; drオプティマイザーを "nloptwrap"に変更すると、これらの問題を回避できると思います(おそらく)。

おめでとうございます、統計的推定問題で複数の最適値の最も単純な例の1つを見つけました!lme4内部的に使用する(したがって、説明に便利な)パラメーターは、変量効果のスケーリングされた標準偏差、つまりグループ間std devを残差std devで除算したものです。

オリジナルlmeおよびlmer適合のためにこれらの値を抽出します。

(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基準関数は、1つの引数のみを取ります。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()

ここに画像の説明を入力してください

私はこれについてさらにこだわり続けlme、1から1000までのランダムシードのフィッティング、フィッティング、、lmerおよびlmer+ nloptwrapを各ケースで実行しました。以下は、指定されたメソッドが別のメソッドよりも少なくとも0.001偏差単位悪い回答を取得する1000のうちの数です...

          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)。

少し安心させるために、この状況は、小規模で誤って指定された場合に最悪になる可能性が高いと思います(つまり、ここでの残留誤差は標準ではなく均一です)。しかし、これをより体系的に調査することは興味深いでしょう...

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.