ทำไมฉันไม่สามารถจับคู่เอาต์พุต glmer (family = binomial) กับการใช้งานอัลกอริทึม Gauss-Newton ด้วยตนเองได้?


15

ฉันต้องการจับคู่ผลลัพธ์ของ lmer (ดูดีขึ้นจริง ๆ ) กับตัวอย่างของเล่นทวินาม ฉันอ่านบทความสั้น ๆ และเชื่อว่าฉันเข้าใจว่าเกิดอะไรขึ้น

แต่เห็นได้ชัดว่าฉันทำไม่ได้ หลังจากติดขัดฉันได้แก้ไข "ความจริง" ในแง่ของเอฟเฟกต์แบบสุ่มและไปหลังจากประเมินค่าของผลกระทบคงที่เพียงอย่างเดียว ฉันรวมรหัสนี้ไว้ด้านล่าง หากต้องการดูว่าถูกต้องคุณสามารถแสดงความคิดเห็น+ Z %*% b.kและมันจะตรงกับผลลัพธ์ของ glm ปกติ ฉันหวังว่าจะยืมพลังสมองบางส่วนเพื่อหาสาเหตุที่ฉันไม่สามารถจับคู่ผลลัพธ์ของ lmer เมื่อรวมเอฟเฟกต์แบบสุ่ม

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

คำตอบ:


28

หากคุณเปลี่ยนคำสั่งการปรับพอดีแบบเป็นวิธีการจับคู่ของคุณจะทำงาน:

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

การเปลี่ยนแปลงที่สำคัญคือการnAGQ = 0ซึ่งตรงกับวิธีการของคุณในขณะที่เริ่มต้น ( nAGQ = 1) ไม่ได้ nAGQหมายถึง 'จำนวนของคะแนนการสร้างพื้นที่สี่เหลี่ยมจัตุรัส Gauss-Hermite ที่ปรับได้' และกำหนดวิธีที่glmerจะรวมเอฟเฟกต์แบบสุ่มเมื่อติดตั้งแบบจำลองผสม เมื่อnAGQมีค่ามากกว่า 1 จะใช้การสร้างพื้นที่สี่เหลี่ยมจัตุรัสกับnAGQจุด เมื่อnAGQ = 1ใดการประมาณ Laplace จะถูกใช้และเมื่อใดnAGQ = 0อินทิกรัลจะถูก 'ละเว้น' โดยไม่เจาะจงเกินไป (และอาจจะเป็นเทคนิคเกินไป) nAGQ = 0หมายความว่าเอฟเฟ็กต์แบบสุ่มมีผลต่อการประมาณค่าของเอฟเฟกต์คงที่ผ่านโหมดตามเงื่อนไขที่ประเมินเท่านั้น - ดังนั้นnAGQ = 0ไม่ได้อธิบายถึงการสุ่มของเอฟเฟกต์ทั้งหมด ในการอธิบายถึงเอฟเฟกต์แบบสุ่มพวกเขาจำเป็นต้องรวมเข้าด้วยกัน อย่างไรก็ตามในขณะที่คุณค้นพบความแตกต่างระหว่างnAGQ = 0และnAGQ = 1มักจะมีขนาดค่อนข้างเล็ก

nAGQ > 0วิธีการจับคู่ของคุณจะไม่ทำงานกับ นี่เป็นเพราะในกรณีเหล่านี้มีสามขั้นตอนในการปรับให้เหมาะสม: (1) ลงโทษน้ำหนักซ้ำอย่างน้อยกำลังสองน้อยที่สุด (PIRLS) เพื่อประเมินโหมดเงื่อนไขของเอฟเฟกต์แบบสุ่ม (2) (โดยประมาณ) รวมเอฟเฟกต์แบบสุ่ม และ (3) การปรับให้เหมาะสมแบบไม่เชิงเส้นของฟังก์ชันวัตถุประสงค์ (เช่นผลลัพธ์ของการรวม) ขั้นตอนเหล่านี้จะวนซ้ำจนกว่าจะบรรจบกัน คุณเพียงแค่ทำการรีรันสแควร์ (IRLS) ที่มีน้ำหนักน้อยซ้ำ ๆ ซ้ำ ๆ ซึ่งถือว่าbเป็นที่รู้จักและวางZ%*%bในระยะออฟเซ็ต วิธีการของคุณจะเทียบเท่ากับ PIRLS แต่ความเท่าเทียมนี้มีไว้เพียงเพราะคุณใช้glmerเพื่อรับโหมดตามเงื่อนไขโดยประมาณ (ซึ่งคุณไม่ทราบเป็นอย่างอื่น)

ขออภัยหากนี่ไม่ได้อธิบายได้ดี แต่ไม่ใช่หัวข้อที่ให้คำอธิบายอย่างรวดเร็ว คุณอาจพบว่า https://github.com/lme4/lme4pureRมีประโยชน์ซึ่งเป็นการนำlme4แนวทาง(ไม่สมบูรณ์) ไปใช้ในรหัส R บริสุทธิ์ lme4pureRถูกออกแบบมาให้อ่านง่ายกว่าlme4ตัวมันเอง (แม้ว่าช้ากว่ามาก)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.