SAS nlmixedとR nlmeで異なるモデルフィット結果が得られるのはなぜですか?


7
library(datasets)
library(nlme)
n1 <- nlme(circumference ~ phi1 / (1 + exp(-(age - phi2)/phi3)),
           data = Orange,
           fixed = list(phi1 ~ 1,
                        phi2 ~ 1,
                        phi3 ~ 1),
           random = list(Tree = pdDiag(phi1 ~ 1)),
           start = list(fixed = c(phi1 = 192.6873, phi2 = 728.7547, phi3 = 353.5323)))

nlmeはR を使用して非線形混合効果モデルを適合させ、これが私の出力です。

> summary(n1)
Nonlinear mixed-effects model fit by maximum likelihood
  Model: circumference ~ phi1/(1 + exp(-(age - phi2)/phi3)) 
 Data: Orange 
       AIC      BIC    logLik
  273.1691 280.9459 -131.5846

Random effects:
 Formula: phi1 ~ 1 | Tree
            phi1 Residual
StdDev: 31.48255 7.846255

Fixed effects: list(phi1 ~ 1, phi2 ~ 1, phi3 ~ 1) 
        Value Std.Error DF  t-value p-value
phi1 191.0499  16.15411 28 11.82671       0
phi2 722.5590  35.15195 28 20.55530       0
phi3 344.1681  27.14801 28 12.67747       0
 Correlation: 
     phi1  phi2 
phi2 0.375      
phi3 0.354 0.755

Standardized Within-Group Residuals:
       Min         Q1        Med         Q3        Max 
-1.9146426 -0.5352753  0.1436291  0.7308603  1.6614518 

Number of Observations: 35
Number of Groups: 5 

同じモデルをSASに適合させ、次の結果を得ました。 ここに画像の説明を入力してください

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

誰かがわずかに異なる見積もりを取得している理由を理解するのを手伝ってくれませんか?nlmeLindstrom&Bates(1990)の実装を使用していることを知っています。SASのドキュメントによると、SASの積分近似はPinhiero&Bates(1995)に基づいています。最適化手法をNelder-Meadに変更しての手法に一致させようとしましたnlmeが、結果はまだ似ていません。

RとSASの標準誤差とパラメーターの推定値が大きく異なる他のケースもありました(再現可能な例はありませんが、洞察はいただければ幸いです)。これは変量効果がある場合の標準誤差の推定方法nlmeと関係があると思いnlmixedますか?


sasモデルが標準誤差/偏差の推定にどういうわけか4自由度を使用していることがわかります。なぜ27や28ではないのですか?データセットのsasモデルで使用される観測はいくつありますか?
Sextus Empiricus

@MartijnWeteringsそれは確かに興味をそそります... Orangeデータセットには35の観測が含まれています。
エイドリアン

DFの決定にはいくつかの癖があるため、それが原因である可能性があります。とにかく、DFの要素よりも多くある可能性があります(モデルの近似には影響しないと思います)...対数尤度関数を手動で近似しようとしましたが、nlmeまたはnlmeとまったく同じにできませんnlmixed。使用されている対数尤度関数とそれを最適化するために使用されている方法に違いがあると思います。
Sextus Empiricus

私の心の中で彼らは非常に近いです。parmsを開始しました。トレース出力を比較しましたか?R(またはSAS)は異なる収束基準を持っている可能性があるため、1つが緩めたと言う緩解が早く終了し、もう1つがさらにいくつかの反復をスキップします。
AdamO

回答:


3

FWIW、手動最適化を使用してsas出力を再現できました

########## data ################

circ <- Orange$circumference
age <- Orange$age
group <- as.numeric(Orange$Tree)
#phi1 = n1[4]$coefficients$random$Tree + 192
phi1 = 192
phi2 = 728
phi3 = 353

######### likelihood function

Likelihood <- function(x,p_age,p_circ) {
  phi1 <- x[1]
  phi2 <- x[2]
  phi3 <- x[3]

  fitted <- phi1/(1 + exp(-(p_age - phi2)/phi3))
  fact <- 1/(1 + exp(-(age - phi2)/phi3))
  resid <- p_circ-fitted

  sigma1 <- x[4]  #  phi1 term
  sigma2 <- x[5]  #  error term

  covm <- matrix(rep(0,35*35),35)  # co-variance matrix for residual terms 

  #the residuals of the group variables will be correlated in 5 7x7 blocks      
  for (k in 0:4) {
    for (l in 1:7) {
      for (m in 1:7) {
        i = l+7*k
        j = m+7*k
        if (i==j) {
          covm[i,j] <- fact[i]*fact[j]*sigma1^2+sigma2^2
        }
        else {
          covm[i,j] <- fact[i]*fact[j]*sigma1^2
        }
      }
    }
  }

  logd <- (-0.5 * t(resid) %*% solve(covm) %*% resid) - log(sqrt((2*pi)^35*det(covm)))
  logd
}


##### optimize

out <- nlm(function(p) -Likelihood(p,age,circ),
           c(phi1,phi2,phi3,20,8),
           print.level=1,
           iterlim=100,gradtol=10^-26,steptol=10^-20,ndigit=30) 

出力

iteration = 0
Step:
[1] 0 0 0 0 0
Parameter:
[1] 192.0 728.0 353.0  30.0   5.5
Function Value
[1] 136.5306
Gradient:
[1] -0.003006727 -0.019069001  0.034154033 -0.021112696
[5] -5.669238697

iteration = 52
Parameter:
[1] 192.053145 727.906304 348.073030  31.646302   7.843012
Function Value
[1] 131.5719
Gradient:
[1] 0.000000e+00 5.240643e-09 0.000000e+00 0.000000e+00
[5] 0.000000e+00

Successive iterates within tolerance.
Current iterate is probably solution.
  • したがって、nlmixedの出力はこの最適値に近く、別の収束処理ではありません。

  • nlme出力も(異なる)最適値に近いです。(これは、関数呼び出しの最適化パラメーターを変更することで確認できます)

    • nlmeが尤度を計算する方法は正確にはわかりませんが(値は-131.6とほぼ同じです)、上記の3つのパラメーター(固定効果)と2つの厄介なパラメーターのフィッティングとは異なると思います。変量効果に追加のパラメーターを使用する尤度関数を使用すると、正確ではないがそれに似た結果が得られます。私は迷惑なパラメータを別様に扱っていたと思います(そしておそらく私はエラーを犯しました)。

3

私は同じ問題に対処しましたが、SASに一致させるにはRの収束基準を微調整する必要があるというMartjinに同意しました。より具体的には、私のケースではかなりうまくいくことがわかった(lCtrオブジェクトの)引数指定のこの組み合わせを試すことができます。

lCtr <- lmeControl(maxIter = 200, msMaxIter=200, opt='nlminb', tolerance = 1e-6, optimMethod = "L-BFGS-B")

n1 <- nlme(circumference ~ phi1 / (1 + exp(-(age - phi2)/phi3)),
           data = Orange,
           fixed = list(phi1 ~ 1,
                        phi2 ~ 1,
                        phi3 ~ 1),
           random = list(Tree = pdDiag(phi1 ~ 1)),
           start = list(fixed = c(phi1 = 192.6873, phi2 = 728.7547, phi3 = 353.5323)),
           control = lCtr)

公正な警告:これにより、SASとRの間で同じ固定推定値が得られます。ただし、固定効果の同じSEを取得することはおそらくありません(これについては、まだ回答を調査中です)。

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