Poisson regression with small denominators/counts

I have daily data on surgery cancellations for about six months and would like to examine the bivariate associations of several factors and surgery cancellations.

Each day there are variable number of total surgeries scheduled (canceled + completed) - median 20 (IQR: 18, 22.5; range 0 to 36).

date total_surgeries surgeries_cancelled factor1
23-Jun-22 20 4 NA
24-Jun-22 14 1 NA
27-Jun-22 19 7 151
28-Jun-22 17 4 132
29-Jun-22 21 9 NA
30-Jun-22 19 5 115
1-Jul-22 19 4 117
4-Jul-22 24 7 142
5-Jul-22 18 8 135
7-Jul-22 18 6 156
8-Jul-22 14 3 131
... ... ... ...

My approach is to use Poisson regression (assuming no overdispersion) on these count data and control for the total number of surgeries in the model in an offset - i.e., in R my model would look like this to examine the association between a theoretical factor1:

glm(surgeries_cancelled ~ factor1 + offset(log(total_surgeries)),
data = surgery_data, family = poisson(link = "log"))


In the past to model rates my numerators/denominators have been much larger - i.e. hundreds of cases of an infectious diseases out of populations of tens of thousands. I want to make sure this are no statistical caveat for such relatively small counts/denominators, or is there a better approach to examine the associations of these data?

I am working in R, so an R reproducible R example is below if needed:

surgery_data <- structure(list(date = c("23-Jun-22", "24-Jun-22", "27-Jun-22",
"28-Jun-22", "29-Jun-22", "30-Jun-22", "1-Jul-22", "4-Jul-22",
"5-Jul-22", "7-Jul-22", "8-Jul-22", "11-Jul-22", "12-Jul-22",
"13-Jul-22", "14-Jul-22", "15-Jul-22", "18-Jul-22", "19-Jul-22",
"20-Jul-22", "21-Jul-22"), total_surgeries = c(20L, 14L, 19L,
17L, 21L, 19L, 19L, 24L, 18L, 18L, 14L, 26L, 20L, 24L, 18L, 18L,
26L, 17L, 22L, 21L), surgeries_cancelled = c(4L, 1L, 7L, 4L,
9L, 5L, 4L, 7L, 8L, 6L, 3L, 5L, 10L, 6L, 4L, 6L, 6L, 5L, 7L,
7L), factor1 = c(NA, NA, 151L, 132L, NA, 115L, 117L, 142L, 135L,
156L, 131L, 143L, 112L, 144L, 152L, 144L, 156L, 133L, 153L, 144L
)), row.names = c(NA, 20L), class = "data.frame")

glm(surgeries_cancelled ~ factor1 + offset(log(total_surgeries)),
data = surgery_data, family = poisson(link = "log"))

• Binomial regression could be an alternative; in that case, you do not need an offset. Commented Jul 9, 2023 at 13:35