Thuật toán tối ưu hóa nào được sử dụng trong hàm glm trong R?


17

Người ta có thể thực hiện hồi quy logit trong R bằng cách sử dụng mã như vậy:

> library(MASS)
> data(menarche)
> glm.out = glm(cbind(Menarche, Total-Menarche) ~ Age,
+                                              family=binomial(logit), data=menarche)
> coefficients(glm.out)
(Intercept)         Age 
 -21.226395    1.631968

Có vẻ như thuật toán tối ưu hóa đã hội tụ - có thông tin về số bước của thuật toán chấm điểm câu cá:

Call:
glm(formula = cbind(Menarche, Total - Menarche) ~ Age, family = binomial(logit), 
    data = menarche)

Deviance Residuals: 
    Min       1Q   Median       3Q      Max  
-2.0363  -0.9953  -0.4900   0.7780   1.3675  

Coefficients:
             Estimate Std. Error z value Pr(>|z|)    
(Intercept) -21.22639    0.77068  -27.54   <2e-16 ***
Age           1.63197    0.05895   27.68   <2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1   1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 3693.884  on 24  degrees of freedom
Residual deviance:   26.703  on 23  degrees of freedom
AIC: 114.76

Number of Fisher Scoring iterations: 4

Tôi tò mò về thuật toán tối ưu nó là gì? Có phải là thuật toán Newton-Raphson (giảm độ dốc bậc hai) không? Tôi có thể đặt một số tham số để sử dụng thuật toán Cauchy (giảm độ dốc bậc một) không?


5
Bạn có phiền trích dẫn nơi thuật toán Newton-Raphson được gọi là "độ dốc gốc II" không?
Vách đá AB

4
Bản thân điểm FIsher có liên quan đến, nhưng khác với Newton-Raphson, về hiệu quả thay thế Hessian bằng giá trị dự kiến ​​của nó theo mô hình.
Glen_b -Reinstate Monica

@CliffAB sory. Tôi nghĩ rằng đó Newton's methodlà một phương pháp giảm độ dốc bậc hai.
Marcin Kosiński

1
@ hxd1011, bạn không nên chỉnh sửa để thay đổi câu hỏi của người khác. Đó là một điều cần chỉnh sửa khi bạn nghĩ rằng bạn hiểu ý của họ, nhưng câu hỏi của họ không rõ ràng (có lẽ tiếng Anh không phải là ngôn ngữ mẹ đẻ của họ, vd), nhưng bạn không nên làm cho câu hỏi của họ khác đi (ví dụ chung chung hơn) so với họ muốn. Thay vào đó, hãy đặt một câu hỏi mới với những gì bạn muốn. Tôi đang chỉnh sửa lại.
gung - Phục hồi Monica

1
@ MarcinKosiński Phương pháp của Newton Newton-Raphson, Raphson chỉ được xây dựng trên ý tưởng của Newton cho một trường hợp tổng quát hơn.
AdamO

Câu trả lời:


19

Bạn sẽ thấy thú vị khi biết rằng tài liệu cho glm, được truy cập thông qua ?glmcung cấp nhiều thông tin chi tiết hữu ích: theo methodchúng tôi thấy rằng bình phương tối thiểu lặp lại là phương thức mặc định cho glm.fit, đó là hàm workhorse cho glm. Ngoài ra, tài liệu đề cập rằng các chức năng do người dùng xác định có thể được cung cấp ở đây, thay vì mặc định.


3
Bạn cũng có thể chỉ cần gõ tên hàm glmhoặc fit.glmtại Rdấu nhắc để nghiên cứu mã nguồn.
Matthew Drury

@MatthewDrury Tôi nghĩ rằng bạn có nghĩa là ngựa thồ glm.fitmà sẽ không được hoàn toàn tái sản xuất vì nó dựa trên mã C C_Cdqrls.
AdamO

Yah, bạn nói đúng, tôi trộn thứ tự trong R rất nhiều. Bạn có nghĩa là không tái sản xuất mặc dù?
Matthew Drury

16

Phương thức được sử dụng được đề cập trong chính đầu ra: đó là Ghi điểm. Điều này tương đương với Newton-Raphson trong hầu hết các trường hợp. Ngoại lệ là các tình huống mà bạn đang sử dụng các tham số hóa không tự nhiên. Hồi quy rủi ro tương đối là một ví dụ về kịch bản như vậy. Ở đó, thông tin dự kiến ​​và quan sát là khác nhau. Nhìn chung, Newton Raphson và Fisher chấm điểm cho kết quả gần như giống hệt nhau.

pp(1-p)Chấm điểm. Ngoài ra, nó cung cấp một số trực giác tốt cho thuật toán EM, một khung tổng quát hơn để ước tính các khả năng phức tạp.

Trình tối ưu hóa chung mặc định trong R sử dụng các phương thức số để ước tính giây thứ hai, về cơ bản dựa trên tuyến tính hóa (hãy cảnh giác với lời nguyền của chiều). Vì vậy, nếu bạn quan tâm đến việc so sánh hiệu quả và thiên vị, bạn có thể thực hiện một thói quen khả năng tối đa logistic ngây thơ với một cái gì đó như

set.seed(1234)
x <- rnorm(1000)
y <- rbinom(1000, 1, exp(-2.3 + 0.1*x)/(1+exp(-2.3 + 0.1*x)))
f <- function(b) {
  p <- exp(b[1] + b[2]*x)/(1+exp(b[1] + b[2]*x))
  -sum(dbinom(y, 1, p, log=TRUE))
}
ans <- nlm(f, p=0:1, hessian=TRUE)

đưa cho tôi

> ans$estimate
[1] -2.2261225  0.1651472
> coef(glm(y~x, family=binomial))
(Intercept)           x 
 -2.2261215   0.1651474 

sự khác biệt so với phương pháp gradient / newton / BFGS là gì? Tôi nghĩ bạn giải thích, nhưng tôi không hoàn toàn làm theo.
Haitao Du

@ hxd1011 xem "Phương pháp số cho tối ưu hóa không giới hạn và phương trình phi tuyến" Dennis, JE và Schnabel, RB
AdamO

1
@ hxd1011 theo như tôi có thể nói, Newton Raphson không yêu cầu hoặc ước tính một Hessian trong các bước. Phương pháp Newton-Type trong nlmước tính độ dốc số lượng sau đó áp dụng Newton Raphson. Trong BFGS tôi nghĩ rằng độ dốc được yêu cầu như với Newton Raphson, nhưng các bước liên tiếp được đánh giá bằng cách sử dụng xấp xỉ bậc hai, đòi hỏi phải ước tính Hessian. BFGS là tốt cho tối ưu hóa phi tuyến tính cao. Nhưng đối với GLM, họ thường cư xử rất tốt.
AdamO

2
Câu trả lời hiện có đề cập đến "bình phương lặp lại tối thiểu", làm thế nào để nhập hình ảnh, so với các thuật toán bạn đề cập ở đây?
amip nói rằng Phục hồi lại

@AdamO bạn có thể giải quyết ý kiến ​​của amip không? Cảm ơn
Haitao Du

1

Đối với bản ghi, việc triển khai R đơn giản của thuật toán glm R, dựa trên tính điểm của Fisher (bình phương tối thiểu lặp lại), như được giải thích trong câu trả lời khác được đưa ra bởi:

glm_irls = function(X, y, weights=rep(1,nrow(X)), family=poisson(log), maxit=25, tol=1e-16) {
    if (!is(family, "family")) family = family()
    variance = family$variance
    linkinv = family$linkinv
    mu.eta = family$mu.eta
    etastart = NULL

    nobs = nrow(X)    # needed by the initialize expression below
    nvars = ncol(X)   # needed by the initialize expression below
    eval(family$initialize) # initializes n and fitted values mustart
    eta = family$linkfun(mustart) # we then initialize eta with this
    dev.resids = family$dev.resids
    dev = sum(dev.resids(y, linkinv(eta), weights))
    devold = 0
    beta_old = rep(1, nvars)

    for(j in 1:maxit)
    {
      mu = linkinv(eta) 
      varg = variance(mu)
      gprime = mu.eta(eta)
      z = eta + (y - mu) / gprime # potentially -offset if you would have an offset argument as well
      W = weights * as.vector(gprime^2 / varg)
      beta = solve(crossprod(X,W*X), crossprod(X,W*z), tol=2*.Machine$double.eps)
      eta = X %*% beta # potentially +offset if you would have an offset argument as well
      dev = sum(dev.resids(y, mu, weights))
      if (abs(dev - devold) / (0.1 + abs(dev)) < tol) break
      devold = dev
      beta_old = beta
    }
    list(coefficients=t(beta), iterations=j)
}

Thí dụ:

## Dobson (1990) Page 93: Randomized Controlled Trial :
y <- counts <- c(18,17,15,20,10,20,25,13,12)
outcome <- gl(3,1,9)
treatment <- gl(3,3)
X <- model.matrix(counts ~ outcome + treatment)

coef(glm.fit(x=X, y=y, family = poisson(log))) 
  (Intercept)      outcome2      outcome3    treatment2    treatment3 
 3.044522e+00 -4.542553e-01 -2.929871e-01 -7.635479e-16 -9.532452e-16

coef(glm_irls(X=X, y=y, family=poisson(log)))
     (Intercept)   outcome2   outcome3    treatment2   treatment3
[1,]    3.044522 -0.4542553 -0.2929871 -3.151689e-16 -8.24099e-16

Một cuộc thảo luận tốt về các thuật toán phù hợp GLM, bao gồm so sánh với Newton-Raphson (sử dụng Hessian được quan sát trái ngược với Hessian dự kiến ​​trong thuật toán IRLS) và các thuật toán lai (bắt đầu bằng IRLS, vì chúng dễ khởi tạo hơn, nhưng sau đó kết thúc với tối ưu hóa hơn nữa bằng cách sử dụng Newton-Raphson) trong cuốn sách "Các mô hình tuyến tính tổng quát và các phần mở rộng" của James W. Hardin & Joseph M. Hilbe .

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.