[R] Regression performance when using summary() twice

John Fox j|ox @end|ng |rom mcm@@ter@c@
Fri Jun 21 18:14:37 CEST 2024


Dear Christian,

You're apparently using the glm.nb() function in the MASS package.

Your function is peculiar in several respects. For example, you specify 
the model formula as a character string and then convert it into a 
formula, but you could just pass the formula to the function -- the 
conversion seems unnecessary. Similarly, you compute the summary for the 
model twice rather than just saving it in a local variable in your 
function. And the form of the function output is a bit strange, but I 
suppose you have reasons for that.

The primary reason that your function is slow, however, is that the 
confidence intervals computed by confint() profile the likelihood, which 
requires refitting the model a number of times. If you're willing to use 
possibly less accurate Wald-based rather than likelihood-based 
confidence intervals, computed, e.g., by the Confint() function in the 
car package, then you could speed up the computation considerably,

Using a model fit by example(glm.nb),

	library(MASS)
	example(glm.nb)
	microbenchmark::microbenchmark(
	  Wald = car::Confint(quine.nb1, vcov.=vcov(quine.nb1),
	               estimate=FALSE),
	  LR = confint(quine.nb1)
	)

which produces

Unit: microseconds
  expr       min       lq       mean    median       uq        max
  Wald   136.366   161.13   222.0872   184.541   283.72    386.466
    LR 87223.031 88757.09 95162.8733 95761.568 97672.23 182734.048
  neval
    100
    100


I hope this helps,
  Johm
-- 
John Fox, Professor Emeritus
McMaster University
Hamilton, Ontario, Canada
web: https://www.john-fox.ca/
--
On 2024-06-21 10:38 a.m., c.buhtz using posteo.jp wrote:
> [You don't often get email from c.buhtz using posteo.jp. Learn why this is 
> important at https://aka.ms/LearnAboutSenderIdentification ]
> 
> Caution: External email.
> 
> 
> Hello,
> 
> I am not a regular R user but coming from Python. But I use R for
> several special task.
> 
> Doing a regression analysis does cost some compute time. But I wonder
> when this big time consuming algorithm is executed and if it is done
> twice in my sepcial case.
> 
> It seems that calling "glm()" or similar does not execute the time
> consuming part of the regression code.
> It seems it is done when calling "summary(model)".
> Am I right so far?
> 
> If this is correct I would say that in my case the regression is down
> twice with the identical formula and data. Which of course is
> inefficient. See this code:
> 
> my_function <- function(formula_string, data) {
>              formula <- as.formula(formula_string)
>              model <- glm.nb(formula, data = data)
> 
>              result = cbind(summary(model)$coefficients, confint(model))
>              result = as.data.frame(result)
> 
>              string_result = capture.output(summary(model))
> 
>              return(list(result, string_result))
>          }
> 
> I do call summary() once to get the "$coefficents" and a second time
> when capturing its output as a string.
> 
> If this really result in computing the regression twice I ask myself if
> there is a R-way to make this more efficent?
> 
> Best regards,
> Christian Buhtz
> 
> ______________________________________________
> R-help using r-project.org mailing list -- To UNSUBSCRIBE and more, see
> https://stat.ethz.ch/mailman/listinfo/r-help
> PLEASE do read the posting guide 
> http://www.R-project.org/posting-guide.html
> and provide commented, minimal, self-contained, reproducible code.



More information about the R-help mailing list