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?
sumber
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.glm.fit
kode tetapi saya masih tidak tahu bagaimana nilai awal dihitung.Jawaban:
TL; DR
start=c(b0,b1)
menginisialisasi eta menjadib0+x*b1
(mu ke 1 / (1 + exp (-eta)))start=c(0,0)
menginisialisasi eta ke 0 (mu ke 0,5) terlepas dari nilai y atau x.start=NULL
menginisialisasi eta = 1.098612 (mu = 0.75) jika y = 1, terlepas dari nilai x.start=NULL
menginisialisasi eta = -1.098612 (mu = 0.25) jika y = 0, terlepas dari nilai x.Setelah eta (dan akibatnya mu dan var (mu)) telah dihitung,
w
danz
dihitung dan dikirim ke pemecah QR, dalam semangatqr.solve(cbind(1,x) * w, z*w)
.Bentuk panjang
Membangun off komentar Roland: Saya membuat
glm.fit.truncated()
, di mana aku mengambilglm.fit
turun keC_Cdqrls
panggilan, dan kemudian berkomentar itu.glm.fit.truncated
menampilkan nilaiz
danw
(serta nilai jumlah yang digunakan untuk menghitungz
danw
) yang kemudian akan diteruskan keC_Cdqrls
panggilan:Lebih banyak dapat dibaca di
C_Cdqrls
sini . Untungnya, fungsiqr.solve
pada basis R mengetuk langsung ke versi LINPACK yang dipanggilglm.fit()
.Jadi kami menjalankan
glm.fit.truncated
untuk spesifikasi nilai awal yang berbeda, dan kemudian melakukan panggilan keqr.solve
dengan nilai w dan z, dan kami melihat bagaimana "nilai awal" (atau nilai iterasi yang ditampilkan pertama) dihitung. Seperti yang ditunjukkan Roland, menentukanstart=NULL
ataustart=c(0,0)
dalam glm () memengaruhi perhitungan untuk w dan z, bukan untukstart
.Untuk awal = NULL:
z
adalah vektor di mana elemen memiliki nilai 2.431946 atau -2.431946 danw
merupakan vektor di mana semua elemen adalah 0.4330127:Untuk awal = c (0,0):
z
adalah vektor di mana elemen memiliki nilai 2 atau -2 danw
merupakan vektor di mana semua elemen 0,5:Jadi itu semua baik dan bagus, tetapi bagaimana kita menghitung
w
danz
? Di dekat bagian bawahglm.fit.truncated()
kita lihatLihatlah perbandingan berikut antara nilai yang dihasilkan dari jumlah yang digunakan untuk menghitung
z
danw
:Perhatikan bahwa
start.is.00
akan memiliki vektormu
dengan hanya nilai 0,5 karena eta diatur ke 0 dan mu (eta) = 1 / (1 + exp (-0)) = 0,5.start.is.null
menetapkan yang dengan y = 1 menjadi mu = 0,75 (yang sesuai dengan eta = 1,098612) dan yang dengan y = 0 menjadi mu = 0,25 (yang sesuai dengan eta = -1,098612), dan dengan demikianvar_mu
= 0,75 * 0,25 = 0,1875.Namun, menarik untuk dicatat, bahwa saya mengubah benih dan memutar ulang semuanya dan mu = 0,75 untuk y = 1 dan mu = 0,25 untuk y = 0 (dan dengan demikian jumlah lainnya tetap sama). Dengan kata lain, mulai = NULL memunculkan yang sama
w
danz
terlepas dari apay
dan apax
, karena mereka menginisialisasi eta = 1.098612 (mu = 0.75) jika y = 1 dan eta = -1.098612 (mu = 0.25) jika y = 0.Jadi nampak bahwa nilai awal untuk koefisien Intercept dan untuk koefisien-X tidak diatur untuk mulai = NULL, melainkan nilai awal diberikan kepada eta tergantung pada nilai-y dan tidak tergantung pada nilai-x. Dari sana
w
danz
dihitung, lalu dikirim bersamax
ke qr.solver.Kode untuk dijalankan sebelum potongan di atas:
sumber