Allocating survey effort across strata

R
survey design
sampling
ecology tutorial
Equal, proportional, Neyman and cost-aware allocation in R: which strata deserve more plots, what the optimum is worth, and how much a noisy pilot costs you.
Author

Tidy Ecology

Published

2026-07-26

Once the landscape is split into strata, a second decision arrives: how many plots go where. Splitting the effort in proportion to stratum area is the obvious answer and it is a decent one, but it ignores something you often know. Some strata are far more variable than others, and a mean from a quiet stratum is already precise after a handful of plots while a noisy stratum is still wandering after twenty.

There is an exact answer to this, published by Neyman in 1934, and it is short: send effort where the variability is, not where the area is. This post derives it, measures what it is worth, adds field costs, and then asks the uncomfortable question of where the stratum variabilities are supposed to come from before the survey has happened.

The same landscape as before

set.seed(371)

Nh   <- c(meadow = 600, wetland = 300, woodland = 300)
mu_h <- c(meadow = 12,  wetland = 26,  woodland = 5)
sd_h <- c(meadow = 4,   wetland = 9,   woodland = 2)

N       <- sum(Nh)
H       <- length(Nh)
stratum <- rep(names(Nh), Nh)
y       <- round(pmax(0, rnorm(N, rep(mu_h, Nh), rep(sd_h, Nh))), 2)

W   <- Nh / N
S2h <- tapply(y, stratum, var)[names(Nh)]
Sh  <- sqrt(S2h)
round(rbind(weight = W, sd = Sh), 3)
       meadow wetland woodland
weight  0.500   0.250    0.250
sd      4.034   8.681    1.857

The design variance of the stratified mean is the same expression as before, and it is now a function of the allocation vector rather than a fixed number:

V_str <- function(nh) sum(W^2 * (1 - nh / Nh) * S2h / nh)
n <- 120

Four ways to split 120 plots

Equal allocation gives every stratum the same number of plots. Proportional allocation follows area. Neyman allocation follows area times standard deviation, \(n_h \propto N_h S_h\). The cost-aware version divides by the square root of the per-plot cost, \(n_h \propto N_h S_h / \sqrt{c_h}\), because a plot in a stratum you reach by wading is not the same purchase as a plot beside the track.

cost <- c(meadow = 1, wetland = 4, woodland = 2)     # relative cost of one plot

alloc <- list(
  equal        = rep(n / H, H),
  proportional = n * W,
  Neyman       = n * W * Sh / sum(W * Sh),
  `cost-aware` = n * (W * Sh / sqrt(cost)) / sum(W * Sh / sqrt(cost)))

tab <- t(sapply(alloc, function(a)
  c(round(a, 1), SE = sqrt(V_str(a)), field_cost = sum(a * cost))))
round(tab, 3)
                             SE field_cost
equal        40.0 40 40.0 0.449    280.000
proportional 60.0 30 30.0 0.457    240.000
Neyman       52.0 56 12.0 0.396    299.948
cost-aware   70.6 38 11.5 0.421    245.366

Neyman sends 56 plots into the wetland, which is a quarter of the landscape, and only 12 into the woodland, which is also a quarter of it. The woodland is nearly uniform, so a dozen plots pin its mean down; the wetland is where the uncertainty lives. The standard error drops from 0.457 under proportional allocation to 0.396.

Grouped bar chart of plots per stratum under equal, proportional, Neyman and cost-aware allocation. Neyman gives the wetland the most plots and the woodland the fewest.
Figure 1: How four allocation rules split 120 plots. Neyman moves effort out of the uniform woodland and into the variable wetland; the cost-aware version pulls some of it back, because wetland plots are expensive.

What Neyman is worth, exactly

Drop the finite population correction for a moment and the two variances have clean closed forms: proportional allocation gives \(\sum_h W_h S_h^2 / n\) and Neyman gives \((\sum_h W_h S_h)^2 / n\). The gap between them is therefore a weighted variance of the stratum standard deviations:

\[V_{\text{prop}} - V_{\text{Neyman}} = \frac{1}{n}\left[\sum_h W_h S_h^2 - \Big(\sum_h W_h S_h\Big)^2\right] = \frac{\operatorname{Var}_W(S_h)}{n}.\]

V_prop_nofpc   <- sum(W * S2h) / n
V_neyman_nofpc <- (sum(W * Sh))^2 / n
var_W_Sh       <- (sum(W * S2h) - (sum(W * Sh))^2) / n

c(gap = V_prop_nofpc - V_neyman_nofpc, varW = var_W_Sh,
  difference = (V_prop_nofpc - V_neyman_nofpc) - var_W_Sh)
         gap         varW   difference 
5.168792e-02 5.168792e-02 1.387779e-17 

The identity holds to machine precision, 1.4e-17, and it is the useful sentence of this post: Neyman beats proportional allocation by exactly the spread of the stratum standard deviations. If the strata are equally variable, that spread is zero and the two allocations coincide. It is not a small print caveat, it is the entire mechanism. Strata chosen to separate the mean give you the gain in the previous post; strata that differ in variability give you this one, and the two are separate properties of the same partition.

The comparison that is actually fair

Neyman looks better than proportional in the table above, but look at the field cost column: it spent 300 cost units against 240, because it bought expensive wetland plots. Comparing designs at equal \(n\) flatters whichever design likes the expensive stratum. Fix the budget instead and let \(n\) float.

budget <- 300
to_budget <- function(share) {                       # scale shares to exhaust the budget
  p <- share / sum(share)
  p * budget / sum(p * cost)
}

schemes <- list(proportional = W, Neyman = W * Sh, `cost-aware` = W * Sh / sqrt(cost))
bud <- t(sapply(schemes, function(s) {
  a <- to_budget(s)
  c(round(a, 1), n = sum(a), SE = sqrt(V_str(a)), spent = sum(a * cost))
}))
round(bud, 3)
             meadow wetland woodland       n    SE spent
proportional   75.0    37.5     37.5 150.000 0.403   300
Neyman         52.0    56.0     12.0 120.021 0.396   300
cost-aware     86.3    46.4     14.0 146.720 0.375   300

At an equal budget the ranking changes. Proportional allocation buys 150 plots for the same money and reaches a standard error of 0.403; plain Neyman reaches 0.396, a much thinner margin than the fixed-\(n\) table suggested. The cost-aware rule reaches 0.375 with 147 plots. Ignoring cost does not make Neyman wrong, it makes the comparison wrong.

Bar chart of standard error for proportional, Neyman and cost-aware allocation at equal budget. Cost-aware is lowest, Neyman is close behind, proportional is highest.
Figure 2: Standard error achieved by three allocation rules on an identical field budget. The cost-aware rule wins because it buys more of the cheap strata and still concentrates on the variable one.

Neyman needs numbers you do not have yet

The awkward part: \(S_h\) is a property of the population, and allocation happens before the survey. In practice the standard deviations come from a pilot, or from last year, or from a comparable site. A pilot of ten plots per stratum gives a noisy \(\hat S_h\), and the allocation inherits the noise. Does the gain survive?

idx_h <- split(seq_len(N), stratum)[names(Nh)]
m <- 10                                              # pilot plots per stratum
B <- 2000

set.seed(3721)
V_pilot <- replicate(B, {
  sh <- vapply(idx_h, function(ix) sd(y[sample(ix, m)]), 0)
  a  <- n * W * sh / sum(W * sh)
  a  <- pmax(a, 2); a <- a * n / sum(a)              # never fewer than two plots
  V_str(a)
})

V_oracle <- V_str(alloc$Neyman)
V_propn  <- V_str(alloc$proportional)
c(median_pilot = median(V_pilot), oracle = V_oracle, proportional = V_propn,
  worse_than_proportional = mean(V_pilot > V_propn),
  gain_kept = (V_propn - median(V_pilot)) / (V_propn - V_oracle))
           median_pilot                  oracle            proportional 
              0.1605946               0.1570852               0.2087731 
worse_than_proportional               gain_kept 
              0.0035000               0.9321026 

A ten-plot pilot keeps 93 percent of the available gain, and only 0.4 percent of pilots produce an allocation worse than simply following area. That is a more comfortable answer than it might have been, and it has a reason: the variance is flat near its optimum, so a moderately wrong allocation costs very little. The optimum is worth chasing precisely because you do not have to hit it.

Histogram of realised design variance from pilot-based allocations, with vertical lines for the oracle Neyman variance on the left and the proportional variance on the right.
Figure 3: Design variance achieved by Neyman allocations planned from a ten-plot pilot, over 2000 pilots. Almost every one lands between the oracle allocation and proportional allocation.

The honest limit: one allocation, several responses

The optimum is optimal for one variable. Add a second response with a different variability profile and the two optima pull in opposite directions. Here is a ground beetle count that is scarce and even in the wetland but patchy in the woodland, the reverse of the biomass pattern:

set.seed(3722)
z_mu <- c(meadow = 3,   wetland = 1.5, woodland = 6)
z_sd <- c(meadow = 1.2, wetland = 0.8, woodland = 4.5)
z    <- round(pmax(0, rnorm(N, rep(z_mu, Nh), rep(z_sd, Nh))), 2)

S2hz <- tapply(z, stratum, var)[names(Nh)]
Shz  <- sqrt(S2hz)
V_z  <- function(nh) sum(W^2 * (1 - nh / Nh) * S2hz / nh)
neyman_z <- n * W * Shz / sum(W * Shz)

rbind(sd_biomass = Sh, sd_beetles = Shz,
      `Neyman for biomass` = alloc$Neyman, `Neyman for beetles` = neyman_z)
                      meadow    wetland  woodland
sd_biomass          4.033675  8.6808597  1.856675
sd_beetles          1.195721  0.8225898  4.086356
Neyman for biomass 52.033756 55.9908413 11.975403
Neyman for beetles 39.309290 13.5213059 67.169404
c(beetle_V_under_biomass_plan = V_z(alloc$Neyman),
  beetle_V_under_own_plan     = V_z(neyman_z),
  beetle_V_under_proportional = V_z(alloc$proportional))
beetle_V_under_biomass_plan     beetle_V_under_own_plan 
                 0.09055812                  0.02354265 
beetle_V_under_proportional 
                 0.03793961 

The allocation that is optimal for biomass is 3.8 times worse than the beetle optimum, and, more to the point, 2.4 times worse than plain proportional allocation for the beetles. Optimising hard for one response can leave a second response worse off than making no attempt at all. For a multi-purpose survey, proportional allocation is the safer default; a compromise allocation, weighted across the responses that matter, is the honest middle path, and it is optimal for none of them.

Two smaller limits are worth naming. Neyman allocation can hand a stratum more plots than it contains, \(n_h > N_h\), when a small stratum is very variable; in that case you census it and re-optimise over the rest. And every stratum needs at least two plots or its variance is not estimable, which quietly puts a floor under the whole exercise.

Where to go next

Both posts so far assumed the map: known stratum sizes, known stratum membership for every plot. Field surveys frequently start without one. The next post takes a large cheap first phase to build the strata, a small expensive second phase to measure the response, and works out how to split a budget between the two.

References

Neyman 1934 J R Stat Soc 97(4):558-625 (10.2307/2342192)

Tschuprow 1923 Metron 2:461-493

Cochran 1977 Sampling Techniques, 3rd edn, Wiley; ISBN 978-0-471-16240-7

Sarndal, Swensson and Wretman 1992 Model Assisted Survey Sampling, Springer; ISBN 978-0-387-40620-6

Gregoire and Valentine 2008 Sampling Strategies for Natural Resources and the Environment, Chapman and Hall; ISBN 978-1-58488-370-8

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.