Tại sao tôi không thể kết hợp đầu ra glmer (gia đình = nhị thức) với triển khai thủ công thuật toán Gauss-Newton?


15

Tôi muốn kết hợp các đầu ra của lmer (thực sự lấp lánh) với một ví dụ nhị thức đồ chơi. Tôi đã đọc các họa tiết và tin rằng tôi hiểu những gì đang xảy ra.

Nhưng rõ ràng là tôi không. Sau khi bị mắc kẹt, tôi đã sửa "sự thật" về các hiệu ứng ngẫu nhiên và đi sau khi ước tính các hiệu ứng cố định một mình. Tôi đang bao gồm mã này bên dưới. Để thấy rằng nó hợp pháp, bạn có thể nhận xét + Z %*% b.kvà nó sẽ khớp với kết quả của một glm thông thường. Tôi hy vọng sẽ mượn một số năng lực để tìm ra lý do tại sao tôi không thể phù hợp với đầu ra của lmer khi bao gồm các hiệu ứng ngẫu nhiên.

# Setup - hard coding simple data set 
df <- data.frame(x1 = rep(c(1:5), 3), subject = sort(rep(c(1:3), 5)))
df$subject <- factor(df$subject)

# True coefficient values  
beta <- matrix(c(-3.3, 1), ncol = 1) # Intercept and slope, respectively 
u <- matrix(c(-.5, .6, .9), ncol = 1) # random effects for the 3 subjects 

# Design matrices Z (random effects) and X (fixed effects)
Z <- model.matrix(~ 0 + factor(subject), data = df)
X <- model.matrix(~ 1 + x1, data = df)

# Response  
df$y <- c(1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 0, 1, 0, 1, 1)
    y <- df$y

### Goal: match estimates from the following lmer output! 
library(lme4)
my.lmer <- lmer( y ~ x1 + (1 | subject), data = df, family = binomial)
summary(my.lmer)
ranef(my.lmer)

### Matching effort STARTS HERE 

beta.k <- matrix(c(-3, 1.5), ncol = 1) # Initial values (close to truth)
b.k <- matrix(c(1.82478, -1.53618, -.5139356), ncol = 1) # lmer's random effects

# Iterative Gauss-Newton algorithm
for (iter in 1:6) {
  lin.pred <- as.numeric(X %*% beta.k +  Z %*% b.k)
  mu.k <- plogis(lin.pred)
  variances <- mu.k * (1 - mu.k)
  W.k <- diag(1/variances)

  y.star <- W.k^(.5) %*% (y - mu.k)
  X.star <- W.k^(.5) %*% (variances * X)
  delta.k <- solve(t(X.star) %*% X.star) %*% t(X.star) %*% y.star

  # Gauss-Newton Update 
  beta.k <- beta.k + delta.k
  cat(iter, "Fixed Effects: ", beta.k, "\n")
}

Câu trả lời:


28

Nếu bạn thay đổi lệnh phù hợp mô hình của mình thành như sau, cách tiếp cận phù hợp của bạn sẽ hoạt động:

my.lmer <- glmer(y ~ x1 + (1 | subject), data = df, family = binomial, nAGQ = 0)

Thay đổi chính là nAGQ = 0, phù hợp với cách tiếp cận của bạn, trong khi mặc định ( nAGQ = 1) thì không. nAGQcó nghĩa là 'số lượng điểm cầu phương Gauss-Hermite thích nghi' và đặt cách glmertích hợp các hiệu ứng ngẫu nhiên khi lắp mô hình hỗn hợp. Khi nAGQlớn hơn 1, thì phương trình thích nghi được sử dụng với nAGQcác điểm. Khi nào nAGQ = 1, phép tính gần đúng Laplace được sử dụng và khinAGQ = 0 , tích phân bị 'bỏ qua'. Không quá cụ thể (và có lẽ quá kỹ thuật), nAGQ = 0có nghĩa là các hiệu ứng ngẫu nhiên chỉ ảnh hưởng đến ước tính của các hiệu ứng cố định thông qua các chế độ điều kiện ước tính của chúng - do đó,nAGQ = 0không hoàn toàn tính đến tính ngẫu nhiên của các hiệu ứng ngẫu nhiên. Để tính toán đầy đủ các hiệu ứng ngẫu nhiên, chúng cần được tích hợp. Tuy nhiên, khi bạn phát hiện ra sự khác biệt này giữa nAGQ = 0nAGQ = 1thường có thể khá nhỏ.

Cách tiếp cận phù hợp của bạn sẽ không làm việc với nAGQ > 0. Điều này là do trong các trường hợp này, có ba bước để tối ưu hóa: (1) bị phạt lặp lại bình phương tối thiểu (PIRLS) để ước tính các chế độ có điều kiện của các hiệu ứng ngẫu nhiên, (2) (xấp xỉ) tích hợp các hiệu ứng ngẫu nhiên về các chế độ có điều kiện của chúng và (3) tối ưu hóa phi tuyến của hàm mục tiêu (tức là kết quả của sự tích hợp). Các bước này được lặp đi lặp lại cho đến khi hội tụ. Bạn chỉ đơn giản là thực hiện một lần chạy lặp lại bình phương nhỏ nhất (IRLS), giả định đã bbiết và đưa Z%*%bvào một thuật ngữ bù. Cách tiếp cận của bạn hóa ra tương đương với PIRLS, nhưng sự tương đương này chỉ đúng vì bạn sử dụng glmerđể có được các chế độ điều kiện ước tính (mà bạn không biết nếu không).

Xin lỗi nếu điều này không được giải thích rõ, nhưng nó không phải là một chủ đề cho vay chính xác để mô tả nhanh. Bạn có thể thấy https://github.com/lme4/lme4pureR hữu ích, đây là một triển khai (chưa hoàn chỉnh) của lme4phương pháp tiếp cận trong mã R thuần túy. lme4pureRđược thiết kế để dễ đọc hơn lme4chính nó (mặc dù chậm hơn nhiều).

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.