# Statistical tests for count data: Poisson, quasi-Poisson or negative binomial?

> For counts per animal (lesions, colonies, foci), fit a count model with an offset for area or time; with small groups, take the p-value from quasi-Poisson. R and Python.

Canonical: https://www.licklider.ai/guides/statistical-tests-for-count-data/
Section: Guides › Counts, proportions and tables
Author: Licklider · Published 2026-11-10 · Last reviewed 2026-11-10 (UTC)

> **Quick answer.** For a count per animal — lesions, colonies, foci, cells, events — fit a **count model** with one row per animal, and add an **offset** for the area or time each count covers when those differ between animals. In our simulation, a Welch t-test on log(count + 1) or on count ÷ area kept its false-positive rate, but the first biases the ratio and ignores the area, and the second weights every animal equally and had the lowest power. With **small groups (fewer than about 20 animals each)**, take the rate ratio, its 95% confidence interval and the p-value from **quasi-Poisson regression with t-based inference** (in R, `glm(count ~ group + offset(log(area)), family = quasipoisson)`; [code below](#run-it-in-r-and-python)). In our simulations of balanced two-group designs with overdispersed counts and 6 to 10 animals per group, quasi-Poisson kept false positives at 4.3–5.2%, while the negative binomial's default Wald p-value gave 9.4–11.1% with 6 per group (across two runs) and still 7.4–7.5% with 10; that is the justification to give a reviewer. Report the Poisson model's dispersion, which is usually above 1 for counts from different animals, and the **rate ratio** (treated ÷ control) with its interval. Sequencing read counts and data with structural zeros need other tools ([zeros and sequencing counts](#zeros-and-sequencing-counts)).

**Terms used below.** A *count* is a whole number of events per sampling unit (lesions per mouse). The *rate* is the count divided by the area or time it covers. The *rate ratio* is the treated group's rate divided by the control group's. An *offset* tells the model how much area or time each count covers, so it compares rates rather than raw counts. *Dispersion* is how much the counts vary relative to their mean, after the model has accounted for group and offset; a Poisson model assumes it is 1. *Overdispersion* means it is larger. A *false positive* is a significant result when there is no true difference; *power* is how often a test detects a true difference. A *count model* (a generalised linear model, GLM) predicts the count directly on the log scale. A *Poisson model* is the simplest count model; it allows only counting noise. *Quasi-Poisson* is the same fit with its standard errors multiplied by √dispersion. A *negative binomial* model lets each animal's rate vary; its *θ* (theta) measures how much the rate varies between animals (small θ = more variable). The *Pearson dispersion* is the sum of squared Pearson residuals (observed minus fitted count, scaled by √fitted) divided by the *residual degrees of freedom* (animals minus estimated coefficients: 12 mice − 2 = 10 here). *t-based inference* takes intervals and p-values from a t distribution on those degrees of freedom instead of the normal distribution. A *Wald* test divides the estimate by its standard error and refers it to a normal distribution; a *likelihood-ratio* test compares the fit of the models with and without the group and refers the difference to a χ² distribution. Both assume many animals, so with few animals their p-values are too small. *Structural zeros* are animals in which the counted event could not occur.

## Decide in five questions

1. **What is one observation?** One count per independent animal (or culture, plate, experiment). If you counted several fields or sections per animal, add them up per animal first — see [several fields per animal](#several-fields-per-animal) — because the animals, not the fields, were randomised ([what counts as n](/guides/what-counts-as-n/)).
2. **Does each count cover the same area or time?** If not, use log(area) or log(time) as an offset. Dividing by area and running a t-test on the rates throws away the information that a big area gives a more precise rate.
3. **Is there overdispersion?** A Poisson model allows only counting noise, so counts from different animals vary more than it allows whenever the animals themselves differ; plan quasi-Poisson or negative binomial unless earlier experiments with the same assay showed counts that vary only as Poisson. Then check it: fit a Poisson model with the offset, compute the Pearson dispersion ([code below](#run-it-in-r-and-python)) and report it. Any value above 1 means the Poisson standard error is too small by a factor of √dispersion; quasi-Poisson already includes that factor, so report the value rather than switching models on it. With 10 residual degrees of freedom the dispersion is itself imprecise.
4. **How many animals per group?** With fewer than about 20 per group, use quasi-Poisson with t-based inference for the p-value and interval (see the simulations below, which start at 6 animals per group). From about 20 per group the negative binomial's tests were close to 5% too (6.0% or less in our simulation), so either model works; decide which before you see the data, because the two models weight large and small counts differently ([Ver Hoef & Boveng 2007](https://doi.org/10.1890/07-0043.1)).
5. **Special data?** Many structural zeros, or sequencing read counts, need a different tool: see [zeros and sequencing counts](#zeros-and-sequencing-counts).

**What to do:** write the unit, the offset and the model in your analysis plan before you look at the counts.

## A worked example: lesions in 6 vs 6 mice

Constructed data, written by hand: lesions counted in one tissue section per mouse, with the scored area differing between sections (0.7 to 1.6 mm²). Download [lesions.csv](/guides/statistical-tests-for-count-data/lesions.csv).

| Group | Lesions per mouse | Area (mm²) | Rate (lesions per mm²) |
| --- | --- | --- | --- |
| Vehicle | 4, 11, 2, 9, 3, 15 | 1.0, 1.4, 0.8, 1.2, 1.0, 1.6 | 6.29 |
| Drug | 14, 6, 31, 9, 22, 12 | 1.2, 0.9, 1.5, 1.1, 1.3, 0.7 | 14.03 |

The group rate is total lesions ÷ total area. The same data analysed four ways:

| Analysis | Rate ratio (drug ÷ vehicle) | 95% CI | p |
| --- | --- | --- | --- |
| Poisson regression with offset | 2.23 | 1.56 to 3.19 | 0.000011 |
| **Quasi-Poisson with offset, t(10)** | **2.23** | **1.25 to 3.98** | **0.011** |
| Negative binomial with offset (Wald): p too small at 6 per group; use only with about 20 or more animals per group | 2.25 | 1.40 to 3.63 | 0.00083 |
| Welch's t-test on log(count + 1), ignoring area | 2.11 (ratio of geometric means of count + 1) | — | 0.063 |

The Pearson dispersion of the Poisson fit is 2.02, so the Poisson standard error is too small by a factor of about √2.02 = 1.42 — hence its tiny p-value. Quasi-Poisson keeps the Poisson estimate and widens the standard error by that factor (√2.02 = 1.42); with t(10) in place of the normal distribution as well, its interval is about 1.6 times as wide on the log scale (1.56 to 3.19 becomes 1.25 to 3.98). The negative binomial gives a similar estimate but, at this group size, a p-value that our simulations show is too optimistic. The t-test on log(count + 1) cannot use the different areas at all. Had the dispersion been 1.2, the standard error would have grown by only √1.2 = 1.10, and the Poisson and quasi-Poisson p-values would have been close; the choice matters most when animals differ a lot.

**What to do:** report the quasi-Poisson result here: rate ratio 2.23 (95% CI 1.25 to 3.98), t(10) = 3.09, p = 0.011.

## Check dispersion after fitting, not on the raw counts

A common shortcut compares the variance of all counts with their mean. In the example that ratio is 6.09, which suggests strong overdispersion. But part of that variance is simply the difference between the groups and between areas. Within each group the ratio is 3.64 (vehicle) and 5.48 (drug), and after the model accounts for group and area the Pearson dispersion is 2.02. Judge the model by the dispersion of its own residuals.

| Measure | Value |
| --- | --- |
| Variance ÷ mean, all 12 mice | 6.09 |
| Variance ÷ mean, vehicle / drug | 3.64 / 5.48 |
| Pearson dispersion after fitting group and offset | 2.02 |

**What to do:** compute the Pearson dispersion from the fitted Poisson model (code below), not from the raw counts.

## Small groups: which p-value to trust

Read the false-positive rows first: a test whose false-positive rate is far above 5% also shows inflated power, so compare power only between tests that stay near 5%. We simulated 6 animals per group with areas between 0.7 and 1.6 mm², counts with clear overdispersion (negative binomial, θ = 2) or practically none (θ = 1000), and either no true difference or a true rate ratio of 2. Each method was applied to the same 10,000 datasets per row (seed fixed in advance; [simulation code](/guides/statistical-tests-for-count-data/simulation.R) and [output](/guides/statistical-tests-for-count-data/simulation_R_output.txt); no negative binomial fit failed). "Welch on rate" is Welch's t-test on count ÷ area.

| Counts per mm² | Overdispersed? | Poisson | Quasi-Poisson (t) | Negative binomial, Wald | Negative binomial, likelihood ratio | Welch on log(count + 1) | Welch on rate |
| --- | --- | --- | --- | --- | --- | --- | --- |
| **No true difference (false positives; target 5%)** | | | | | | | |
| 3 | yes | 22.1% | 4.3% | 9.4% | 7.7% | 4.7% | 3.5% |
| 15 | yes | 53.7% | 4.8% | 10.7% | 8.1% | 4.1% | 3.7% |
| 3 | no | 4.8% | 4.9% | 4.3% | 4.3% | 4.3% | 4.7% |
| 15 | no | 5.1% | 4.9% | 4.5% | 3.9% | 4.7% | 4.6% |
| **True rate ratio 2 (power)** | | | | | | | |
| 3 | yes | 63.2% | 20.8% | 36.3% | 31.3% | 19.7% | 15.5% |
| 15 | yes | 87.3% | 28.0% | 45.5% | 39.7% | 23.7% | 20.5% |
| 3 | no | 75.0% | 64.8% | 72.4% | 70.7% | 52.0% | 61.4% |
| 15 | no | 100.0% | 99.9% | 100.0% | 100.0% | 91.9% | 99.8% |

Four things follow. With overdispersed counts the Poisson test is badly wrong (22–54% false positives), so its higher "power" is meaningless; the same holds, to a lesser degree, for the negative binomial's default tests at this group size. Quasi-Poisson keeps close to 5% in every row. Its price shows when counts really are Poisson: at 3 counts per mm² it detected a doubling 64.8% of the time against 75.0% for Poisson. Welch's t-test on the rates also stays near 5%, but it weights a rate from a small area as much as one from a large area and had the lowest power of the methods near 5% (15.5% against quasi-Poisson's 20.8% at 3 counts per mm²). And with 6 animals per group and overdispersed counts, none of the methods that kept false positives near 5% in our simulation detected a doubling of the rate more than 28% of the time — plan larger groups ([how many biological replicates](/guides/how-many-biological-replicates/)).

The negative binomial's excess shrinks as groups grow. The table below is an independent run of 5,000 datasets per row with a different seed, with overdispersed counts (θ = 2) and no true difference ([simulation code](/guides/statistical-tests-for-count-data/simulation_n.R) and [output](/guides/statistical-tests-for-count-data/simulation_n_R_output.txt)); its 6-per-group row differs from the table above by simulation error (about ±0.6 percentage points):

| Animals per group | Counts per mm² | Quasi-Poisson (t) | Negative binomial, Wald | Negative binomial, likelihood ratio |
| --- | --- | --- | --- | --- |
| 6 | 3 / 15 | 4.3% / 5.2% | 9.6% / 11.1% | 8.1% / 8.5% |
| 10 | 3 / 15 | 4.5% / 5.2% | 7.5% / 7.4% | 6.3% / 6.1% |
| 20 | 3 / 15 | 5.0% / 5.3% | 6.0% / 5.7% | 5.4% / 5.2% |
| 40 | 3 / 15 | 5.1% / 5.8% | 5.4% / 5.6% | 5.1% / 5.2% |

**If a reviewer asks for the negative binomial** with small groups, keep the planned quasi-Poisson result as the primary analysis and add the negative binomial as a labelled sensitivity analysis. For its p-value, referring the likelihood-ratio statistic to an F distribution with 1 and the residual degrees of freedom, instead of the χ² distribution, kept false positives at 4.2–4.8% with 6 animals per group and 5.1% with 10 in a further 5,000 balanced datasets per row, against 6.9–8.2% for the χ² version ([simulation code](/guides/statistical-tests-for-count-data/simulation_lrt_f.R) and [output](/guides/statistical-tests-for-count-data/simulation_lrt_f_R_output.txt)); this is a pragmatic adjustment, not a standard default, so name it if you use it.

Warton and colleagues reach a similar practical conclusion for small samples: keep the count model and fix the test, for example by resampling, rather than switch to a transformation ([Warton et al. 2016](https://doi.org/10.1111/2041-210X.12552)). A negative binomial with a resampling (parametric bootstrap) p-value was not part of our simulation. All three simulations used balanced groups, θ = 2 or 1000 and 3–15 counts per mm², with no covariates; outside those conditions, treat the numbers as a guide.

**What to do:** with fewer than about 20 animals per group, report quasi-Poisson's t-based interval and p-value; use the negative binomial's default p-value only with larger groups.

## Why not log(count + 1) and a t-test?

In the simulation (6 animals per group), the Welch t-test on log(count + 1) kept its false-positive rate but reported a biased ratio: when the true rate ratio was 2, the ratio of geometric means of (count + 1) had a median of 1.72 at low counts (negative binomial: 1.98), because adding 1 shrinks the differences between small counts. O'Hara and Kotze simulated negative binomial counts and found that log and square-root transformations "performed poorly, except when the dispersion was small and the mean counts were large", while quasi-Poisson and negative binomial models "consistently performed well, with little bias" ([O'Hara & Kotze 2010](https://doi.org/10.1111/j.2041-210x.2010.00021.x)). A transformation of the counts also cannot use different areas or times.

**What to do:** use a count model so the reported rate ratio means what it says.

## Several fields per animal

If you scored several fields or sections per animal, add the counts and the areas for each animal, then fit the model with one row per animal, with log(total area) as the offset. The example data are constructed (2 mice per group, only to show the steps). That keeps the animal as the unit, which is what was randomised ([Lazic 2010](https://doi.org/10.1186/1471-2202-11-5)).

```r
# Several fields per mouse: add up counts and areas per mouse, then fit one row per mouse
fields <- data.frame(mouse = rep(c("V1", "V2", "D1", "D2"), each = 3),
                     group = rep(c("vehicle", "drug"), each = 6),
                     area_mm2 = 0.25, lesions = c(1, 0, 2, 3, 1, 2, 4, 2, 5, 1, 3, 2))
per_mouse <- aggregate(cbind(lesions, area_mm2) ~ mouse + group, data = fields, FUN = sum)
per_mouse$group <- factor(per_mouse$group, levels = c("vehicle", "drug"))   # vehicle as reference
print(per_mouse)
fit <- glm(lesions ~ group + offset(log(area_mm2)), family = quasipoisson, data = per_mouse)
cat(sprintf("Rate ratio (drug / vehicle) %.2f\n", exp(coef(fit)[["groupdrug"]])))
```

```text
  mouse   group lesions area_mm2
1    D1    drug      11     0.75
2    D2    drug       6     0.75
3    V1 vehicle       3     0.75
4    V2 vehicle       6     0.75
Rate ratio (drug / vehicle) 1.89
```

If you need field-level covariates, fit a mixed model with a random intercept per animal instead (in R, `lme4::glmer()` with `family = poisson` or `lme4::glmer.nb()`), following [nested data](/guides/nested-data-mixed-model/). With few animals, the per-animal sum is the safer route.

**What to do:** never fit the count model to fields as if each were an animal.

## Zeros and sequencing counts

**Many zeros.** A negative binomial already expects many zeros when counts are small and variable. A zero-inflated model is worth considering only when there is a reason for extra zeros — for example animals in which the process could not occur — because statistical inference on such data is "likely to be inefficient or wrong unless careful thought is given to how these zeros arose" ([Martin et al. 2005](https://doi.org/10.1111/j.1461-0248.2005.00826.x)). Decide this from the biology, not from a test on the same data.

**Sequencing reads.** Read counts per gene are counts too, but thousands of genes are tested at once with few replicates. Use a dedicated tool such as DESeq2 or edgeR, which share information about dispersion across genes ([Love et al. 2014](https://doi.org/10.1186/s13059-014-0550-8); [Robinson et al. 2010](https://doi.org/10.1093/bioinformatics/btp616)), and normalise for library size inside the tool.

**What to do:** treat these as separate designs with their own methods.

## Run it in R and Python

Both read [lesions.csv](/guides/statistical-tests-for-count-data/lesions.csv) and print the dispersion, then the quasi-Poisson rate ratio with its 95% CI, t, degrees of freedom and p-value. The R code also fits the negative binomial and, in step 4, gives the F-referred likelihood-ratio p-value for a sensitivity analysis. Your file needs the columns `group`, `area_mm2` and `lesions`, with the group labels `vehicle` and `drug` (or change those names in the code); keep it in the folder you run the script from.

```r
library(MASS)   # glm.nb; install once with install.packages("MASS")
d <- read.csv("lesions.csv")   # one row per mouse: group, area_mm2, lesions
d$group <- factor(d$group, levels = c("vehicle", "drug"))   # labels must match your file exactly
stopifnot(!anyNA(d$group))     # stops here if a label in the file is spelled differently

# 1. Dispersion after fitting: above 1 means the Poisson SE is too small
po <- glm(lesions ~ group + offset(log(area_mm2)), family = poisson, data = d)
cat(sprintf("Pearson dispersion: %.2f\n", sum(residuals(po, type = "pearson")^2) / po$df.residual))

# 2. Quasi-Poisson: rate ratio with a t-based 95% CI, t, df and p-value
qp <- glm(lesions ~ group + offset(log(area_mm2)), family = quasipoisson, data = d)
s <- summary(qp)$coefficients["groupdrug", ]
ci <- exp(s[["Estimate"]] + c(-1, 1) * qt(0.975, qp$df.residual) * s[["Std. Error"]])
cat(sprintf("Rate ratio %.2f, 95%% CI %.2f to %.2f, t(%d) = %.2f, p = %.3f\n",
            exp(s[["Estimate"]]), ci[1], ci[2], qp$df.residual, s[["t value"]], s[["Pr(>|t|)"]]))

# 3. Negative binomial with the same offset (for about 20 or more animals per group)
nb <- glm.nb(lesions ~ group + offset(log(area_mm2)), data = d)
cat(sprintf("Negative binomial rate ratio %.2f, Wald 95%% CI %.2f to %.2f\n",
            exp(coef(nb)[["groupdrug"]]), exp(confint.default(nb)["groupdrug", 1]),
            exp(confint.default(nb)["groupdrug", 2])))

# 4. Sensitivity analysis a reviewer asks for with small groups: likelihood-ratio statistic
#    referred to F(1, residual df) instead of chi-square(1) (see the simulation above)
nb0 <- glm.nb(lesions ~ offset(log(area_mm2)), data = d)
lr <- 2 * (as.numeric(logLik(nb)) - as.numeric(logLik(nb0)))
cat(sprintf("Negative binomial likelihood ratio %.2f, p = %.3f with F(1, %d)\n",
            lr, pf(lr, 1, nb$df.residual, lower.tail = FALSE), nb$df.residual))
```

```text
Pearson dispersion: 2.02
Rate ratio 2.23, 95% CI 1.25 to 3.98, t(10) = 3.09, p = 0.011
Negative binomial rate ratio 2.25, Wald 95% CI 1.40 to 3.63
Negative binomial likelihood ratio 8.24, p = 0.017 with F(1, 10)
```

```python
import numpy as np
import pandas as pd
import statsmodels.api as sm   # install once with: pip install pandas statsmodels

d = pd.read_csv("lesions.csv")   # one row per mouse: group, area_mm2, lesions
assert set(d.group) == {"vehicle", "drug"}, "group labels must match your file exactly"
X = sm.add_constant((d.group == "drug").astype(float).rename("drug"))
offset = np.log(d.area_mm2)

# 1. Dispersion after fitting: above 1 means the Poisson SE is too small
po = sm.GLM(d.lesions, X, family=sm.families.Poisson(), offset=offset).fit()
print(f"Pearson dispersion: {po.pearson_chi2 / po.df_resid:.2f}")

# 2. Quasi-Poisson (statsmodels has no quasi-Poisson family: Poisson with scale="X2" and t-based inference)
qp = sm.GLM(d.lesions, X, family=sm.families.Poisson(), offset=offset).fit(scale="X2", use_t=True)
lo, hi = np.exp(qp.conf_int().loc["drug"])
print(f"Rate ratio {np.exp(qp.params['drug']):.2f}, 95% CI {lo:.2f} to {hi:.2f}, "
      f"t({qp.df_resid:.0f}) = {qp.tvalues['drug']:.2f}, p = {qp.pvalues['drug']:.3f}")
```

```text
Pearson dispersion: 2.02
Rate ratio 2.23, 95% CI 1.25 to 3.98, t(10) = 3.09, p = 0.011
```

In statsmodels 0.15.0, `scale="X2"` with `use_t=True` gives the quasi-Poisson fit with t-based intervals on the residual degrees of freedom; on this example it matches R's `quasipoisson` to every printed digit. For the negative binomial in Python, `statsmodels.formula.api.negativebinomial` estimates the same rate ratio (2.25) with a slightly different interval (1.40 to 3.62 against R's 1.40 to 3.63); use one package and name it. With three or more groups, give `group` more levels: each coefficient is then a rate ratio against the reference group, and the pairwise comparisons need an adjustment ([which correction to use](/guides/which-multiple-comparison-correction/)).

**What to do:** keep the offset in the formula and the animal as the row.

## Check what an AI assistant ran

AI-generated code can analyse counts in ways that look reasonable but answer a different question. Check four things:

1. **Poisson without a dispersion check?** Look for `family = poisson` or `sm.families.Poisson()` with no dispersion or quasi step. Any dispersion above 1 makes the Poisson p-value too small (in the example, the dispersion of 2.02 made its standard error too small by a factor of 1.42); ask for quasi-Poisson.
2. **An offset?** If areas or times differ, the formula needs `offset(log(area))` (R) or `offset=np.log(area)` (statsmodels). Without it the model compares raw counts.
3. **Fields as animals?** Count the rows: the model should have one row per animal unless it is a mixed model with a random effect per animal.
4. **A t-test on the counts?** On log(count + 1) its p-value held its false-positive rate in our simulation, but the ratio is biased and the areas are ignored (a t-test on raw counts was not simulated); ask for a rate ratio from a count model.

**What to do:** ask for "a quasi-Poisson regression with log(area) as offset, one row per animal, reporting the rate ratio with a t-based 95% CI".

## Report it

Template, filled with the example's constructed numbers; replace every bracket with your own values:

> Lesions were counted in one section per mouse (n = [6] per group; the mouse was the experimental unit). Counts were analysed with quasi-Poisson regression with log(scored area) as an offset; the Pearson dispersion of the Poisson model was [2.02]. The lesion rate was higher with drug than with vehicle (rate ratio [2.23], 95% CI [1.25] to [3.98], t([10]) = [3.09], p = [0.011]). Analyses used [R 4.3.3].

If you planned a negative binomial model with about 20 or more animals per group, name it and give its own test statistic and p-value instead of the t value; keep the design and dispersion sentences.

If a reviewer asked for a negative binomial with small groups, add one sentence after the main result, with the numbers from step 4 of the R code:

> In a sensitivity analysis, a negative binomial model with the same offset gave a rate ratio of [2.25] (Wald 95% CI [1.40] to [3.63]; likelihood-ratio test referred to F(1, [10]), p = [0.017]).

## References

- Lazic SE (2010). The problem of pseudoreplication in neuroscientific studies: is it affecting your analysis? *BMC Neuroscience* 11:5. [doi:10.1186/1471-2202-11-5](https://doi.org/10.1186/1471-2202-11-5)
- Love MI, Huber W, Anders S (2014). Moderated estimation of fold change and dispersion for RNA-seq data with DESeq2. *Genome Biology* 15:550. [doi:10.1186/s13059-014-0550-8](https://doi.org/10.1186/s13059-014-0550-8)
- Martin TG, Wintle BA, Rhodes JR, et al. (2005). Zero tolerance ecology: improving ecological inference by modelling the source of zero observations. *Ecology Letters* 8:1235–1246. [doi:10.1111/j.1461-0248.2005.00826.x](https://doi.org/10.1111/j.1461-0248.2005.00826.x)
- O'Hara RB, Kotze DJ (2010). Do not log-transform count data. *Methods in Ecology and Evolution* 1:118–122. [doi:10.1111/j.2041-210x.2010.00021.x](https://doi.org/10.1111/j.2041-210x.2010.00021.x)
- Robinson MD, McCarthy DJ, Smyth GK (2010). edgeR: a Bioconductor package for differential expression analysis of digital gene expression data. *Bioinformatics* 26:139–140. [doi:10.1093/bioinformatics/btp616](https://doi.org/10.1093/bioinformatics/btp616)
- Ver Hoef JM, Boveng PL (2007). Quasi-Poisson vs. negative binomial regression: how should we model overdispersed count data? *Ecology* 88:2766–2772. [doi:10.1890/07-0043.1](https://doi.org/10.1890/07-0043.1)
- Warton DI, Lyons M, Stoklosa J, Ives AR (2016). Three points to consider when choosing a LM or GLM test for count data. *Methods in Ecology and Evolution* 7:882–890. [doi:10.1111/2041-210X.12552](https://doi.org/10.1111/2041-210X.12552)

## Related

- [What counts as n?](https://www.licklider.ai/guides/what-counts-as-n/)
- [ANOVA assumptions not met: what to do](https://www.licklider.ai/guides/anova-assumptions-not-met/)
- [Chi-square vs Fisher's exact test](https://www.licklider.ai/guides/chi-square-vs-fisher-exact-test/)
- [Nested data: average per animal or mixed model?](https://www.licklider.ai/guides/nested-data-mixed-model/)
- [Clonogenic survival assay](https://www.licklider.ai/guides/clonogenic-survival-assay/)

## How this page was made

- Written and published by Licklider. Recommendations cite peer-reviewed methods papers and official software documentation listed under References; cited passages were checked against the source text or abstract, and metadata and correction notices against Crossref.
- The worked example uses constructed data written by hand. Its numbers and the simulations were produced by stored code (Python with SciPy 1.18.1 and statsmodels 0.15.0; R 4.3.3 with MASS 7.3-60); Python and R agree.
- Separate review passes checked the statistics, the citations and readability before publication.
