Quale algoritmo di ottimizzazione viene utilizzato nella funzione glm in R?


17

È possibile eseguire una regressione del log in R utilizzando tale codice:

> 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

Sembra che l'algoritmo di ottimizzazione sia converto - ci sono informazioni sul numero di passaggi dell'algoritmo di punteggio del pescatore:

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

Sono curioso di sapere cos'è l'algoritmo ottimizzato? È l'algoritmo di Newton-Raphson (discesa del gradiente del secondo ordine)? Posso impostare alcuni parametri per utilizzare l'algoritmo di Cauchy (discesa del gradiente del primo ordine)?


5
Ti dispiace citare un algoritmo di Newton-Raphson chiamato "gradiente di discesa II"?
Cliff AB,

4
Il punteggio di FIsher stesso è correlato, ma diverso da Newton-Raphson, in effetti sostituendo l'Assia con il suo valore atteso secondo il modello.
Glen_b -Restinata Monica,

@CliffAB sory. Cito che Newton's methodè un metodo di discesa del gradiente del secondo ordine.
Marcin Kosiński,

1
@ hxd1011, non modificare per cambiare la domanda di qualcun altro. È una cosa da modificare quando pensi di sapere cosa significano, ma la loro domanda non è chiara (forse l'inglese non è la loro lingua madre, ad esempio), ma non dovresti rendere la loro domanda diversa (ad esempio, più generale) di quanto non avessero ricercato. Invece, fai una nuova domanda con quello che vuoi. Sto ripristinando la modifica.
gung - Ripristina Monica

1
@MarcinKosiński Il metodo di Newton è Newton-Raphson, Raphson si è semplicemente basato sulle idee di Newton per un caso più generale.
AdamO,

Risposte:


19

Sarai interessato a sapere che la documentazione a cui si glmaccede tramite ?glmfornisce molte informazioni utili: sotto methodtroviamo che i minimi quadrati reimpegnati iterativamente sono il metodo predefinito per glm.fit, che è la funzione cavallo di battaglia per glm. Inoltre, la documentazione menziona che le funzioni definite dall'utente possono essere fornite qui, anziché quelle predefinite.


3
Puoi anche semplicemente digitare il nome della funzione glmo fit.glmal Rprompt per studiare il codice sorgente.
Matthew Drury,

@MatthewDrury Credo che si intende il cavallo di battaglia glm.fitche non sarà del tutto riproducibile dato che si basa sul codice C C_Cdqrls.
AdamO,

Sì, hai ragione, mescolo molto l'ordine in R. Cosa vuoi dire non riproducibile però?
Matthew Drury,

16

Il metodo utilizzato è menzionato nell'output stesso: è Fisher Scoring. Questo è equivalente a Newton-Raphson nella maggior parte dei casi. L'eccezione è rappresentata dalle situazioni in cui si stanno utilizzando parametrizzazioni non naturali. La regressione del rischio relativo è un esempio di tale scenario. Lì, le informazioni previste e osservate sono diverse. In generale, Newton Raphson e Fisher Scoring danno risultati quasi identici.

pp(1-p)Punteggio Fisher. Inoltre, fornisce una buona intuizione all'algoritmo EM che è un quadro più generale per la stima di probabilità complicate.

L'ottimizzatore generale predefinito in R utilizza metodi numerici per stimare un secondo momento, fondamentalmente basato su una linearizzazione (diffidare della maledizione della dimensionalità). Quindi, se tu fossi interessato a confrontare l'efficienza e la distorsione, potresti implementare una routine ingenua di massima verosimiglianza logistica con qualcosa di simile

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)

mi da

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

qual è la differenza rispetto a un gradiente decente / metodo di newton / BFGS? Penso che tu abbia spiegato, ma non sono del tutto seguito.
Haitao Du

@ hxd1011 vedi "Metodi numerici per l'ottimizzazione non vincolata e le equazioni non lineari" Dennis, JE e Schnabel, RB
AdamO

1
@ hxd1011 per quanto ne so, Newton Raphson non richiede o stima un hessiano nei passaggi. Il metodo Newton-Type nlmstima numericamente il gradiente, quindi applica Newton Raphson. In BFGS penso che il gradiente sia richiesto come con Newton Raphson, ma i passaggi successivi vengono valutati usando un'approssimazione del secondo ordine che richiede una stima dell'Assia. BFGS è buono per ottimizzazioni altamente non lineari. Ma per i GLM, di solito si comportano molto bene.
AdamO,

2
La risposta esistente menzionava "minimi quadrati ripetutamente reiterati", come si inserisce l'immagine, rispetto agli algoritmi che hai citato qui?
ameba dice Ripristina Monica l'

@AdamO potresti rispondere ai commenti di amoeba? Grazie
Haitao Du

1

Per la cronaca, una semplice implementazione R pura dell'algoritmo glm di R, basata sul punteggio di Fisher (minimi quadrati ripetutamente pesati), come spiegato nell'altra risposta è data da:

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

Esempio:

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

Una buona discussione sugli algoritmi di adattamento GLM, incluso un confronto con Newton-Raphson (che utilizza l'Assia osservata al contrario dell'atteso Assia nell'algoritmo IRLS) e algoritmi ibridi (che iniziano con IRLS, poiché questi sono più facili da inizializzare, ma poi terminare con un'ulteriore ottimizzazione utilizzando Newton-Raphson) può essere trovato nel libro "Modelli ed estensioni lineari generalizzati" di James W. Hardin e Joseph M. Hilbe .

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.