Checking an Allee analysis

ecology tutorial
R
population ecology
model diagnostics
conservation
Three checks for an Allee effect in R: why detection needs low-density data, how sampling error fakes density dependence, and strong versus weak Allee.
Author

Tidy Ecology

Published

2026-07-30

An Allee effect is easy to propose and hard to prove. The mechanism is plausible for almost any species, mates get scarce, groups get too small, and the consequences for conservation are serious, so the temptation is to assume one is present. The evidence base is much thinner than the literature’s attention would suggest (Kramer et al. 2009 Population Ecology 51(3):341-354), and the reasons are three specific problems that any analysis should confront.

Check 1: is there any low-density data?

The Allee signature is positive density dependence: per-capita growth rising with density. It lives at low density, below the critical threshold, and it is invisible everywhere else. Fit per-capita growth against density using only the densities a healthy population occupies and you will find ordinary crowding, a downward slope, and conclude there is no Allee effect, when the whole point is what happens below where you looked.

r <- 0.5; K <- 100; A <- 30
pgr <- function(N) r*(1 - N/K)*(N/A - 1)              # the true dynamics have a strong Allee effect
c(slope_high_density = unname(sl_hi), slope_low_density = unname(sl_lo))
slope_high_density  slope_low_density 
     -0.0005768715       0.0174335616 

Fitted on densities above 40, per-capita growth slopes down at -0.0006: textbook negative density dependence, no hint of an Allee effect. Fitted on densities below the threshold of 30, it slopes up at 0.0174, the Allee signature. Same population, opposite conclusions, decided entirely by which densities were sampled. The cruelty of it is that the low densities are exactly the hardest to observe: a population rare enough to be in Allee territory is rare enough to be hard to find and count.

dd <- data.frame(N = Nobs, pc = pc, band = ifelse(Nobs < A, "low density", "high density"))
ggplot(dd, aes(N, pc)) +
  geom_hline(yintercept = 0, colour = col_ref, linewidth = 0.3) +
  geom_point(aes(colour = band), size = 2, alpha = 0.7) +
  geom_smooth(data = subset(dd, N < A), method = "lm", se = FALSE, colour = col_lo, linewidth = 0.9) +
  geom_smooth(data = subset(dd, N > 40), method = "lm", se = FALSE, colour = col_hi, linewidth = 0.9) +
  scale_colour_manual(values = c("low density" = col_lo, "high density" = col_hi)) +
  labs(x = "Population density", y = "Per-capita growth rate", colour = NULL,
       title = "The Allee effect is only visible where data are scarce")
Scatter of per-capita growth against density with two fitted lines; the low-density line slopes up while the high-density line slopes down, showing the Allee effect only appears at low density.
Figure 1: Per-capita growth against density for a population with a strong Allee effect. The low-density points (ochre) trend upward, the Allee signature; a fit to the high-density points alone (green) trends down and misses it entirely.

Check 2: is the density dependence real or a measurement artefact?

Suppose you do have counts across a range of densities. Counts are estimates, and estimates carry error, and error alone manufactures density dependence through regression to the mean. A year whose count happens to be over-estimated is usually followed by a lower count, not because the population declined but because the next estimate is closer to the truth. That looks exactly like decline following high density.

set.seed(402)
Ntrue <- 60; for (t in 2:200) Ntrue[t] <- Ntrue[t-1]*exp(rnorm(1, 0, 0.10))  # NO density dependence
obs <- Ntrue*exp(rnorm(200, 0, 0.25))                                        # counts with 25% error
c(slope_true_N = unname(sl_true), slope_observed_N = unname(sl_err))
    slope_true_N slope_observed_N 
    -0.000258183     -0.002637789 

The true dynamics here are density-independent, a random walk: the slope of growth on the true density is -0.0003, indistinguishable from zero. Regress the same growth on the observed density and the slope is -0.0026, an order of magnitude larger and firmly negative: spurious density dependence conjured entirely by observation error. The same mechanism can hide a real Allee effect or fake one. The check is to model the observation error, with a state-space model, or to use independent estimates for density and for growth so the error in one does not drive the other.

dr <- data.frame(N = obs[-200], g = diff(log(obs)))
ggplot(dr, aes(N, g)) +
  geom_hline(yintercept = 0, colour = col_ref, linewidth = 0.3) +
  geom_point(colour = col_ref, size = 1.6, alpha = 0.5) +
  geom_smooth(method = "lm", se = FALSE, colour = col_lo, linewidth = 1) +
  labs(x = "Observed density", y = "Per-capita growth rate",
       title = "Measurement error alone makes density dependence appear")
Scatter of per-capita growth against observed density with a downward-sloping fitted line, despite the underlying dynamics having no density dependence.
Figure 2: Regression to the mean. The population is density-independent, yet plotting growth against the error-laden count (points, ochre fit) produces a clear downward slope that is pure measurement artefact.

Check 3: strong, weak, or none?

Even with honest low-density data, the three cases that matter for conservation, a strong Allee effect with a threshold, a weak one without, and no Allee effect, are hard to separate, because they differ only in the sparse low-density region and the data there are few and noisy. A model can be fitted, but the confidence interval on the critical density is usually wide, often running down to zero, which means the data cannot rule out “no threshold”. Report that interval honestly rather than a point estimate of the threshold, and resist reading a fitted A as if it were measured.

The precautionary reading

These checks mostly deliver bad news: the effect is real in theory, hard to detect in practice, and easy to fake with noise. That asymmetry has a consequence for how the absence of evidence should be read. Failing to detect an Allee effect in a data set that never sampled low densities, or that carries ordinary counting error, is not evidence that none exists. For a species being managed down toward small numbers, the cost of wrongly assuming safety is extinction, and the cost of wrongly assuming a threshold is caution. The honest analysis states what the data can and cannot see, and where they cannot see, it errs toward the threshold being real.

References

  • Kramer AM et al. 2009. Population Ecology 51(3):341-354 (10.1007/s10144-009-0152-6).
  • Stephens PA, Sutherland WJ, Freckleton RP 1999. Oikos 87(1):185-190 (10.2307/3547011).
  • Taylor CM, Hastings A 2005. Ecology Letters 8(8):895-908 (10.1111/j.1461-0248.2005.00787.x).

Newsletter

Get new tutorials by email

New R and QGIS tutorials for ecologists, straight to your inbox. No spam; unsubscribe anytime.

By subscribing you agree to receive these emails and confirm your address once. See the privacy policy.