R中的glm函数使用哪种优化算法?


17

可以使用以下代码在R中执行logit回归:

> 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

我很好奇它是什么优化算法?是Newton-Raphson算法(二阶梯度下降)吗?我可以设置一些参数来使用柯西算法(一阶梯度下降)吗?


5
您是否介意将Newton-Raphson算法称为“梯度下降II级”?
Cliff AB

4
FIsher评分本身与Newton-Raphson有关,但与Newton-Raphson不同,实际上是用模型下的预期值代替了Hessian。
Glen_b-恢复莫妮卡

@CliffAB很抱歉。注意,这Newton's method是二阶梯度下降法。
MarcinKosiński2015年

1
@ hxd1011,您不应编辑更改其他人的问题。当您认为自己知道他们的意思,但是不清楚他们的问题(例如,英语不是他们的母语)时,编辑是一回事,但是您不应让他们的问题他们的问题有所不同(例如,更笼统)通缉。相反,请问您想要的新问题。我正在回滚编辑。
gung-恢复莫妮卡

1
@MarcinKosińskiNewton的方法 Newton-Raphson,Raphson仅以牛顿的思想为基础建立了更一般的情况。
AdamO'7

Answers:


19

您可能会想知道glm通过访问的的文档?glm提供了许多有用的见解:在此之下,method我们发现迭代地加权最小二乘是的默认方法glm.fit,这是的主要功能glm。此外,文档中提到,此处可能提供用户定义的功能,而不是默认功能。


3
您也可以只键入函数名称glmfit.glmR提示下学习源代码。
马修·德鲁里

@MatthewDrury我认为您的意思是主力马glm.fit,因为它依赖C代码,所以无法完全复制C_Cdqrls
AdamO '16

是的,您是对的,我在R中混合了很多命令。您是什么意思,但不可复制?
马修·德鲁里

16

输出本身中提到了使用的方法:它是Fisher评分。在大多数情况下,这等效于牛顿-拉夫森。例外情况是您使用非自然参数设置。相对风险回归就是这种情况的一个例子。在那里,预期和观察到的信息是不同的。通常,Newton Raphson和Fisher Scoring给出几乎相同的结果。

pp1个-p费舍尔得分。此外,它为EM算法提供了很好的直觉,这是一个用于估计复杂可能性的更通用的框架。

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请参阅“无约束优化和非线性方程的数值方法” Dennis,JE和Schnabel,RB
AdamO

1
据我所知,@ hxd1011不需要Newton Raphson,也不需要估计这些步骤中的Hessian。牛顿型方法用nlm数字估算梯度,然后应用牛顿拉夫森。在BFGS中,我认为与Newton Raphson一样需要梯度,但是连续的步骤是使用二阶近似来评估的,这需要对Hessian进行估算。BFGS适用于高度非线性的优化。但是对于GLM,它们通常表现良好。
AdamO '16

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拟合算法进行了很好的讨论,包括与Newton-Raphson(使用观察到的Hessian,而不是IRLS算法中预期的Hessian)进行比较,以及混合算法(以IRLS开头,因为它们更易于初始化,但随后可以使用James W. Hardin和Joseph M. Hilbe撰写的“广义线性模型和扩展”一书中找到使用Newton-Raphson进行进一步优化的方法 。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.