97 const double &tol_eta,
103 const bool &returnUS,
104 const bool &doCoxReid):
116 fam = getGLMFamily( family );
120 bool estimateTheta = family ==
"nb" ? true :
false;
122 this->family =
"poisson/log";
125 checkResponse(y, this->family);
132 ModelFitGLM fit_init = GLM(X, y, this->family,
LEAST, weights, offset, work, {}, 1e-2, 3, lambda);
136 uvec idx_drop = find(weights == 0.0);
137 double n_active = weights.n_elem - idx_drop.n_elem;
142 ct = CreateLUT(y, weights);
146 for(niter_pql=0; niter_pql<maxit; niter_pql++){
150 theta = nb_theta_ml(y, work->
mu, y.n_elem, weights, X, doCoxReid, ct, -5, 20);
151 fam->setOverdispersion( theta );
156 work->
eta = work->
eta + offset;
159 work->
eta = fit.fitted() + offset;
162 if( norm(work->
eta - eta_old) < tol_eta){
168 work->
eta.elem( idx_drop ).zeros();
171 work->
mu = fam->linkinv( work->
eta );
177 work->
z = (work->
eta - offset) + (y - work->
mu) / work->
gprime;
180 work->
w = square(work->
gprime) % (weights / fam->variance( work->
mu ));
183 w_mean = sum(work->
w) / n_active;
184 work->
w = work->
w / w_mean;
190 if( work->
z.has_nan() || work->
w.has_nan() ){
191 fit.set_model_failure();
203 fit.eval_delta( delta );
205 fit.estimate_delta(left, right, tol);
209 iter_in += fit.get_iter();
213 if( isValid && (md >
LEAST) ){
216 fit =
fastlmm(work->
z, X, this->dcmp, work->
w, md, lambda);
219 fit.eval_delta( delta );
221 fit.estimate_delta(left, right, tol);
227 this->family =
"nb:" + to_string(theta);
233 eta = fit.fitted() + offset;
234 mu = fam->linkinv(eta);
236 eta = vec(offset.n_elem, fill::value(datum::nan));
237 mu = vec(offset.n_elem, fill::value(datum::nan));
242 mu_mean = robust_mean(mu, 4);
305 res1.
coef = vec(p, fill::value(datum::nan));
315 res1.
vcov = mat(p, p, fill::value(datum::nan));
317 res1.
se = vec(p, fill::value(datum::nan));
318 res1.
rdf = datum::nan;
334 vec rp_clean = rp.elem(find_finite(rp));
335 double disp = dot(rp_clean, rp_clean) / res1.
rdf ;
337 if( fam->estimateDispersion() ){