मुझे लगता है कि यह उन प्रारंभिक मूल्यों के लिए नीचे आता है जो इसमें से उपयोग किया जाता है glm.fit
, family$initialize
जो विधि को विचलन बनाता है। जहां तक मुझे पता है,glm.fit
का क्यूआर-अपघटन बनाकर समस्या को हल करें जहां डिजाइन मैट्रिक्स है और प्रविष्टियों का वर्गमूल के साथ एक विकर्ण है जैसा कि यहां वर्णित है । यही है, न्यूटन-रैपसन विधि का उपयोग करता है।W−−√XXW−−√
प्रासंगिक $intialize
कोड है:
if (NCOL(y) == 1) {
if (is.factor(y))
y <- y != levels(y)[1L]
n <- rep.int(1, nobs)
y[weights == 0] <- 0
if (any(y < 0 | y > 1))
stop("y values must be 0 <= y <= 1")
mustart <- (weights * y + 0.5)/(weights + 1)
m <- weights * y
if (any(abs(m - round(m)) > 0.001))
warning("non-integer #successes in a binomial glm!")
}
यहाँ एक सरलीकृत संस्करण है, glm.fit
जो मेरी बात दर्शाता है
> #####
> # setup
> y <- matrix(c(1,0,0,0), ncol = 1)
> weights <- 1:nrow(y) * 1000
> nobs <- length(y)
> family <- binomial()
> X <- matrix(rep(1, nobs), ncol = 1) # design matrix used later
>
> # set mu start as with family$initialize
> if (NCOL(y) == 1) {
+ n <- rep.int(1, nobs)
+ y[weights == 0] <- 0
+ mustart <- (weights * y + 0.5)/(weights + 1)
+ m <- weights * y
+ if (any(abs(m - round(m)) > 0.001))
+ warning("non-integer #successes in a binomial glm!")
+ }
>
> mustart # starting value
[,1]
[1,] 0.9995004995
[2,] 0.0002498751
[3,] 0.0001666111
[4,] 0.0001249688
> (eta <- family$linkfun(mustart))
[,1]
[1,] 7.601402
[2,] -8.294300
[3,] -8.699681
[4,] -8.987322
>
> #####
> # Start loop to fit
> mu <- family$linkinv(eta)
> mu_eta <- family$mu.eta(eta)
> z <- drop(eta + (y - mu) / mu_eta)
> w <- drop(sqrt(weights * mu_eta^2 / family$variance(mu = mu)))
>
> # code is simpler here as (X^T W X) is a scalar
> X_w <- X * w
> (.coef <- drop(crossprod(X_w)^-1 * ((w * z) %*% X_w)))
[1] -5.098297
> (eta <- .coef * X)
[,1]
[1,] -5.098297
[2,] -5.098297
[3,] -5.098297
[4,] -5.098297
>
> # repeat a few times from "start loop to fit"
हम न्यूटन-राफसन पद्धति को देखने के लिए पिछले भाग को दो बार दोहरा सकते हैं:
> #####
> # Start loop to fit
> mu <- family$linkinv(eta)
> mu_eta <- family$mu.eta(eta)
> z <- drop(eta + (y - mu) / mu_eta)
> w <- drop(sqrt(weights * mu_eta^2 / family$variance(mu = mu)))
>
> # code is simpler here as (X^T W X) is a scalar
> X_w <- X * w
> (.coef <- drop(crossprod(X_w)^-1 * ((w * z) %*% X_w)))
[1] 10.47049
> (eta <- .coef * X)
[,1]
[1,] 10.47049
[2,] 10.47049
[3,] 10.47049
[4,] 10.47049
>
>
> #####
> # Start loop to fit
> mu <- family$linkinv(eta)
> mu_eta <- family$mu.eta(eta)
> z <- drop(eta + (y - mu) / mu_eta)
> w <- drop(sqrt(weights * mu_eta^2 / family$variance(mu = mu)))
>
> # code is simpler here as (X^T W X) is a scalar
> X_w <- X * w
> (.coef <- drop(crossprod(X_w)^-1 * ((w * z) %*% X_w)))
[1] -31723.76
> (eta <- .coef * X)
[,1]
[1,] -31723.76
[2,] -31723.76
[3,] -31723.76
[4,] -31723.76
ऐसा तब नहीं होता जब आप शुरुआत करते हैं weights <- 1:nrow(y)
या कहते हैं weights <- 1:nrow(y) * 100
।
ध्यान दें कि आप mustart
तर्क सेट करके विचलन से बच सकते हैं । जैसे करते हैं
> glm(Y ~ 1,weights = w * 1000, family = binomial, mustart = rep(0.5, 4))
Call: glm(formula = Y ~ 1, family = binomial, weights = w * 1000, mustart = rep(0.5,
4))
Coefficients:
(Intercept)
-2.197
Degrees of Freedom: 3 Total (i.e. Null); 3 Residual
Null Deviance: 6502
Residual Deviance: 6502 AIC: 6504
weights
अंदर दो स्थानों पर तर्क समाप्त होता हैglm.fit
( glm.R में ), जो है जो काम करता है R: 1 में) अवशिष्ट अवशिष्ट में, C फ़ंक्शन के माध्यम सेbinomial_dev_resids
( family.c में ) औरCdqrls
( lm.c में ) IWLS कदम से 2 )। मुझे पता नहीं है कि तर्क को ट्रेस करने में अधिक मददगार होने के लिए पर्याप्त C