Какой алгоритм оптимизации используется в функции glm в R?

17

Можно выполнить логит-регрессию в R, используя такой код:

> 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

Похоже, что алгоритм оптимизации сходится - есть информация о количестве шагов алгоритма Фишера:

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

Мне интересно, что это за алгоритм оптимизации? Это алгоритм Ньютона-Рафсона (градиентный спуск второго порядка)? Могу ли я установить некоторые параметры для использования алгоритма Коши (градиентный спуск первого порядка)?

Марчин Косински
источник
5
Вы не возражаете сослаться на то, где алгоритм Ньютона-Рафсона называется «уровень градиентного спуска II»?
Клифф AB
4
Сам по себе подсчет FIsher связан, но отличается от Ньютона-Рафсона, фактически заменяя гессиан его ожидаемым значением согласно модели.
Glen_b
@ CliffAB sory. Я имею в виду, что Newton's methodэто метод градиентного спуска второго порядка.
Марцин Косински,
1
@ hxd1011, вам не следует редактировать, чтобы изменить чужой вопрос. Одно дело редактировать, когда вы думаете, что знаете, что они имеют в виду, но их вопрос неясен (возможно, английский не является их родным языком, например), но вы не должны делать их вопрос другим (например, более общим), чем они имели хотел. Вместо этого задайте новый вопрос с тем, что вы хотите. Я возвращаю редактирование назад.
gung - Восстановить Монику
1
@ MarcinKosiński Метод Ньютона - это Ньютон-Рафсон, Рафсон, просто основанный на идеях Ньютона для более общего случая.
AdamO

Ответы:

19

Вам будет интересно узнать, что документация для glm , доступ к которой осуществляется через, ?glmпредоставляет много полезных идей: ниже methodмы находим, что метод наименьших квадратов с итеративным взвешиванием является методом по умолчанию для glm.fitкоторого является функцией рабочей лошадки glm. Кроме того, в документации упоминается, что пользовательские функции могут быть предоставлены здесь вместо значений по умолчанию.

Sycorax говорит восстановить Монику
источник
3
Вы также можете просто ввести имя функции glmили fit.glmв Rкомандной строке, чтобы изучить исходный код.
Мэтью Друри
@ MatthewDrury Я думаю, что вы имеете в виду рабочую лошадку, glm.fitкоторая не будет полностью воспроизводимой, поскольку она опирается на C-код C_Cdqrls.
AdamO
Да, вы правы, я много путаю порядок в R. Что ты имеешь в виду под невоспроизводимым, хотя?
Мэтью Друри
16

Используемый метод упоминается в самом выводе: это Fisher Scoring. Это эквивалентно Ньютон-Рафсону в большинстве случаев. Исключение составляют ситуации, когда вы используете ненатуральную параметризацию. Относительная регрессия риска является примером такого сценария. Там ожидаемая и наблюдаемая информация различны. В целом, Ньютон Рафсон и Фишер Скоринг дают практически одинаковые результаты.

pp(1p) . Таким образом, алгоритм строится путем оценки среднего значения в наивной модели, создания весов из прогнозируемого среднего значения, а затем переоценки среднего значения с более высокой точностью, пока не произойдет сходимость. Это, оказывается, является

Общий оптимизатор по умолчанию в R использует численные методы для оценки второго момента, в основном на основе линеаризации (опасайтесь проклятия размерности). Так что, если бы вы были заинтересованы в сравнении эффективности и предвзятости, вы могли бы реализовать наивную рутинную процедуру максимального правдоподобия с чем-то вроде

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)

дает мне

> ans$estimate
[1] -2.2261225  0.1651472
> coef(glm(y~x, family=binomial))
(Intercept)           x 
 -2.2261215   0.1651474 
Adamo
источник
Какая разница по сравнению с градиентным приличным / метод Ньютона / BFGS? Я думаю, что вы объяснили, но я не совсем понимаю.
Haitao Du
@ hxd1011 см. «Численные методы для неограниченной оптимизации и нелинейных уравнений» Деннис, JE и Schnabel, RB
AdamO
1
@ hxd1011, насколько я могу судить, Ньютон Рафсон не требует и не оценивает гессиан в шагах. Метод Ньютона-типа в nlmчисловых оценках градиента затем применяет Ньютона Рафсона. В BFGS я думаю, что градиент необходим, как с Ньютоном Рафсоном, но последовательные шаги оцениваются с использованием приближения второго порядка, которое требует оценки гессиана. BFGS хорош для высоко нелинейных оптимизаций. Но для GLM они обычно очень хорошо себя ведут.
AdamO
2
В существующем ответе упоминались «итеративно переоцененные наименьшие квадраты», как это входит в картину по сравнению с алгоритмами, которые вы упомянули здесь?
говорит амеба: восстанови Монику
@AdamO не могли бы вы прокомментировать комментарии амебы? Спасибо
Haitao Du
1

Для записи, простая чистая R-реализация алгоритма glm R, основанная на оценке Фишера (итеративно переоцененные наименьшие квадраты), как объяснено в другом ответе, дается:

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

Пример:

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

Хорошее обсуждение алгоритмов подбора GLM, включая сравнение с Ньютоном-Рафсоном (который использует наблюдаемый гессиан в отличие от ожидаемого гессиана в алгоритме IRLS) и гибридные алгоритмы (которые начинаются с IRLS, поскольку их легче инициализировать, но затем Окончание с дальнейшей оптимизацией с использованием Ньютона-Рафсона) можно найти в книге «Обобщенные линейные модели и расширения» Джеймса У. Хардина и Джозефа М. Хильбе .

Том Венселерс
источник