私は他の古い答えがここでは不十分であることがわかります。私は、統計的に年齢が影響を受けていないケースと、逆に計算上のエラーが発生したケースを区別します。個人的に、私はこれら2つのケースを融合させてキャリアミスを犯しました。 Rは後者に信号を送り、私はそれがなぜであるかを知りたいと思います。
OPが指定したモデルは、ランダムなスロープとインターセプトを持つ成長モデルです。グランドインターセプトは含まれていますが、壮大な年齢の勾配ではありません。 「壮大な」項を加えずにランダムな勾配を当てはめることによって課される不安な制約の1つは、ランダムな勾配に0の平均を持たせることです。これは最適化が非常に困難です。限界的モデルは、年齢がモデルの0と統計的に有意な異なる値を持たないことを示している。さらに、固定効果として年齢を追加しても問題は解決されません。
> lme(conc~ age, random=~age|Lot, data=IGF)
Error in lme.formula(conc ~ age, random = ~age | Lot, data = IGF) :
nlminb problem, convergence error code = 1
message = iteration limit reached without convergence (10)
ここでエラーは明らかです。反復回数を上げることが魅力的かもしれません。 lmeControl
には多くの反復的推定があります。しかし、それでも動作しません:
> fit <- lme(conc~ 1, random=~age|Lot, data=IGF,
control = lmeControl(maxIter = 1e8, msMaxIter = 1e8))
Error in lme.formula(conc ~ 1, random = ~age | Lot,
data = IGF, control = lmeControl(maxIter = 1e+08, :
nlminb problem, convergence error code = 1
message = singular convergence (7)
したがって、これは正確なものではなく、オプティマイザは範囲外で実行されています。
フィッティングを提案した2つのモデルと、見つかったエラーを診断する方法には、大きな違いがあります。 1つの簡単なアプローチは、問題のあるモデルに対して「冗長」な適合を指定することです。
> lme(conc~ 1, random=~age|Lot, data=IGF, control = lmeControl(msVerbose = TRUE))
0: 602.96050: 2.63471 4.78706 141.598
1: 602.85855: 3.09182 4.81754 141.597
2: 602.85312: 3.12199 4.97587 141.598
3: 602.83803: 3.23502 4.93514 141.598
(truncated)
48: 602.76219: 6.22172 4.81029 4211.89
49: 602.76217: 6.26814 4.81000 4425.23
50: 602.76216: 6.31630 4.80997 4638.57
50: 602.76216: 6.31630 4.80997 4638.57
The first term is the REML (I think). The second through fourth terms are the parameters to an object called lmeSt
of class lmeStructInt
, lmeStruct
, and modelStruct
. If you use Rstudio's debugger to inspect attributes of this object (the lynchpin of the problem), you'll see it is the random effects component that explodes here. coef(lmeSt)
after 50 iterations produces
reStruct.Lot1 reStruct.Lot2 reStruct.Lot3
6.316295 4.809975 4638.570586
上記のように、
> coef(lmeSt, unconstrained = FALSE)
reStruct.Lot.var((Intercept)) reStruct.Lot.cov(age,(Intercept))
306382.7 2567534.6
reStruct.Lot.var(age)
21531399.4
それは
Browse[1]> lmeSt$reStruct$Lot
Positive definite matrix structure of class pdLogChol representing
(Intercept) age
(Intercept) 306382.7 2567535
age 2567534.6 21531399
したがって、ランダム効果の共分散は、この特定のオプティマイザにとってここで爆発的なものであることは明らかです。 nlminb
のPORTルーチンは、情報がないことから批判されています。 David Gay(Bell Labs)のテキストは、 http://ms.mcmasterです。 ca /〜bolker/misc/port.pdf PORTのドキュメントには、10億イタリックの "xが多すぎるかもしれない"というエラー7が示唆されています。アルゴリズムを修正するのではなく、類似の結果を生じるような近似的な結果があるかどうかを尋ねる必要があります。たとえば、 lmList
オブジェクトに合わせて、ランダム切片とランダムスロープの分散を算出するのは簡単です。
> fit <- lmList(conc ~ age | Lot, data=IGF)
> cov(coef(fit))
(Intercept) age
(Intercept) 0.13763699 -0.018609973
age -0.01860997 0.003435819
理想的には、これらはそれぞれの精度の重みによって重み付けされます。
nlme
パッケージを使用するには、BFGSを使用した制約のない最適化でそのようなエラーが発生せず、同様の結果が得られることに注意してください。
> lme(conc ~ 1, data=IGF, random=~age|Lot, control = lmeControl(opt = 'optim'))
Linear mixed-effects model fit by REML
Data: IGF
Log-restricted-likelihood: -292.9675
Fixed: conc ~ 1
(Intercept)
5.333577
Random effects:
Formula: ~age | Lot
Structure: General positive-definite, Log-Cholesky parametrization
StdDev Corr
(Intercept) 0.032109976 (Intr)
age 0.005647296 -0.698
Residual 0.820819785
Number of Observations: 237
Number of Groups: 10
このようなモデルの別の構文宣言は、もっと簡単な lme4
パッケージで行うことができます:
library(lme4)
lmer(conc ~ 1 + (age | Lot), data=IGF)
これにより、
> lmer(conc ~ 1 + (age | Lot), data=IGF)
Linear mixed model fit by REML ['lmerMod']
Formula: conc ~ 1 + (age | Lot)
Data: IGF
REML criterion at convergence: 585.7987
Random effects:
Groups Name Std.Dev. Corr
Lot (Intercept) 0.056254
age 0.006687 -1.00
Residual 0.820609
Number of obs: 237, groups: Lot, 10
Fixed Effects:
(Intercept)
5.331
lmer
とそのオプティマイザの属性は、最適化(および推定の統計効率)を簡素化するので、1、0、または-1に非常に近いランダム効果の相関を単純にそれらの値に設定するということです。実質的に。
これをまとめると、以前に述べたように年齢に影響がないことを示唆していません。この議論は数値結果によって裏付けられます。