Breed only from the largest, and the next generation slides partway toward them. How far it slides is the whole question.
Population of N = 2000 individuals with trait z ~ Normal(0, 1). Pick the top-fraction f as breeders. Compute the population mean z̄, the breeder mean z̄_b. S = z̄_b − z̄.
set.seed(42)N <- 2000; z <- rnorm(N); f <- 0.2thr <- quantile(z, 1-f)S <- mean(z[z >= thr]) - mean(z)
Only the breeders from Stage A have offspring. How much of a parent's departure from the herd shows up in its offspring is set by the carry-over dial. Run it for twenty generations and watch where the herd average goes.
set.seed(42)N <- 2000; h2 <- 0.5; f <- 0.2; gens <- 20z <- rnorm(N); means <- mean(z)for (g in 1:gens) { thr <- quantile(z, 1-f); br <- z[z >= thr] z <- h2 * sample(br, N, replace=TRUE) + sqrt(1-h2) * rnorm(N) means <- c(means, mean(z))}
Long-run selection. Plot the mean trait AND additive variance over generations. h² is rebuilt by mutational input each generation; without it, h² collapses to 0 and selection stops working.
# Track additive variance over time; new mutations refill it.# Realistic model needs a genetic architecture; here we approximate.
Grant finch beak depth from data/clean/grant_finches_40y.csv. Each year: mean beak depth, breeder mean, S. Next year: mean beak depth (= response R). h² is estimated as R/S for that pair.
finches <- read.csv("data/clean/grant_finches_40y.csv")# Per year: mean beak depth, mean breeder beak depth, next-year meanfit <- lm(R ~ 0 + S, data = year_pairs)coef(fit) # slope = h²