ฉันสงสัยว่ามีการระบุค่าเริ่มต้นเริ่มต้นglm
อย่างไร
โพสต์นี้แสดงให้เห็นว่ามีการตั้งค่าเริ่มต้นเป็นศูนย์ นี้หนึ่งบอกว่ามีขั้นตอนวิธีการที่อยู่เบื้องหลังมัน แต่การเชื่อมโยงที่เกี่ยวข้องจะเสีย
ฉันพยายามจัดรูปแบบการถดถอยแบบโลจิสติกส์แบบเรียบง่ายด้วยการติดตามอัลกอริทึม:
set.seed(123)
x <- rnorm(100)
p <- 1/(1 + exp(-x))
y <- rbinom(100, size = 1, prob = p)
# to see parameter estimates in each step
trace(glm.fit, quote(print(coefold)), at = list(c(22, 4, 8, 4, 19, 3)))
ก่อนไม่มีข้อกำหนดของค่าเริ่มต้น:
glm(y ~ x, family = "binomial")
Tracing glm.fit(x = structure(c(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, .... step 22,4,8,4,19,3
NULL
Tracing glm.fit(x = structure(c(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, .... step 22,4,8,4,19,3
[1] 0.386379 1.106234
Tracing glm.fit(x = structure(c(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, .... step 22,4,8,4,19,3
[1] 0.3991135 1.1653971
Tracing glm.fit(x = structure(c(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, .... step 22,4,8,4,19,3
[1] 0.3995188 1.1669508
ในขั้นตอนแรก, NULL
ค่าเริ่มต้นเป็น
ประการที่สองฉันตั้งค่าเริ่มต้นเป็นศูนย์:
glm(y ~ x, family = "binomial", start = c(0, 0))
Tracing glm.fit(x = structure(c(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, .... step 22,4,8,4,19,3
[1] 0 0
Tracing glm.fit(x = structure(c(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, .... step 22,4,8,4,19,3
[1] 0.3177530 0.9097521
Tracing glm.fit(x = structure(c(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, .... step 22,4,8,4,19,3
[1] 0.3909975 1.1397163
Tracing glm.fit(x = structure(c(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, .... step 22,4,8,4,19,3
[1] 0.3994147 1.1666173
Tracing glm.fit(x = structure(c(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, .... step 22,4,8,4,19,3
[1] 0.3995191 1.1669518
และเราจะเห็นว่าการวนซ้ำระหว่างวิธีแรกและวิธีที่สองนั้นแตกต่างกัน
หากต้องการดูค่าเริ่มต้นที่ระบุโดยglm
ฉันพยายามปรับให้เข้ากับแบบจำลองด้วยการวนซ้ำเพียงครั้งเดียว:
glm(y ~ x, family = "binomial", control = list(maxit = 1))
Tracing glm.fit(x = structure(c(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, .... step 22,4,8,4,19,3
NULL
Call: glm(formula = y ~ x, family = "binomial", control = list(maxit = 1))
Coefficients:
(Intercept) x
0.3864 1.1062
Degrees of Freedom: 99 Total (i.e. Null); 98 Residual
Null Deviance: 134.6
Residual Deviance: 115 AIC: 119
การประมาณค่าพารามิเตอร์ (ไม่น่าประหลาดใจ) สอดคล้องกับการประมาณการของวิธีแรกในการทำซ้ำครั้งที่สองคือ[1] 0.386379 1.106234
การตั้งค่าเหล่านี้เป็นค่าเริ่มต้นนำไปสู่ลำดับการทำซ้ำเดียวกันเช่นเดียวกับในวิธีแรก:
glm(y ~ x, family = "binomial", start = c(0.386379, 1.106234))
Tracing glm.fit(x = structure(c(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, .... step 22,4,8,4,19,3
[1] 0.386379 1.106234
Tracing glm.fit(x = structure(c(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, .... step 22,4,8,4,19,3
[1] 0.3991135 1.1653971
Tracing glm.fit(x = structure(c(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, .... step 22,4,8,4,19,3
[1] 0.3995188 1.1669508
ดังนั้นคำถามคือวิธีการคำนวณค่าเหล่านี้?
glm.fit
โค้ด แต่ฉันก็ยังไม่รู้ว่าจะคำนวณค่าเริ่มต้นได้อย่างไร
start
ค่าจะใช้ในการคำนวณสิ่งที่ส่งผ่านไปยังC_Cdqrls
รูทีน หากคุณไม่ได้ค่าที่ถูกส่งผ่านได้รับการคำนวณ (รวมถึงการโทรeval(binomial()$initialize)
) แต่ไม่เคยชัดเจนคำนวณค่าglm.fit
start
ใช้เวลาหนึ่งหรือสองชั่วโมงและศึกษาglm.fit
รหัส