Tại sao SAS nlmixed và R nlme cho kết quả phù hợp với mô hình khác nhau?


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

Tôi phù hợp với mô hình hiệu ứng hỗn hợp phi tuyến sử dụng nlmetrong R và đây là đầu ra của tôi.

> 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 

Tôi phù hợp với mô hình tương tự trong SAS và nhận được kết quả sau. nhập mô tả hình ảnh ở đây

nhập mô tả hình ảnh ở đây

Ai đó có thể giúp tôi hiểu lý do tại sao tôi nhận được ước tính hơi khác nhau? Tôi biết rằng việc nlmesử dụng triển khai Lindstrom & Bates (1990). Theo tài liệu của SAS, phép tính gần đúng tích phân của SAS dựa trên Pinhiero & Bates (1995). Tôi đã thử thay đổi phương pháp tối ưu hóa thành Nelder-Mead để phù hợp với phương pháp đó nlme, nhưng kết quả vẫn không giống nhau.

Tôi đã có những trường hợp khác trong đó ước tính sai số và tham số tiêu chuẩn trong R so với SAS rất khác nhau (tôi không có ví dụ có thể lặp lại về điều này, nhưng bất kỳ thông tin chi tiết nào cũng sẽ được đánh giá cao). Tôi đoán điều này có liên quan đến cách thức nlmenlmixedước tính các lỗi tiêu chuẩn khi có các hiệu ứng ngẫu nhiên?


Thật thú vị khi thấy rằng mô hình sas sử dụng 4 bậc tự do để ước tính sai số / độ lệch chuẩn. Tại sao không phải 27 hay 28? Có bao nhiêu quan sát trong tập dữ liệu sử dụng cho mô hình sas?
Sextus Empiricus

@MartijnWeterings Điều đó thực sự hấp dẫn ... Bộ Orangedữ liệu chứa 35 quan sát.
Adrian

Có một số điều kỳ quặc trong việc xác định DF vì vậy có thể là do điều đó. Dù sao, có thể có nhiều hơn những thứ DF (mà tôi tin rằng nó không ảnh hưởng đến sự phù hợp của mô hình) ... Tôi đã cố gắng tự điều chỉnh một chức năng khả năng đăng nhập và tôi không thể có được chính xác như nlme hoặc nlixixed. Tôi tin rằng sự khác biệt nằm ở hàm loglikabilities đã sử dụng và phương thức được sử dụng để tối ưu hóa nó.
Sextus Empiricus 28/03/18

Trong tâm trí tôi họ rất thân thiết. Bạn đã khởi xướng parms. Bạn đã so sánh các đầu ra theo dõi? R (hoặc SAS) có thể có các tiêu chí hội tụ khác nhau, do đó, người lỏng lẻo gọi nó thoát ra sớm hơn trong khi người khác bỏ qua trước một vài lần lặp lại.
AdamO

Câu trả lời:


3

FWIW, tôi có thể tái tạo đầu ra sas bằng cách tối ưu hóa thủ công

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

đầu ra

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.
  • Vì vậy, đầu ra nlmixed gần với mức tối ưu này và nó không phải là một điều hội tụ khác.

  • Đầu ra nlme cũng gần với tối ưu (khác nhau). (Bạn có thể kiểm tra điều này bằng cách thay đổi các tham số tối ưu hóa trong lệnh gọi hàm)

    • Tôi không biết chính xác làm thế nào nlme tính toán khả năng (mặc dù giá trị gần bằng -131,6) nhưng tôi nghi ngờ rằng nó khác với 3 tham số phù hợp ở trên (các hiệu ứng cố định) và 2 tham số phiền toái. Sử dụng hàm khả năng sử dụng các tham số bổ sung cho hiệu ứng ngẫu nhiên, tôi có thể nhận được một kết quả giống với nó nhưng không chính xác. Tôi đoán rằng tôi đã xử lý khác với các tham số phiền toái (và có khả năng tôi đã gây ra lỗi).

3

Tôi đã giải quyết vấn đề tương tự và đồng ý với Martjin rằng bạn cần điều chỉnh các tiêu chí hội tụ trong R để làm cho nó phù hợp với SAS. Cụ thể hơn, bạn có thể thử kết hợp đặc tả đối số này (trong đối tượng lCtr) mà tôi thấy hoạt động khá tốt trong trường hợp của mình.

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)

Cảnh báo công bằng: điều này sẽ giúp bạn có cùng ước tính cố định giữa SAS và R. Tuy nhiên, bạn có thể sẽ không nhận được cùng một SE về các hiệu ứng cố định (mà tôi vẫn đang nghiên cứu câu trả lời cho ..).

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.