Qual algoritmo de otimização é usado na função glm em R?


17

Pode-se executar uma regressão logit em R usando esse código:

> 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

Parece que o algoritmo de otimização convergiu - há informações sobre o número das etapas do algoritmo de pontuação do fisher:

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

Estou curioso sobre o algoritmo de otimização que é. É o algoritmo de Newton-Raphson (descida gradiente de segunda ordem)? Posso definir alguns parâmetros para usar o algoritmo de Cauchy (descida gradiente de primeira ordem)?


5
Você se importa em citar onde um algoritmo de Newton-Raphson é chamado de "gradiente descendente nível II"?
Cliff AB

4
A pontuação do próprio FIsher está relacionada, mas diferente de Newton-Raphson, na verdade substituindo o Hessian pelo seu valor esperado no modelo.
Glen_b -Reinstala Monica

@CliffAB sory. I mento que Newton's methodé um segundo método de gradiente descendente ordem.
Marcin Kosiński 25/10

1
@ hxd1011, você não deve editar para alterar a pergunta de outra pessoa. Uma coisa é editar quando você pensa que sabe o que elas significam, mas a pergunta delas não é clara (talvez o inglês não seja a língua nativa, por exemplo), mas você não deve diferenciar a pergunta (por exemplo, mais geral) do que elas tinham. procurado. Em vez disso, faça uma nova pergunta com o que você deseja. Estou revertendo a edição.
gung - Restabelece Monica

1
@ MarcinKosiński O método de Newton é Newton-Raphson, Raphson apenas construído sobre as idéias de Newton para um caso mais geral.
AdamO 08/07/16

Respostas:


19

Você ficará interessado em saber que a documentação para glm, acessada via, ?glmfornece muitas informações úteis: em methodque descobrimos que mínimos quadrados com ponderação iterativa é o método padrão para glm.fit, que é a função de burro de carga glm. Além disso, a documentação menciona que funções definidas pelo usuário podem ser fornecidas aqui, em vez do padrão.


3
Você também pode apenas digitar o nome da função glmou fit.glmno Rprompt para estudar o código-fonte.
Matthew Drury

@MatthewDrury Eu acho que você quer dizer o burro de carga glm.fitque não será totalmente reprodutível, uma vez que se baseia em código C C_Cdqrls.
AdamO 08/07/19

Sim, você está certo, eu misturo muito o pedido em R. O que você quer dizer com não reproduzível?
Matthew Drury

16

O método usado é mencionado na própria saída: é Fisher Scoring. Isso é equivalente a Newton-Raphson na maioria dos casos. A exceção são as situações em que você está usando parametrizações não naturais. A regressão de risco relativo é um exemplo desse cenário. Lá, as informações esperadas e observadas são diferentes. Em geral, Newton Raphson e Fisher Scoring fornecem resultados quase idênticos.

pp(1-p)Pontuação de Fisher. Além disso, fornece uma boa intuição ao algoritmo EM, que é uma estrutura mais geral para estimar probabilidades complicadas.

O otimizador geral padrão em R usa métodos numéricos para estimar um segundo momento, basicamente com base em uma linearização (desconfie da maldição da dimensionalidade). Portanto, se você estiver interessado em comparar a eficiência e o viés, poderá implementar uma rotina ingênua de máxima verossimilhança logística com algo como

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)

me dá

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

qual é a diferença em comparação com um gradiente decente / método de newton / BFGS? Eu acho que você explicou, mas eu não sou muito sincero.
Haitao Du 08/07

@ hxd1011 ver "Métodos Numéricos para Unconstrained Optimization e Nonlinear Equations" Dennis, JE e Schnabel, RB
Adamo

1
@ hxd1011 até onde sei, Newton Raphson não exige nem estima um hessiano nas etapas. O método Newton-Type nlmestima o gradiente numericamente e aplica Newton Raphson. No BFGS, acho que o gradiente é necessário, como acontece com Newton Raphson, mas etapas sucessivas são avaliadas usando uma aproximação de segunda ordem que requer uma estimativa do Hessiano. O BFGS é bom para otimizações altamente não lineares. Mas para os GLMs, eles geralmente são muito bem comportados.
AdamO 08/07/19

2
A resposta existente mencionou "mínimos quadrados ponderados iterativamente", como isso entra em cena, comparado aos algoritmos que você mencionou aqui?
Ameba diz Reinstate Monica

@AdamO você poderia abordar os comentários de ameba? Obrigado
Haitao Du 11/16

1

Para o registro, uma implementação simples e pura de R do algoritmo glm de R, com base na pontuação de Fisher (mínimos quadrados ponderados iterativamente), conforme explicado na outra resposta, é dada por:

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

Exemplo:

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

Uma boa discussão dos algoritmos de ajuste GLM, incluindo uma comparação com Newton-Raphson (que usa o Hessian observado em oposição ao esperado Hessian no algoritmo IRLS) e algoritmos híbridos (que começam com IRLS, pois são mais fáceis de inicializar, mas depois pode ser encontrada no livro "Generalized Linear Models and Extensions", de James W. Hardin e Joseph M. Hilbe .

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.