อัลกอริทึมการเพิ่มประสิทธิภาพใดที่ใช้ในฟังก์ชัน glm ใน R


17

หนึ่งสามารถทำการถดถอย logit ใน 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

ฉันอยากรู้ว่าอัลกอริธึมที่เหมาะสมที่สุดคืออะไร? มันเป็นอัลกอริทึมของ Newton-Raphson (การไล่ระดับสีลำดับที่สอง) หรือไม่? ฉันสามารถตั้งค่าพารามิเตอร์บางอย่างเพื่อใช้อัลกอริทึม Cauchy (การไล่ระดับสีลำดับแรก)


5
คุณคิดว่าการอ้างถึงอัลกอริทึมของ Newton-Raphson นั้นถูกเรียกว่า "gradient descent level II" หรือไม่?
Cliff AB

4
การให้คะแนนตัวเองนั้นมีความเกี่ยวข้อง แต่แตกต่างจากนิวตัน - ราฟสันซึ่งมีผลแทนที่เฮสเซียนด้วยค่าที่คาดหวังภายใต้โมเดล
Glen_b -Reinstate Monica

@CliffAB sory ฉันพูดถึงว่าNewton's methodเป็นวิธีลดระดับการไล่ระดับสีลำดับที่สอง
Marcin Kosiński

1
@ hxd1011 คุณไม่ควรแก้ไขเพื่อเปลี่ยนคำถามของคนอื่น การแก้ไขเมื่อคุณคิดว่าคุณรู้ว่าพวกเขาหมายถึงอะไร แต่คำถามของพวกเขาไม่ชัดเจน (บางทีภาษาอังกฤษไม่ใช่ภาษาพื้นเมืองของพวกเขาเช่น) แต่คุณไม่ควรทำให้คำถามของพวกเขาแตกต่างกัน (เช่นทั่วไปมากกว่า) ต้องการ. ให้ถามคำถามใหม่กับสิ่งที่คุณต้องการ ฉันกำลังแก้ไขกลับ
gung - Reinstate Monica

1
@ วิธีMarcinKosińskiของนิวตันคือ Newton-Raphson, Raphson สร้างขึ้นจากแนวคิดของ Newton สำหรับกรณีทั่วไปมากขึ้น
AdamO

คำตอบ:


19

คุณจะมีความสนใจที่จะรู้ว่าเอกสารสำหรับglm, เข้าถึงได้ผ่านทาง?glmให้ข้อมูลเชิงลึกที่มีประโยชน์มากมาย: ภายใต้methodเราพบว่า reweighted ซ้ำสองน้อยที่สุดเป็นวิธีการเริ่มต้นสำหรับการซึ่งเป็นฟังก์ชั่นเทียมสำหรับglm.fit glmนอกจากนี้เอกสารระบุว่าฟังก์ชั่นที่ผู้ใช้กำหนดอาจมีให้ที่นี่แทนค่าเริ่มต้น


3
นอกจากนี้คุณยังสามารถเพียงแค่พิมพ์ชื่อฟังก์ชั่นglmหรือfit.glmที่Rพร้อมที่จะศึกษารหัสที่มา
Matthew Drury

@MatthewDrury ฉันคิดว่าคุณหมายถึงเทียมซึ่งจะไม่สามารถทำซ้ำได้ทั้งหมดเพราะมันอาศัยอยู่กับรหัสglm.fit C C_Cdqrls
AdamO

ใช่คุณพูดถูกฉันผสมคำสั่งใน R มากขึ้น คุณหมายถึงอะไรที่ไม่สามารถทำซ้ำได้
Matthew Drury

16

วิธีการที่ใช้มีการกล่าวถึงในผลลัพธ์เอง: มันเป็นเกณฑ์การให้คะแนนชาวประมง สิ่งนี้เทียบเท่ากับ Newton-Raphson ในกรณีส่วนใหญ่ ข้อยกเว้นคือสถานการณ์ที่คุณกำลังใช้การกำหนดพารามิเตอร์ที่ไม่ใช่ธรรมชาติ การถดถอยความเสี่ยงเชิงสัมพันธ์เป็นตัวอย่างของสถานการณ์ดังกล่าว ที่นั่นข้อมูลที่คาดหวังและสังเกตจะแตกต่างกัน โดยทั่วไปแล้ว Newton Raphson และ Fisher Scoring จะให้ผลลัพธ์ที่ใกล้เคียงกัน

pp(1p)เกณฑ์การให้คะแนนของ Fisher ยิ่งไปกว่านั้นมันให้สัญชาตญาณที่ดีกับอัลกอริทึม 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 ฉันคิดว่าคุณอธิบาย แต่ฉันไม่ได้ทำตาม
Haitao Du

@ hxd1011 โปรดดู "วิธีการเชิงตัวเลขสำหรับการปรับให้เหมาะสมแบบไม่ จำกัด และสมการไม่เชิงเส้น" เดนนิส, JE และ Schnabel, RB
AdamO

1
@ hxd1011 เท่าที่ฉันสามารถบอกได้ Newton Raphson ไม่ต้องการหรือประมาณ Hessian ในขั้นตอน วิธี Newton-Type ในการnlmประมาณค่าการไล่ระดับสีนั้นจะใช้ Newton Raphson ใน BFGS ฉันคิดว่าต้องใช้การไล่ระดับสีเหมือนกับ Newton Raphson แต่จะมีการประเมินขั้นตอนต่อเนื่องโดยใช้ลำดับที่สองซึ่งต้องมีการประเมินของ Hessian BFGS เป็นสิ่งที่ดีสำหรับการปรับให้เหมาะสมแบบไม่เชิงเส้น แต่สำหรับ GLMs พวกเขามักจะทำตัวได้ดีมาก
AdamO

2
คำตอบที่มีอยู่กล่าวถึง "ซ้ำอย่างน้อยน้ำหนักน้อยกำลังสอง" วิธีการที่จะเข้าสู่ภาพเมื่อเทียบกับอัลกอริทึมที่คุณกล่าวถึงที่นี่?
อะมีบาพูดว่า Reinstate Monica

@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 ที่สังเกตได้ซึ่งตรงข้ามกับ Hessian ที่คาดไว้ในอัลกอริทึม IRLS) และอัลกอริทึมไฮบริด (ซึ่งเริ่มต้นด้วย IRLS จบด้วยการเพิ่มประสิทธิภาพต่อการใช้ Newton-Raphson) สามารถพบได้ในหนังสือ "รุ่นทั่วไปเชิงเส้นและส่วนขยาย" โดยเจมส์ดับเบิลยูฮาร์ดินและโจเซฟเมตร Hilbe

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.