R'de glm fonksiyonunda hangi optimizasyon algoritması kullanılır?


17

Böyle bir kodu kullanarak R'de bir logit regresyonu gerçekleştirilebilir:

> 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

Optimizasyon algoritmasının birleştiği anlaşılıyor - balıkçı puanlama algoritmasının adım sayısı hakkında bilgi var:

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

Hangi optim algoritmasının olduğunu merak ediyorum? Newton-Raphson algoritması mı (ikinci dereceden gradyanlı iniş)? Cauchy algoritmasını kullanmak için bazı parametreler ayarlayabilir miyim (birinci dereceden gradyan inişi)?


5
Bir Newton-Raphson algoritmasına "gradyan iniş seviye II" olarak atıfta bulunulduğunu belirtmek ister misiniz?
Cliff AB

4
Kendini puanlayan FIsher, Newton-Raphson'dan farklıdır, aslında Hessian'ın model altında beklenen değeri ile değiştirilmesidir.
Glen_b

@CliffAB özür dilerim. Bu Newton's methodikinci dereceden gradyan iniş yöntemidir.
Marcin Kosiński

1
@ hxd1011, başka birinin sorusunu değiştirmek için düzenlememelisiniz. Ne anlama geldiğini bildiğinizi düşündüğünüzde düzenlemek bir şeydir, ancak soruları belirsizdir (belki İngilizce ana dili değildir, örneğin), ancak sorularını olduğundan daha farklı yapmamalısınız (örneğin, daha genel) aranan. Bunun yerine, ne istediğinizle ilgili yeni bir soru sorun. Düzenlemeyi geri alıyorum.
gung - Monica'yı eski

1
@ MarcinKosiński Newton yöntemi olup yalnızca daha genel bir durum için Newton fikirleri üzerine inşa Newton-Raphson, Raphson.
AdamO

Yanıtlar:


19

Aşağıdakiler için belgeler olduğunu bilmek isteyecektir glmüzerinden erişilebilir, ?glmaltında: birçok yararlı bilgiler sağlar methodbiz bu tekrarlı yeniden ağırlıklandırmalı en kareler bulmak için varsayılan yöntemidir glm.fitiçin beygir fonksiyonudur, glm. Ayrıca, dokümantasyon burada varsayılan yerine kullanıcı tanımlı işlevlerin sağlanabileceğinden bahseder.


3
Ayrıca, sadece işlev adını yazabilirsiniz glmveya fit.glmen Ristemi kaynak kodunu incelemek için.
Matthew Drury

@MatthewDrury Sanırım glm.fitC koduna dayandığı için tamamen tekrarlanamayacak olan iş atını kastediyorsunuz C_Cdqrls.
AdamO

Yah, haklısın, R'deki düzeni çok karıştırıyorum. Yine de tekrarlanamaz demek ne demek?
Matthew Drury

16

Kullanılan yöntem çıktının kendisinde belirtilir: Fisher Scoring. Bu çoğu durumda Newton-Raphson'a eşdeğerdir. İstisna, doğal olmayan parametrelendirmeler kullandığınız durumlardır. Göreceli risk gerilemesi böyle bir senaryoya bir örnektir. Orada beklenen ve gözlemlenen bilgiler farklıdır. Genel olarak, Newton Raphson ve Fisher Scoring neredeyse aynı sonuçları verir.

pp(1p) Fisher Puanlaması . Ek olarak, karmaşık olasılıkları tahmin etmek için daha genel bir çerçeve olan EM algoritmasına bazı güzel sezgi verir.

R'deki varsayılan genel iyileştirici, temel olarak bir doğrusallaştırmaya dayanarak ikinci bir anı tahmin etmek için sayısal yöntemler kullanır (boyutsallığın lanetine karşı dikkatli olun). Verimliliği ve önyargıyı karşılaştırmakla ilgileniyorsanız, naif bir lojistik maksimum olabilirlik rutini gibi bir şeyle uygulayabilirsiniz.

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)

bana verir

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

degrade iyi / newton yöntemi / BFGS ile karşılaştırıldığında fark nedir? Sanırım açıkladın, ama pek takip etmiyorum.
Haitao Du

@ hxd1011 bkz. "Kısıtsız Optimizasyon ve Doğrusal Olmayan Denklemler için Sayısal Yöntemler" Dennis, JE ve Schnabel, RB
AdamO

1
hxd1011 anlayabildiğim kadarıyla Newton Raphson adımlarda bir Hessian gerektirmiyor ya da tahmin etmiyor. nlmDegradeyi sayısal olarak tahmin ederken Newton-Tipi yöntemi Newton Raphson'u uygular. BFGS'de gradyanın Newton Raphson'da olduğu gibi gerekli olduğunu düşünüyorum, ancak ardışık adımlar Hessian'ın bir tahminini gerektiren ikinci bir sıra yaklaşımı kullanılarak değerlendirildi. BFGS, yüksek derecede doğrusal olmayan optimizasyonlar için iyidir. Ancak GLM'ler için genellikle çok iyi davranırlar.
AdamO

2
Mevcut cevap "yinelemeli olarak tekrarlanan en küçük kareler" denen, burada bahsettiğiniz algoritmalarla karşılaştırıldığında, bu resme nasıl giriyor?
amip, Reinstate Monica'nın

@AdamO amoeba'nın yorumlarını ele alabilir misiniz? Teşekkürler
Haitao Du

1

Kayıt için, diğer cevapta açıklandığı gibi, Fisher puanlamasına (iteratif olarak yeniden ağırlıklandırılmış en küçük kareler) dayalı R'nin glm algoritmasının basit bir saf R uygulaması:

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

Misal:

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

Newton-Raphson (IRLS algoritmasında beklenen Hessian'ın aksine gözlemlenen Hessian'ı kullanan) ve hibrid algoritmalarla (bunların başlatılması daha kolay olduğu için IRLS ile başlayan) karşılaştırması da dahil olmak üzere GLM uydurma algoritmaları hakkında iyi bir tartışma. Newton-Raphson kullanarak daha fazla optimizasyon ile tamamlama) James W. Hardin ve Joseph M. Hilbe tarafından yazılan "Genelleştirilmiş Doğrusal Modeller ve Uzantılar" kitabında bulunabilir .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.