Learn / Inside the pipeline / 06 · intervals

The observed interval: no model, just the latest year that cleared the bar

With a threshold in hand, the core measurement is almost embarrassingly simple: within one accession and one storage condition, the interval is the latest observed year where germination still met or exceeded the threshold. No curve, no extrapolation — a statement about what was actually seen.

Two rules make it honest. First, exclude the pre-storage "Initial" tests: they establish the baseline, but they aren't evidence about how seeds survive in storage. Second, require at least two data points before an accession×storage series counts — with a subtlety worth copying: the accession's global baseline may count as one of the two if it adds a year the storage series doesn't have (so baseline + one storage test can qualify for the tables), but the baseline is never fed into curve fits.

The strength of the observed interval is that it can't overreach: it never claims seeds last longer than anyone has tested. Its weakness is the mirror image — it's censored by your monitoring schedule, which is exactly what the a–b / a+ / <b notation downstream is for.

Build it yourself
library(dplyr)

observed_intervals <- function(collapsed, baselines) {
  collapsed %>%
    filter(StoreDryCode != "Initial") %>%
    left_join(baselines, by = c("Family", "TaxonName", "AcquisitionNum")) %>%
    filter(!is.na(threshold), baseline_viab > 0) %>%
    group_by(Family, TaxonName, AcquisitionNum, StoreDryCode,
             baseline_year, baseline_viab, threshold) %>%
    summarise(
      n_years = n_distinct(YearsDifference),
      max_year_meeting_p70 = {
        ok <- YearsDifference[PctGermin >= threshold]
        if (length(ok)) max(ok) else NA_real_
      },
      .groups = "drop"
    ) %>%
    # baseline may add one inclusion point if it's a new year for this storage
    mutate(n_for_inclusion = n_years +
             as.integer(!is.na(baseline_year))) %>%   # simplified; see text
    filter(n_for_inclusion >= 2)
}
The math behind this step: Observed intervals, censoring, and honest notation
The early-window baseline: what 70% is 70% ofFitting the decline: probit regression that survives perfect data