Zastanawiam się, jak określono domyślne wartości początkowe w glm
.
Ten post sugeruje, że wartości domyślne są ustawione na zera. Ten jeden mówi, że istnieje algorytm za nim, jednak istotne link jest uszkodzony.
Próbowałem dopasować prosty model regresji logistycznej ze śledzeniem algorytmu:
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)))
Po pierwsze, bez specyfikacji wartości początkowych:
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
W pierwszym kroku początkowe wartości to NULL
.
Po drugie, ustawiam wartości początkowe na zero:
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
Widzimy, że iteracje między pierwszym i drugim podejściem są różne.
Aby zobaczyć wartości początkowe określone przez glm
, próbowałem dopasować model tylko z jedną iteracją:
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
Oszacowania parametrów (co nie jest zaskakujące) odpowiadają oszacowaniom pierwszego podejścia w drugiej iteracji, tj. [1] 0.386379 1.106234
Ustawienie tych wartości jako wartości początkowych prowadzi do tej samej sekwencji iteracji, co w pierwszym podejściu:
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
Pytanie brzmi: jak te wartości są obliczane?
źródło
start
wartości, zostaną one użyte do obliczenia tego, co zostanie przekazane doC_Cdqrls
procedury. Jeśli tego nie zrobisz, przekazywane wartości zostaną obliczone (w tym wywołanieeval(binomial()$initialize)
), aleglm.fit
nigdy jawnie nie oblicza wartości dlastart
. Poświęć godzinę lub dwie i przestudiujglm.fit
kod.glm.fit
kod, ale nadal nie mam pojęcia, jak obliczane są wartości początkowe.Odpowiedzi:
TL; DR
start=c(b0,b1)
inicjuje eta dob0+x*b1
(mu do 1 / (1 + exp (-eta)))start=c(0,0)
inicjuje eta do 0 (mu do 0,5) niezależnie od wartości y lub x.start=NULL
inicjuje eta = 1,098612 (mu = 0,75), jeśli y = 1, niezależnie od wartości x.start=NULL
inicjuje eta = -1,098612 (mu = 0,25), jeśli y = 0, niezależnie od wartości x.Po ETA (i co za tym idzie mu i var (il)), została obliczona
w
iz
są obliczane i wysyłane do QR Solver w duchuqr.solve(cbind(1,x) * w, z*w)
.Długa forma
Budowanie off komentarz Rolanda: Zrobiłem
glm.fit.truncated()
, gdzie wziąłemglm.fit
dół doC_Cdqrls
rozmowy, a następnie zauważył go.glm.fit.truncated
wyprowadza wartościz
iw
(a także wartości ilości użytych do obliczeniaz
iw
), które następnie zostaną przekazane doC_Cdqrls
wywołania:Więcej można przeczytać o
C_Cdqrls
tutaj . Na szczęście funkcjaqr.solve
w podstawowym R jest podłączana bezpośrednio do wywoływanych wersji LINPACKglm.fit()
.Sprawdzamy więc
glm.fit.truncated
różne specyfikacje wartości początkowej, a następnie wywołujemyqr.solve
z wartościami w i z, i widzimy, jak obliczane są „wartości początkowe” (lub pierwsze wyświetlane wartości iteracji). Jak wskazał Roland, określeniestart=NULL
lubstart=c(0,0)
w glm () wpływa na obliczenia w i z, a nie dlastart
.Na początek = NULL:
z
jest wektorem, w którym elementy mają wartość 2,431946 lub -2,431946 iw
jest wektorem, w którym wszystkie elementy mają 0,4330127:Dla początku = c (0,0):
z
jest wektorem, w którym elementy mają wartość 2 lub -2 iw
jest wektorem, w którym wszystkie elementy mają 0,5:To wszystko dobrze i dobrze, ale jak obliczyć
w
iz
? W dolnej częściglm.fit.truncated()
widzimySpójrz na następujące porównania między wartościami wyjściowymi ilości użytych do obliczenia
z
iw
:Zauważ, że
start.is.00
wektor będzie miałmu
tylko wartości 0,5, ponieważ eta jest ustawiona na 0, a mu (eta) = 1 / (1 + exp (-0)) = 0,5.start.is.null
ustawia te zy = 1 na mu = 0,75 (co odpowiada eta = 1,098612), a te zy = 0 na mu = 0,25 (co odpowiada eta = -1,098612), a zatemvar_mu
= 0,75 * 0,25 = 0,1875.Warto jednak zauważyć, że zmieniłem ziarno i przestawiłem wszystko, a mu = 0,75 dla y = 1 i mu = 0,25 dla y = 0 (a zatem pozostałe wielkości pozostały takie same). To znaczy, start = NULL daje to samo
w
iz
bez względu na to, coy
ix
są, ponieważ inicjują one eta = 1,098612 (mu = 0,75), jeśli y = 1 i eta = -1,098612 (mu = 0,25), jeśli y = 0.Wygląda więc na to, że wartość początkowa dla współczynnika przechwytywania i dla współczynnika X nie jest ustawiona dla start = NULL, ale raczej wartości początkowe są podawane eta w zależności od wartości y i niezależne od wartości x. Stamtąd
w
iz
są obliczane, a następnie przesyłane wraz zx
do qr.solver.Kod uruchamiany przed powyższymi fragmentami:
źródło