Por que SAS nlmixed e R nlme fornecem resultados diferentes de ajuste do modelo?

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

Eu ajustei um modelo de efeitos mistos não lineares usando nlmeR, e aqui está minha saída.

> 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 

Ajustei o mesmo modelo no SAS e obtive os seguintes resultados. insira a descrição da imagem aqui

insira a descrição da imagem aqui

Alguém pode me ajudar a entender por que estou recebendo estimativas ligeiramente diferentes? Eu sei que ele nlmeusa a implementação de Lindstrom & Bates (1990). De acordo com a documentação do SAS, a aproximação integral do SAS é baseada em Pinhiero & Bates (1995). Tentei alterar o método de otimização para Nelder-Mead para corresponder ao de nlme, mas os resultados ainda são diferentes.

Já tive outros casos em que o erro padrão e a estimativa de parâmetros em R vs. SAS são muito diferentes (não tenho um exemplo reproduzível disso, mas qualquer insight seria apreciado). Eu estou supondo que isso tem a ver com como nlmee nlmixedestimar os erros padrão na presença de efeitos aleatórios?

Adrian
fonte
É interessante ver que o modelo sas usa de alguma forma 4 graus de liberdade para a estimativa do erro / desvio padrão. Por que não 27 ou 28? Quantas observações existem no conjunto de dados usa para o modelo sas?
Sextus Empiricus 28/03
@MartijnWeterings Isso é realmente intrigante ... O Orangeconjunto de dados contém 35 observações.
Adrian
Existem algumas peculiaridades na determinação do DF, por isso pode ser devido a isso. De qualquer forma, pode haver mais do que o material do DF (que, acredito, não influencia o ajuste do modelo) ... Estou tentando ajustar manualmente uma função de probabilidade de log e não consigo exatamente o mesmo que nlme ou misturado. Acredito que as diferenças estejam na função de probabilidade de log usada e no método usado para otimizá-la.
Sextus Empiricus 28/03
Na minha opinião, eles são muito próximos. Você iniciou o parms. Você comparou as saídas de rastreamento? R (ou SAS) pode ter diferentes critérios de convergência; portanto, o laxer chamado encerra mais cedo, enquanto o outro pula adiante mais algumas iterações.
28418 AdamO

Respostas:

3

FWIW, eu poderia reproduzir a saída sas usando uma otimização manual

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

resultado

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.
  • Portanto, a saída nlmixed está próxima desse ótimo e não é uma coisa de convergência diferente.

  • A saída nlme também está próxima do (diferente) ideal. (Você pode verificar isso alterando os parâmetros de otimização na chamada de função)

    • Não sei exatamente como o nlme calcula a probabilidade (embora o valor seja quase o mesmo -131,6), mas desconfio que seja diferente dos 3 parâmetros de ajuste acima (efeitos fixos) e 2 dos parâmetros de incômodo. Usando uma função de probabilidade que usa parâmetros adicionais para o efeito aleatório, eu poderia obter um resultado semelhante a ele, mas não exatamente. Acho que estava lidando de maneira diferente com os parâmetros de incômodo (e provavelmente cometi um erro).
Sextus Empiricus
fonte
3

Eu lidei com o mesmo problema e concordo com Martjin que você precisa ajustar os critérios de convergência no R para torná-lo compatível com o SAS. Mais especificamente, você pode tentar essa combinação de especificação de argumento (no objeto lCtr) que eu achei que funcionou muito bem no meu caso.

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)

Aviso justo: você deve obter as mesmas estimativas fixas entre SAS e R. No entanto, você provavelmente não obteria o mesmo SE dos efeitos fixos (que ainda estou pesquisando respostas para ..).

Angel Lu
fonte