Warum liefern SAS nlmixed und R nlme unterschiedliche Modellanpassungsergebnisse?

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

Ich passe ein nichtlineares Mischeffektmodell mit nlmeR an und hier ist meine Ausgabe.

> 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 

Ich passe das gleiche Modell in SAS an und erhalte die folgenden Ergebnisse. Geben Sie hier die Bildbeschreibung ein

Geben Sie hier die Bildbeschreibung ein

Kann mir jemand helfen zu verstehen, warum ich etwas andere Schätzungen bekomme? Ich weiß, dass das nlmedie Implementierung von Lindstrom & Bates (1990) verwendet. Laut SAS-Dokumentation basiert die integrale Approximation von SAS auf Pinhiero & Bates (1995). Ich habe versucht, die Optimierungsmethode auf Nelder-Mead zu ändern nlme, aber die Ergebnisse sind immer noch unterschiedlich.

Ich hatte andere Fälle, in denen der Standardfehler und die Parameterschätzung in R vs. SAS sehr unterschiedlich sind (ich habe kein reproduzierbares Beispiel dafür, aber jede Einsicht wäre willkommen). Ich vermute, das hat damit zu tun, wie nlmeund wie nlmixeddie Standardfehler bei zufälligen Effekten geschätzt werden?

Adrian
quelle
Es ist interessant zu sehen, dass das sas-Modell irgendwie 4 Freiheitsgrade für die Schätzung des Standardfehlers / der Standardabweichung verwendet. Warum nicht 27 oder 28? Wie viele Beobachtungen enthält der Datensatz für das sas-Modell?
Sextus Empiricus
@MartijnWeterings Das ist in der Tat faszinierend ... Der OrangeDatensatz enthält 35 Beobachtungen.
Adrian
Es gibt einige Macken bei der Bestimmung des DF, so dass es daran liegen könnte. Wie auch immer, es könnte mehr als das DF-Zeug geben (was meiner Meinung nach keinen Einfluss auf die Modellanpassung hat) ... Ich habe versucht, eine Log-Likelihood-Funktion manuell anzupassen, und ich kann nicht genau das gleiche wie nlme oder erhalten nlmixed. Ich glaube, dass die Unterschiede in der verwendeten Loglikelihood-Funktion und der verwendeten Methode zur Optimierung liegen.
Sextus Empiricus
In meinen Augen sind sie sehr nah. Sie haben die Parms initiiert. Haben Sie die Trace-Ausgaben verglichen? R (oder SAS) kann unterschiedliche Konvergenzkriterien haben, sodass der langsamere Aufruf früher beendet wird, während der andere einige weitere Iterationen überspringt.
AdamO

Antworten:

3

FWIW, ich könnte die sas-Ausgabe mit einer manuellen Optimierung reproduzieren

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

Ausgabe

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.
  • Die nlmixed-Ausgabe liegt also nahe an diesem Optimum und ist keine andere Konvergenzsache.

  • Die nlme-Ausgabe liegt ebenfalls nahe am (unterschiedlichen) Optimum. (Sie können dies überprüfen, indem Sie die Optimierungsparameter im Funktionsaufruf ändern.)

    • Ich weiß nicht genau, wie nlme die Wahrscheinlichkeit berechnet (obwohl der Wert nahezu gleich ist -131,6), aber ich vermute, dass er sich von den oben angepassten 3 Parametern (den festen Effekten) und 2 Störparametern unterscheidet. Mit einer Wahrscheinlichkeitsfunktion, die zusätzliche Parameter für den Zufallseffekt verwendet, könnte ich ein Ergebnis erhalten, das ihm ähnelt, aber nicht genau. Ich denke, dass ich anders mit den Störparametern umgegangen bin (und wahrscheinlich einen Fehler gemacht habe).
Sextus Empiricus
quelle
3

Ich hatte mich mit demselben Problem befasst und stimme Martjin zu, dass Sie die Konvergenzkriterien in R anpassen müssen, damit es mit SAS übereinstimmt. Insbesondere können Sie diese Kombination von Argumentspezifikationen (im lCtr-Objekt) ausprobieren, die in meinem Fall ziemlich gut funktioniert hat.

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)

Faire Warnung: Dies sollte Ihnen die gleichen festen Schätzungen zwischen SAS und R bringen. Allerdings würden Sie wahrscheinlich nicht die gleiche SE der festen Effekte erhalten (für die ich noch nach Antworten suche ..).

Angel Lu
quelle