Tại sao SAS PROC GLIMMIX cung cấp cho tôi RẤT NHIỀU độ dốc ngẫu nhiên khác với glmer (lme4) cho một glmm nhị thức


12

Tôi là người dùng quen thuộc hơn với R và đã cố gắng ước tính độ dốc ngẫu nhiên (hệ số lựa chọn) cho khoảng 35 cá nhân trong 5 năm cho bốn biến môi trường sống. Biến trả lời là liệu một vị trí đã được sử dụng "(1) hay" có sẵn "(0) môi trường sống (" sử dụng "bên dưới).

Tôi đang sử dụng máy tính Windows 64 bit.

Trong phiên bản R 3.1.0, tôi sử dụng dữ liệu và biểu thức bên dưới. PS, TH, RS và CTNH là các hiệu ứng cố định (tiêu chuẩn hóa, khoảng cách đo được với các loại môi trường sống). lme4 V 1.1-7.

str(dat)
'data.frame':   359756 obs. of  7 variables:
 $ use     : num  1 1 1 1 1 1 1 1 1 1 ...
 $ Year    : Factor w/ 5 levels "1","2","3","4",..: 4 4 4 4 4 4 4 4 3 4 ...
 $ ID      : num  306 306 306 306 306 306 306 306 162 306 ...
 $ PS: num  -0.32 -0.317 -0.317 -0.318 -0.317 ...
 $ TH: num  -0.211 -0.211 -0.211 -0.213 -0.22 ...
 $ RS: num  -0.337 -0.337 -0.337 -0.337 -0.337 ...
 $ HW: num  -0.0258 -0.19 -0.19 -0.19 -0.4561 ...

glmer(use ~  PS + TH + RS + HW +
     (1 + PS + TH + RS + HW |ID/Year),
     family = binomial, data = dat, control=glmerControl(optimizer="bobyqa"))

glmer cho tôi ước tính tham số cho các hiệu ứng cố định có ý nghĩa với tôi và độ dốc ngẫu nhiên (mà tôi hiểu là hệ số lựa chọn cho từng loại môi trường sống) cũng có ý nghĩa khi tôi điều tra dữ liệu một cách định tính. Khả năng đăng nhập của mô hình là -3050,8.

Tuy nhiên, hầu hết các nghiên cứu về sinh thái động vật không sử dụng R vì với dữ liệu vị trí của động vật, tự động tương quan không gian có thể làm cho các lỗi tiêu chuẩn dễ bị lỗi loại I. Trong khi R sử dụng các lỗi tiêu chuẩn dựa trên mô hình, các lỗi tiêu chuẩn theo kinh nghiệm (cũng như Huber trắng hoặc sandwich) được ưu tiên.

Mặc dù R hiện không cung cấp tùy chọn này (theo hiểu biết của tôi - XIN, hãy sửa tôi nếu tôi sai), nhưng tôi không có quyền truy cập vào SAS, một đồng nghiệp đã đồng ý cho tôi mượn máy tính của anh ấy để xác định xem có phải lỗi tiêu chuẩn không thay đổi đáng kể khi phương pháp thực nghiệm được sử dụng.

Trước tiên, chúng tôi muốn đảm bảo rằng khi sử dụng các lỗi tiêu chuẩn dựa trên mô hình, SAS sẽ tạo ra các ước tính tương tự với R - để chắc chắn rằng mô hình được chỉ định theo cùng một cách trong cả hai chương trình. Tôi không quan tâm nếu chúng giống hệt nhau - giống nhau. Tôi đã thử (SAS V 9.2):

proc glimmix data=dat method=laplace;
   class year id;
   model use =  PS TH RS HW / dist=bin solution ddfm=betwithin;
   random intercept PS TH RS HW / subject = year(id) solution type=UN;
run;title;

Tôi cũng đã thử nhiều hình thức khác, chẳng hạn như thêm dòng

random intercept / subject = year(id) solution type=UN;
random intercept PS TH RS HW / subject = id solution type=UN;

Tôi đã thử mà không chỉ định

solution type = UN,

hoặc bình luận

ddfm=betwithin;

Cho dù chúng tôi chỉ định mô hình như thế nào (và chúng tôi đã thử nhiều cách), tôi không thể lấy các độ dốc ngẫu nhiên trong SAS để giống với các đầu ra từ R - mặc dù các hiệu ứng cố định là tương tự nhau. Và khi tôi có ý khác nhau, tôi có nghĩa là ngay cả các dấu hiệu đều giống nhau. Khả năng đăng nhập -2 trong SAS là 71344,94.

Tôi không thể tải lên tập dữ liệu đầy đủ của mình; Vì vậy, tôi đã làm một bộ dữ liệu đồ chơi chỉ với các hồ sơ từ ba cá nhân. SAS cho tôi đầu ra trong vài phút; Trong R phải mất hơn một giờ. Kỳ dị. Với bộ dữ liệu đồ chơi này, giờ đây tôi nhận được các ước tính khác nhau cho các hiệu ứng cố định.

Câu hỏi của tôi: Bất cứ ai cũng có thể làm sáng tỏ lý do tại sao các ước tính độ dốc ngẫu nhiên có thể rất khác nhau giữa R và SAS? Có bất cứ điều gì tôi có thể làm trong R, hoặc SAS, để sửa đổi mã của mình để các cuộc gọi tạo ra kết quả tương tự không? Tôi muốn thay đổi mã trong SAS, vì tôi "tin" ước tính R của mình nhiều hơn.

Tôi thực sự quan tâm đến những khác biệt này và muốn đi đến tận cùng của vấn đề này!

Đầu ra của tôi từ bộ dữ liệu đồ chơi chỉ sử dụng ba trong số 35 cá nhân trong bộ dữ liệu đầy đủ cho R và SAS được bao gồm dưới dạng jpeg.

Đầu ra R Đầu ra SAS 1 Đầu ra SAS 2 Đầu ra SAS 3


CHỈNH SỬA VÀ CẬP NHẬT:

Như @JakeWestfall đã giúp khám phá, các sườn dốc trong SAS không bao gồm các hiệu ứng cố định. Khi tôi thêm các hiệu ứng cố định, đây là kết quả - so sánh độ dốc R với độ dốc SAS cho một hiệu ứng cố định, "PS", giữa các chương trình: (Hệ số lựa chọn = độ dốc ngẫu nhiên). Lưu ý sự thay đổi tăng lên trong SAS.

R vs SAS cho PS


Tôi nhận thấy đó IDkhông phải là một yếu tố trong R; kiểm tra và xem nếu điều đó thay đổi bất cứ điều gì.
Aaron rời Stack Overflow

Tôi thấy rằng bạn đang phù hợp với cả hai bằng cách sử dụng xấp xỉ Laplace cho khả năng đăng nhập. Điểm khả năng đăng nhập tương ứng của họ là gì?
usεr11852 nói Phục hồi Monic

1
Bạn đã kiểm tra rằng bạn đang mô hình hóa biến phụ thuộc theo cùng một hướng chưa?
Peter Flom - Tái lập Monica

1
Nhân tiện, cái mà Peter đang nhận được là, theo mặc định với dữ liệu nhị thức được dán nhãn là 0s và 1s, Rsẽ mô hình xác suất của phản hồi "1" trong khi SAS sẽ mô hình xác suất của phản hồi "0". Để biến mô hình SAS thành xác suất "1", bạn cần viết biến phản hồi của mình là use(event='1'). Tất nhiên, ngay cả khi không làm điều này, tôi tin rằng chúng ta vẫn nên mong đợi các ước tính tương tự về phương sai hiệu ứng ngẫu nhiên, cũng như các ước tính hiệu ứng cố định tương tự mặc dù có dấu hiệu đảo ngược.
Jake Westfall

1
@EricaN Một điều mà bạn vừa nhắc tôi là bạn nên so sánh các hiệu ứng ngẫu nhiên từ R với các hiệu ứng trong SAS bằng cách sử dụng ranef()hàm chứ không phải coef(). Cái trước cho hiệu ứng ngẫu nhiên thực tế, trong khi cái sau cho hiệu ứng ngẫu nhiên cộng với vector hiệu ứng cố định. Vì vậy, điều này giải thích rất nhiều lý do tại sao các con số được minh họa trong bài viết của bạn khác nhau, nhưng vẫn còn một sự khác biệt đáng kể mà tôi không thể giải thích hoàn toàn.
Jake Westfall

Câu trả lời:


11

Dường như tôi không nên mong đợi các sườn ngẫu nhiên giống nhau giữa các gói, theo Zhang et al 2011. Trong bài báo của họ mô hình hiệu ứng hỗn hợp tuyến tính tổng quát cho các phản hồi nhị phân sử dụng các gói thống kê khác nhau , họ mô tả:

Trừu tượng:

Mô hình hiệu ứng hỗn hợp tuyến tính tổng quát (GLMM) là một mô hình phổ biến để mở rộng các mô hình cho dữ liệu cắt ngang thành một thiết lập theo chiều dọc. Khi được áp dụng để mô hình hóa các phản hồi nhị phân, các gói phần mềm khác nhau và thậm chí các quy trình khác nhau trong một gói có thể cho kết quả khá khác nhau. Trong báo cáo này, chúng tôi mô tả các phương pháp thống kê làm nền tảng cho các quy trình khác nhau này và thảo luận về điểm mạnh và điểm yếu của chúng khi được áp dụng để phù hợp với các phản ứng nhị phân tương quan. Sau đó, chúng tôi minh họa những cân nhắc này bằng cách áp dụng các quy trình được triển khai trong một số gói phần mềm phổ biến cho dữ liệu nghiên cứu mô phỏng và thực tế. Kết quả mô phỏng của chúng tôi cho thấy sự thiếu tin cậy đối với hầu hết các quy trình được xem xét, mang ý nghĩa quan trọng trong việc áp dụng các gói phần mềm phổ biến như vậy trong thực tế.

Tôi hy vọng @BenBolker và nhóm sẽ coi câu hỏi của tôi là phiếu bầu cho R để kết hợp các lỗi tiêu chuẩn thực nghiệm và khả năng Quadrature Gauss-Hermite cho các mô hình với một số thuật ngữ độ dốc ngẫu nhiên, vì tôi thích giao diện R hơn và rất thích áp dụng một số phân tích sâu hơn trong chương trình đó. Hạnh phúc, ngay cả khi R và SAS không có giá trị tương đương cho độ dốc ngẫu nhiên, các xu hướng chung là như nhau. Cảm ơn tất cả các đầu vào của bạn, tôi thực sự đánh giá cao thời gian và sự cân nhắc mà bạn đưa vào này!


xin lỗi: "lỗi tiêu chuẩn" là gì? Bạn có nghĩa là lỗi tiêu chuẩn của các thành phần phương sai? Hay bạn có nghĩa là lỗi tiêu chuẩn bánh sandwich?
Ben Bolker

xin lỗi ... có nghĩa là SEs theo kinh nghiệm / sandwich. Tôi đã chỉnh sửa phản hồi của mình.
Nova

@BenBolker Điều này đã bao giờ được kết hợp?
Lepidopterist

Không. Tôi tiếp tục cố gắng tìm hiểu làm thế nào tôi sẽ hỗ trợ phát triển như thế này, vì về mặt kỹ thuật nó không phải là một phần của chương trình nghiên cứu của tôi ...
Ben Bolker

4

Một hỗn hợp của một câu trả lời và bình luận / câu hỏi khác:

Tôi đã trang bị bộ dữ liệu 'đồ chơi' với ba lựa chọn tối ưu hóa khác nhau. (* Lưu ý 1: có thể hữu ích hơn cho các mục đích so sánh để tạo một bộ dữ liệu nhỏ bằng cách lấy mẫu từ bên trong mỗi năm và id, thay vì lấy mẫu các biến nhóm. đặc biệt tốt với một số lượng nhỏ các mức biến nhóm như vậy. Bạn có thể thực hiện việc này thông qua một số thứ như:

library(plyr)
subdata <- ddply(fulldata,c("year","id"),
    function(x) x[sample(nrow(x),size=round(nrow(x)*0.1)),])

Mã hàng loạt phù hợp:

Ntoy <- readRDS("Newton_toy.RDS")
library(lme4)
fitfun <- function(opt) {
    tt <- system.time(fit1 <- glmer(use ~  ps + th + rs + hw +
                                    (1 + ps + th + rs + hw |id/year),
                                    family = binomial, data = Ntoy,
                                    control=glmerControl(optimizer=opt),
                                    verbose=100))
    return(list(time=tt,fit=fit1))
}

opts <- c("nloptwrap","nlminbwrap","bobyqa")
## use for() instead of lapply so we can checkpoint more easily
res <- setNames(vector("list",length(opts)),opts)
for (i in opts) {
    res[[i]] <- fitfun(i)
    save("res",file="Newton_batch.RData")
}

Sau đó tôi đọc kết quả trong một phiên mới:

load("Newton_batch.RData")
library(lme4)

Thời gian trôi qua và lệch lạc:

cbind(time=unname(sapply(res,function(x) x$time["elapsed"])),
          dev=sapply(res,function(x) deviance(x$fit)))
##                time      dev
## nloptwrap  1001.824 6067.706
## nlminbwrap 3495.671 6068.730
## bobyqa     4945.332 6068.731

Các độ lệch này thấp hơn đáng kể so với độ lệch được báo cáo bởi OP từ R (6101.7) và thấp hơn một chút so với độ lệch được báo cáo bởi OP từ SAS (6078.9), mặc dù so sánh độ lệch giữa các gói không phải lúc nào cũng hợp lý.

Tôi thực sự ngạc nhiên khi SAS chỉ hội tụ trong khoảng 100 đánh giá chức năng!

Thời gian từ 17 phút ( nloptwrap) đến 80 phút ( bobyqa) trên Macbook Pro, phù hợp với trải nghiệm của OP. Deviance là một chút tốt hơn cho nloptwrap.

round(cbind(sapply(res,function(x) fixef(x$fit))),3)
##             nloptwrap nlminbwrap bobyqa
## (Intercept)    -5.815     -5.322 -5.322
## ps             -0.989      0.171  0.171
## th             -0.033     -1.342 -1.341
## rs              1.361     -0.140 -0.139
## hw             -2.100     -2.082 -2.082

Câu trả lời xuất hiện khá khác nhau với nloptwrap- mặc dù các lỗi tiêu chuẩn khá lớn ...

round(coef(summary(res[[1]]$fit)),3)
##             Estimate Std. Error z value Pr(>|z|)
## (Intercept)   -5.815      0.750  -7.750    0.000
## ps            -0.989      1.275  -0.776    0.438
## th            -0.033      2.482  -0.013    0.989
## rs             1.361      2.799   0.486    0.627
## hw            -2.100      0.490  -4.283    0.000

(mã ở đây đưa ra một số cảnh báo về year:idviệc tôi nên theo dõi)

Còn tiếp ... ?


nó sẽ hữu ích hơn nếu tôi gửi cho bạn bộ dữ liệu đầy đủ? Vấn đề duy nhất là sự hội tụ mất khoảng 9 giờ với bộ dữ liệu đầy đủ, vì vậy đề xuất của bạn về lấy mẫu là một điều tốt. Tôi đã cố gắng chuyển đổi dữ liệu bằng một chuyển đổi nhật ký, nhưng âm mưu còn lại vẫn còn xấu xí - bạn có nghĩ rằng biểu đồ còn lại giải thích một phần của vấn đề với những dữ liệu này không? Cuối cùng - kết quả của bạn trong SAS có giống với R không?
Nova
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.