Який алгоритм оптимізації використовується у функції 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 градієнта»?
Кліф АВ

4
Сам бал FIsher пов'язаний, але відрізняється від Ньютона-Рафсона, фактично замінюючи Гессієна його очікуваним значенням у моделі.
Glen_b -Встановіть Моніку

@CliffAB sory. Я вважаю, що Newton's methodце метод спуску за градієнтом другого порядку.
Marcin Kosiński

1
@ hxd1011, ви не повинні редагувати, щоб змінити чуже питання. Редагувати одне, коли ти думаєш, що знаєш, що вони означають, але їх питання незрозуміле (можливо, англійська мова не є їхньою рідною мовою, наприклад), але не слід робити їх питання іншим (наприклад, більш загальним), ніж вони мали хотів. Натомість задайте нове запитання, що ви хочете. Я повертаю правки назад.
gung - Відновіть Моніку

1
@ MarcinKosiński Метод Ньютона - це Ньютон-Рафсон, Рафсон просто побудований на ідеях Ньютона для більш загального випадку.
AdamO

Відповіді:


19

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


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 

яка різниця порівняно з методом градієнта гідного / методу Ньютона / BFGS? Я думаю, ви пояснили, але я не зовсім слідкую.
Хайтао Ду

@ hxd1011 див. "Числові методи для необмеженої оптимізації та нелінійних рівнянь" Денніс, Є.Є. та Шнабель, РБ
AdamO

1
@ hxd1011, наскільки я можу сказати, Ньютон Рафсон не вимагає і не оцінює гессіана в кроках. Метод Newton-Type в nlmоцінках градієнта чисельно застосовується Newton Raphson. У BFGS я думаю, що градієнт необхідний, як і у Ньютона Рафсона, але послідовні кроки оцінюються за допомогою наближення другого порядку, що вимагає оцінки Гессіана. BFGS хороший для високолінійних оптимізацій. Але для ГЛМ вони зазвичай дуже добре поводяться.
AdamO

2
Існуюча відповідь згадала "ітераційно переосмислені найменші квадрати", як це вводиться в малюнок, порівняно з алгоритмами, які ви згадали тут?
амеба каже, що повернемо Моніку

@AdamO Ви могли б звернутися до коментарів amoeba? Спасибі
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, оскільки їх легше ініціалізувати, але потім Закінчення з подальшою оптимізацією за допомогою Ньютона-Рафсона) можна знайти в книзі "Узагальнені лінійні моделі та розширення" Джеймса У. Хардіна та Джозефа М. Хільбе .

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.