First flowering dates and sampling effort

R
phenology
extreme values
ggplot2
ecology tutorial
Why the first flowering date advances as monitoring effort grows while the mean date stays put: the extreme-value bias behind spurious phenological shifts, in R.
Author

Tidy Ecology

Published

2026-07-22

The first flowering date, or first arrival date, is the most widely reported phenological statistic. It is easy to record, it needs no counting, and a run of ever-earlier first dates is the headline evidence that spring is advancing. But the first date has a property that makes it treacherous: it depends on how hard you look. Watch more plants, or visit more often, and the first date moves earlier on its own, with nothing in the biology having changed. This post pins that down with a simulation and shows why the mean and median dates do not have the problem.

The set-up: one fixed population, different amounts of effort

Suppose the individual flowering dates in a population follow a fixed distribution, centred on day 130 with a standard deviation of 12 days. This distribution does not change. What changes is the number of plants we happen to monitor, which I will call the effort. The first observed date is just the earliest flowering date among the plants we watched.

mu <- 130; sdev <- 12
draw_pop <- function(n) round(rnorm(n, mu, sdev))   # n monitored plants, fixed phenology

The first date is the minimum of the sample. That single word, minimum, is the whole story: the more plants you draw, the further into the early tail the minimum reaches. Let me simulate this across a range of effort levels, drawing many replicate samples at each level and averaging, so we see the expected behaviour rather than one noisy realisation.

set.seed(202)
efforts <- c(5, 15, 50, 150, 500)
R <- 4000
sim <- lapply(efforts, function(n) {
  m <- replicate(R, { x <- draw_pop(n); c(min(x), mean(x), median(x)) })
  list(first = m[1, ], mean = m[2, ], median = m[3, ])
})
res <- data.frame(
  effort = efforts,
  first  = sapply(sim, function(s) mean(s$first)),
  mean   = sapply(sim, function(s) mean(s$mean)),
  median = sapply(sim, function(s) mean(s$median)))
res$depth <- (mu - res$first) / sdev            # first date's depth below the mean, in SDs
round(res, 2)
  effort  first   mean median depth
1      5 115.79 129.81 129.81  1.18
2     15 109.04 129.93 129.89  1.75
3     50 103.04 130.02 130.03  2.25
4    150  98.26 130.00 129.99  2.65
5    500  93.58 130.00 130.00  3.03

The result

Monitoring 5 plants, the average first date is day 115.8. Monitoring 500, it is day 93.6. That is an advance of 22.2 days from a hundredfold change in effort alone, with the population phenology held exactly fixed. Meanwhile the mean date barely moves (its range across all effort levels is 0.2 days) and the median is just as steady (0.2 days). The mean and the median are consistent estimators of the centre of the distribution; the first date is an estimator of nothing stable, because the true minimum of an unbounded distribution keeps receding as you sample more.

long <- rbind(
  data.frame(effort = res$effort, day = res$first,  metric = "first date"),
  data.frame(effort = res$effort, day = res$mean,   metric = "mean date"),
  data.frame(effort = res$effort, day = res$median, metric = "median date"))
ggplot(long, aes(effort, day, colour = metric)) +
  geom_line(linewidth = 0.9) + geom_point(size = 2.4) +
  scale_x_log10(breaks = efforts) +
  scale_colour_manual(values = c("first date" = terra, "mean date" = forest,
                                 "median date" = gold)) +
  labs(x = "plants monitored (log scale)", y = "day of year", colour = NULL)
Three lines against log effort from 5 to 500 plants. The first-date line falls from about day 116 to about day 94, while the mean and median lines stay flat near day 130.
Figure 1: The expected first date advances steeply with monitoring effort (note the log scale), while the mean and median dates stay flat. The population phenology is identical at every point.

Why: the first date is an extreme value

The last column of the table, depth, makes the mechanism explicit. It is how far below the population mean the first date sits, measured in standard deviations. At 5 plants the first date is 1.18 standard deviations below the mean; at 500 plants it is 3.03 below. That growing depth is not arbitrary. It is the expected minimum of a sample of standard normals, a quantity that increases without bound as the sample grows. The first date is a block minimum, and it behaves exactly the way extreme-value theory says a block minimum should: pushed steadily into the tail by larger samples. The block maxima and the GEV tutorial develops that theory for the maximum; the minimum is its mirror image.

Seeing the whole sampling distribution makes the point vivid. Below are the distributions of the first date across replicate samples at three effort levels. As effort rises, the entire distribution of possible first dates slides earlier and tightens.

pick <- match(c(5, 50, 500), efforts)
dens <- do.call(rbind, Map(function(i, lab)
  data.frame(first = sim[[i]]$first, effort = lab),
  pick, factor(c("5 plants", "50 plants", "500 plants"),
               levels = c("5 plants", "50 plants", "500 plants"))))
ggplot(dens, aes(first, fill = effort, colour = effort)) +
  geom_density(alpha = 0.35, linewidth = 0.6) +
  geom_vline(xintercept = mu, linetype = 2, colour = "#16241d") +
  annotate("text", x = mu, y = 0.001, label = "mean date", hjust = -0.05,
           angle = 90, size = 3.2, colour = "#16241d") +
  scale_fill_manual(values = c("5 plants" = gold, "50 plants" = mown,
                               "500 plants" = forest)) +
  scale_colour_manual(values = c("5 plants" = gold, "50 plants" = mown,
                                 "500 plants" = forest)) +
  labs(x = "first observed date (day of year)", y = "density", fill = NULL, colour = NULL) +
  guides(colour = "none")
Three density curves for the first date. At 5 plants the curve is centred near day 116 and wide; at 50 near day 103; at 500 near day 94 and narrow. A dashed vertical line marks the fixed mean date at 130.
Figure 2: The sampling distribution of the first date at three effort levels. More effort shifts the whole distribution earlier and narrows it; the mean date (dashed) does not move.

Why this matters for real records

Almost no long-term phenology record holds effort constant. Herbarium collections, volunteer recording schemes and community-science platforms all grow over time, so later years are watched by more people than earlier years. Read through the lens of this simulation, that growth alone drives the first date earlier, manufacturing an advancing trend from a rising number of observers. Miller-Rushing and colleagues showed exactly this for flowering dates, that mean and median dates stay stable across sample sizes while first and last dates do not, and van Strien and colleagues found the first-appearance date of butterflies is sensitive both to the number of monitoring sites and to population trend. The safe move is to report a central summary, the mean or a percentile date, and to reserve the first date for cases where effort really is fixed and comparable.

Where to go next

The effort bias in the first date is not just a nuisance for single seasons; it contaminates trends across years and the sensitivity of phenology to temperature, because effort itself usually trends over time. The next tutorial estimates those trends and shows how the effort confound inflates them, and how the mean date escapes it.

References

Miller-Rushing AJ, Inouye DW, Primack RB 2008. Journal of Ecology 96(6):1289-1296 (10.1111/j.1365-2745.2008.01436.x)

van Strien AJ, Plantenga WF, Soldaat LL, van Swaay CAM, WallisDeVries MF 2008. Oecologia 156(1):227-235 (10.1007/s00442-008-0959-4)

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.