Saya bertanya-tanya bagaimana nilai awal default ditentukan dalam glm
.
Posting ini menunjukkan bahwa nilai default ditetapkan sebagai nol. Ini salah satu mengatakan bahwa ada sebuah algoritma di balik itu, namun link yang relevan rusak.
Saya mencoba menyesuaikan model regresi logistik sederhana dengan penelusuran algoritme:
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)))
Pertama, tanpa spesifikasi nilai awal:
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
Pada langkah pertama, nilai awal adalah NULL
.
Kedua, saya menetapkan nilai awal menjadi nol:
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
Dan kita dapat melihat bahwa iterasi antara pendekatan pertama dan kedua berbeda.
Untuk melihat nilai awal yang ditentukan oleh glm
saya mencoba mencocokkan model dengan hanya satu iterasi:
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
Estimasi parameter (tidak mengherankan) sesuai dengan estimasi pendekatan pertama dalam iterasi kedua yaitu, [1] 0.386379 1.106234
Menetapkan nilai-nilai ini sebagai nilai awal mengarah ke urutan iterasi yang sama seperti pada pendekatan pertama:
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
Jadi pertanyaannya adalah, bagaimana nilai-nilai ini dihitung?
glm.fit
kode tetapi saya masih tidak tahu bagaimana nilai awal dihitung.
start
nilai, nilai tersebut digunakan dalam perhitungan apa yang diteruskan keC_Cdqrls
rutin. Jika tidak, nilai yang diteruskan akan dihitung (termasuk panggilaneval(binomial()$initialize)
), tetapiglm.fit
tidak pernah secara eksplisit menghitung nilai untukstart
. Ambil satu atau dua jam dan pelajariglm.fit
kodenya.