13Pre-Survey Planning: Sample Size and Schedule Design
Author
Christopher Chizinski
Keywords
creel survey, fisheries, design-based inference, R, tidycreel, Quarto
A creel survey that finishes the season with a 45% CV on the effort estimate has not merely underperformed — it has wasted field resources and produced information that cannot support management decisions. The time to prevent that outcome is before the first count sheet is printed, not after the data have been collected. Pre-survey planning translates management objectives into concrete resource commitments: how many sampling days, how many angler interviews, and when to schedule them.
This chapter covers the prospective side of survey design. Where Chapter 15 asks “how precise was my estimate?”, this chapter asks “how many sampling units do I need to achieve a target precision?” The two questions are mirrors of each other, and tidycreel provides a dedicated suite of functions for both.
13.1 The planning inputs
Three quantities are needed before any sample size calculation can be run.
A precision target. Agency standards differ, but a coefficient of variation (CV) of 20% or less is widely cited as the threshold for a management-grade creel estimate (Pollock et al. 1994; McCormick and Meyer 2017). A target CV of 15% is more demanding but achievable on productive fisheries with moderate sampling effort. The CV target must be stated before the survey begins; setting it retrospectively invites motivated reasoning.
A stratification frame (N_h). The total number of eligible sampling days per stratum — the frame — bounds how much precision is achievable regardless of effort. For a day-type-stratified survey, N_h comes from the season calendar: count the weekdays and weekend days in the planned season window.
Pilot variance estimates (ybar_h, s2_h). Sample size formulas require between-day variance within each stratum. For a new fishery with no prior data, the literature suggests starting with a budget of approximately 30 sampling days and iterating (McCormick and Meyer 2017). For an established program, historical data from previous seasons provide reliable variance estimates.
The Harlan reservoir survey has been running long enough that a completed season can serve as the pilot for planning the next one. The following chunk extracts the three planning inputs from the 2022 Harlan data.
# Season frame: eligible days per stratumN_h <- harlan_schedule |>group_by(day_type) |>summarise(N =n(), .groups ="drop")N_h
# A tibble: 2 × 2
day_type N
<chr> <int>
1 weekday 150
2 weekend 61
The Harlan 2022 season ran across 211 calendar days: 150 weekdays and 61 weekend/holiday days. Weekday effort is on average more than twice the weekend mean (375 vs 162 angler-hours per sampled day), and between-day variance is correspondingly larger in the weekday stratum.
These six values — N_h, ybar_h, and s2_h for each of the two strata — are everything creel_n_effort() needs.
13.2 How many sampling days?
creel_n_effort() implements the stratified sample size formula from McCormick and Meyer (2017), based on Cochran ((1977)) eq. 5.25. It returns the total number of sampling days needed to achieve a target CV on the effort estimate, along with the proportional allocation of those days to each stratum.
Twenty-eight sampling days are sufficient to hit a 20% CV on effort for the Harlan 2022 design. Of those, 20 fall in the weekday stratum and 9 in the weekend stratum, reflecting proportional allocation to season length. Tightening the target to 15% requires 45 days:
The relationship between CV target and required days follows a familiar pattern: precision improves rapidly at first, then diminishing returns set in. Cutting the CV from 25% to 20% costs only 9 additional sampling days; cutting it from 15% to 10% costs 33 more. This trade-off is most clearly seen as a curve.
Warning: The `label.size` argument of `geom_label()` is deprecated as of ggplot2 3.5.0.
ℹ Please use the `linewidth` argument instead.
Figure 13.1: Required sampling days versus target effort CV. Diminishing returns are steep: each incremental gain in precision demands disproportionately more sampling days. Reference lines mark commonly used agency thresholds.
An important caveat: these sample sizes are minimums under the assumption that observations are distributed according to the pilot variances. Real variances fluctuate between years. A prudent practice is to add a 10–15% buffer to the computed minimum or to re-run the calculation mid-season if conditions differ substantially from the pilot year.
13.3 How many interviews?
Effort precision is driven by the number of sampling days. CPUE precision is driven by the number of angler interviews. The two sample sizes are independent because they estimate different things: effort uses count data collected by surveyors, while CPUE uses per-party catch and effort reported by anglers.
creel_n_cpue() computes the number of interviews required to achieve a target CV on the CPUE ratio estimator (Cochran 1977, Ch. 6). It requires pilot CVs for catch and effort per interview, plus the correlation between them.
Code
catch_by_interview <- harlan_catch |>group_by(interview_id) |>summarise(n_fish =sum(n_fish), .groups ="drop")interviews_pilot <- harlan_interviews |>left_join(catch_by_interview, by ="interview_id") |>mutate(n_fish =if_else(is.na(n_fish), 0L, as.integer(n_fish)))cv_catch <-sd(interviews_pilot$n_fish) /mean(interviews_pilot$n_fish)cv_effort <-sd(interviews_pilot$hours_fished) /mean(interviews_pilot$hours_fished)rho <-cor(interviews_pilot$n_fish, interviews_pilot$hours_fished)tibble(statistic =c("CV of catch per interview", "CV of effort per interview", "Correlation (rho)"),value =round(c(cv_catch, cv_effort, rho), 3))
# A tibble: 3 × 2
statistic value
<chr> <dbl>
1 CV of catch per interview 1.62
2 CV of effort per interview 0.738
3 Correlation (rho) 0.347
Catch is highly variable relative to its mean (CV ≈ 1.6), which is typical of recreational fisheries: most parties catch nothing while a few catch many fish. Effort (hours fished per party) is less dispersed (CV ≈ 0.7). The positive correlation between catch and effort (ρ ≈ 0.35) means that parties who fish longer also tend to catch more — a signal of behavioral variation across angler types.
Code
# Conservative estimate (rho = 0 over-estimates n when catch and effort covary)creel_n_cpue(cv_catch = cv_catch,cv_effort = cv_effort,rho =0,cv_target =0.20)
[1] 80
Code
# Less conservative: use observed correlationcreel_n_cpue(cv_catch = cv_catch,cv_effort = cv_effort,rho = rho,cv_target =0.20)
[1] 59
Setting rho = 0 is conservative: it over-estimates the required sample size because it ignores the variance-reducing effect of positive catch–effort covariance. The observed ρ = 0.35 reduces the 20%-CV interview requirement from 80 to 59. Using the observed correlation is appropriate when pilot data are reliable; in the absence of pilot data, the conservative rho = 0 default is the safer choice.
A practical minimum of 100 interviews is also widely recommended. Below that threshold, the ratio estimator’s confidence interval coverage may fall short of its nominal 95% even if the formula suggests fewer interviews are needed, because the distribution of catch per angler is highly right-skewed (Pollock et al. 1994).
13.4 Working backwards from a fixed budget
Planning calculations usually run in the forward direction: “I need CV = 20%; how many days?” But managers sometimes allocate a fixed number of sampling days before the precision question is asked, and the analyst must then characterize what that budget can deliver.
cv_from_n() inverts the sample size formula: given a fixed number of sampling units, what CV should you expect? Set type = "cpue" for interviews or type = "effort" for sampling days.
Code
# Director approves 60 interviews: what CPUE CV is achievable?cv_from_n(type ="cpue",n =60L,cv_catch = cv_catch,cv_effort = cv_effort,rho =0# conservative)
Sixty interviews delivers an expected CPUE CV of about 23%, which may exceed the agency’s 20% threshold. One hundred interviews brings the CV to 18%, comfortably within standard precision targets. If neither budget is achievable, this output makes the trade-off explicit and auditable — a more defensible position than an after-the-fact rationalization of inadequate precision.
13.5 Allocating days across strata
Once the total number of sampling days is determined, they must be distributed across strata. Two allocation strategies dominate creel survey practice: proportional allocation assigns days in proportion to each stratum’s share of the season calendar; Neyman (optimal) allocation directs more days to strata with higher between-day variance, minimizing total variance for a fixed sample budget (Cochran 1977; Pollock et al. 1994).
reallocate_strata() computes Neyman-optimal allocation given a fixed day budget and stratum-level pilot variances.
For the Harlan design, Neyman allocation adds 5 days to the weekday stratum and removes 4 from the weekend stratum relative to proportional (32→37 weekday, 13→9 weekend). The weekday stratum has both more calendar days and substantially higher between-day variance (161,734 vs 54,123), so directing additional sampling effort there reduces the overall variance of the effort estimate.
Figure 13.2: Proportional versus Neyman allocation of 45 sampling days across day-type strata. Neyman allocation concentrates effort in the weekday stratum, which has both more eligible days and higher between-day variance.
Neyman allocation is most beneficial when strata differ substantially in variance. When strata have similar within-stratum variability, proportional allocation performs nearly as well and has the practical advantage of simplicity: interviewers can be scheduled without knowledge of historical variance estimates, and the allocation is easier to explain to field crews and managers.
optimal_n() combines the two steps — total sample size and Neyman allocation — into a single call. Rather than first computing creel_n_effort() and then calling reallocate_strata(), optimal_n() takes the CV target directly and returns both the required total days and the per-stratum allocation:
The result shows total days required under Neyman allocation to hit the target CV, alongside the per-stratum breakdown. For the Harlan design, optimal_n() returns the same total (28) as creel_n_effort() at this CV target, but allocates differently: 23 weekday / 6 weekend (Neyman) versus 20 weekday / 9 weekend (proportional). Neyman allocation concentrates days in the weekday stratum because that stratum has both more calendar days and higher between-day variance. When strata variances differ substantially across surveys, Neyman allocation can require fewer total days than proportional for the same precision target; for the Harlan design the totals happen to be equal, and the practical benefit is the more efficient per-stratum split.
13.6 Power to detect a change
CV targets address precision, not the capacity to detect change. A survey that delivers a 20% CV on a seasonal CPUE estimate can still fail to detect a biologically important regulation effect if individual catch rates are highly variable. creel_power() calculates the probability of detecting a fractional change in CPUE between two seasons given the number of interviews per season, the historical CV of individual CPUE measurements, and a significance threshold.
The key input is cv_historical: the coefficient of variation of CPUE measured from individual interviews (fish per hour per completed trip). This reflects how heterogeneous anglers are — a fishery where most parties catch similar amounts has a low CV; one where a few parties catch most of the fish has a high CV. For Harlan:
Harlan’s CV of 2.66 is typical of multi-species recreational fisheries where zero-catch parties are common: the distribution of individual catch rates is strongly right-skewed, driving up the standard deviation relative to the mean. High cv_historical means that detecting a moderate regulation effect requires substantially more interviews than the precision target alone implies.
Code
# 390 interviews is the approximate Harlan annual samplecreel_power(n =390L,cv_historical = cv_historical,delta_pct =0.20,alpha =0.05,alternative ="two.sided")
[1] 0.182395
With 390 interviews per season — the approximate Harlan annual sample — power to detect a 20% CPUE change is only about 18%. Even a 50% change is below 80% power at that sample size:
This is not a failure of the Harlan survey design; it reflects the inherent difficulty of detecting moderate changes in CPUE when individual catch rates are heterogeneous. The power curve illustrates how detection threshold depends on both sample size and individual-level variability.
Warning: Removed 93 rows containing missing values or values outside the scale range
(`geom_line()`).
Figure 13.3: Statistical power to detect a fractional CPUE change as a function of interviews per season, for three effect sizes. Solid curves use the Harlan pilot CV (2.66); dashed curves show a hypothetical lower-variance fishery (CV = 0.80) as a contrast. Power is calculated using a two-sided normal approximation at α = 0.05.
Two contrasts stand out. First, for the low-variance fishery (CV = 0.80, dashed), 80% power to detect a 30% change requires only about 120 interviews — a feasible season target. For Harlan (CV = 2.66, solid), the same target requires more than 1,200 interviews per season. Second, a 50% CPUE change is detectable with 80% power at approximately 450 interviews for Harlan — a large but not impossible sample if the survey priority justifies it.
The practical implication: power analysis for CPUE change detection should be conducted early in the planning cycle, before interview targets are set, so that resource decisions reflect the actual detection capacity of the survey. A survey with adequate precision (CV ≤ 20%) may still have limited power to detect realistic regulation effects on heterogeneous fisheries.
13.7 Translating days to a calendar
Sample size outputs are unitless numbers: “sample 32 weekdays and 14 weekend days.” Turning those numbers into a field schedule requires randomly assigning specific dates within each stratum across the season window. generate_schedule() does this: it takes a date range and stratum-specific day counts and returns a stratified random sample of survey dates.
The output is a creel_schedule object with one row per sampled day × period — ready to pass directly to creel_design() when the survey begins. A quick diagnostic check confirms that the selected days spread reasonably across the season.
Code
planned_schedule |>mutate(month = lubridate::month(date, label =TRUE, abbr =TRUE)) |>distinct(date, day_type, month) |>count(month, day_type) |>mutate(day_type =case_match(day_type, "weekday"~"Weekday", "weekend"~"Weekend")) |>ggplot(aes(x = month, y = n, fill = day_type)) +geom_col(position ="stack", width =0.65) +scale_fill_manual(values =c("Weekday"="#2171b5", "Weekend"="#9ecae1")) +scale_y_continuous(breaks =0:10) +labs(x =NULL, y ="Sampling days", fill ="Day type") +theme_creel() +theme(legend.position ="top")
Warning: There was 1 warning in `mutate()`.
ℹ In argument: `day_type = case_match(day_type, "weekday" ~ "Weekday",
"weekend" ~ "Weekend")`.
Caused by warning:
! `case_match()` was deprecated in dplyr 1.2.0.
ℹ Please use `recode_values()` instead.
Figure 13.4: Distribution of planned sampling days by month and day type from the generated 2023 Harlan schedule. Stratified random selection spreads days across the April–October season without heavy concentration in any single month.
The stratified random selection ensures that sampled days are spread across the season rather than concentrated in any one month, which protects against confounding seasonal variation with stratum effects.
If the season window shifts or some dates become unavailable (access closures, equipment failure), generate_schedule() can be re-run with a new seed to produce a replacement schedule. Each call produces a statistically valid design as long as the selected dates remain a random sample within strata.
13.8 A planning workflow for the 2023 Harlan season
The six functions form a decision sequence. Below is the complete planning workflow for a hypothetical 2023 Harlan season, using 2022 as the pilot year.
Step 3 — Check against budget and revise if needed.
The 45-day effort target and 80-interview CPUE target are both feasible for a season-long Harlan survey. If the field budget supports only 30 sampling days, cv_from_n() characterizes the precision achievable at that budget for both effort and CPUE:
Code
# What effort CV is achievable with 30 sampling days?cv_from_n(type ="effort",n =30L,N_h = N_hv,ybar_h = ybar_hv,s2_h = s2_hv)
[1] 0.2106217
Thirty days yields a higher effort CV than the 20% target, making the precision trade-off explicit and auditable before the field season begins. The same call with type = "cpue" and n = 60 or n = 100 was shown earlier in Section 13.4.
# A tibble: 7 × 3
month weekday weekend
<ord> <int> <int>
1 Apr 5 0
2 May 4 0
3 Jun 7 1
4 Jul 7 3
5 Aug 6 2
6 Sep 5 2
7 Oct 3 1
The calendar table shows how the 46 allocated sampling days distribute across strata and months (Neyman integer rounding adds one day above the 45-day target). A roughly even spread across the April–October window is desirable; heavy concentration in any one month would bias estimates toward conditions in that month. If a gap appears — for instance, no weekend days scheduled in June — generate_schedule() can be re-run with different seeds until a more balanced calendar is produced, or n_days can be specified per month by using the period_intensity argument.
13.9 What to do without pilot data
Not every new survey has a historical season to draw on. Three options exist in order of preference:
Conduct a short pilot study — 10–15 sampling days spread across the season will produce rough variance estimates sufficient for planning purposes. The resulting sample sizes will be uncertain, but the direction of error is known: early-season variance often underestimates full-season variance in temperate fisheries.
Borrow from a similar fishery — If a nearby reservoir with comparable species composition and angler density has historical creel data, its within-stratum variance can serve as a proxy. Adjust upward if the target fishery is expected to be more heterogeneous.
Use the literature defaults — McCormick and Meyer (2017) report that across 17 inland fisheries, a median of 16 sampling days achieved a 40% relative 95% CI for effort, and approximately 30 days is a reasonable starting point when variance is unknown. For CPUE, a minimum of 100 interviews provides adequate CI coverage even under highly skewed catch distributions (Pollock et al. 1994).
None of these options is as reliable as observed pilot data from the target fishery. But planning under uncertainty is still better than no planning: a 30-day default budget forces an explicit precision conversation before the field season begins, rather than a post-hoc reckoning with an inadequate estimate.
13.10tidycreel support
Function
Purpose
creel_n_effort()
Sampling days for a target effort CV (proportional allocation)
creel_n_cpue()
Interviews for a target CPUE CV
cv_from_n()
Expected CV given a fixed number of sampling units; type = "effort" or type = "cpue"
optimal_n()
Sampling days and Neyman-optimal per-stratum allocation for a target effort CV
reallocate_strata()
Neyman-optimal allocation across strata given a fixed day budget
creel_power()
Power to detect a fractional CPUE change
generate_schedule()
Stratified random sampling calendar
generate_progressive_start()
Randomised circuit start times for progressive count surveys (discrete or wraparound strategy); avoids the U[0, T − τ] mid-day bias error per Hoenig et al. (1993)
All functions that take stratum-level arguments expect named vectors. Names must match across N_h, ybar_h, and s2_h; mismatched names will produce an error. The output of generate_schedule() is a creel_schedule object that passes directly to creel_design() without further transformation. For roving surveys using progressive counts, generate_progressive_start() produces a companion table of circuit start times and travel directions to be recorded in the field protocol alongside the schedule.
13.11 Takeaway
Pre-survey planning converts management objectives into field commitments. creel_n_effort() answers the effort question; creel_n_cpue() answers the CPUE question; reallocate_strata() distributes days optimally across strata; creel_power() tests whether the planned effort is sufficient to detect biologically important changes; and generate_schedule() turns the numerical targets into a concrete field calendar. For roving surveys that use progressive counts, generate_progressive_start() schedules unbiased circuit start times from the randomised pool defined by the survey period and circuit time.
The Harlan example illustrates a realistic planning sequence: 45 sampling days under Neyman allocation (37 weekday, 9 weekend) will achieve approximately 15% CV on effort, and 80–100 interviews will achieve approximately 20% CV on CPUE. However, the power analysis reveals an important limitation: because individual catch rates are highly variable (CV ≈ 2.66), detecting a moderate CPUE change between seasons requires far more interviews than the precision target implies. Precision and power are related but distinct objectives, and the planning workflow must address both before the first field day is scheduled.
Cochran, W. G. 1977. Sampling techniques, 3rd edition. John Wiley & Sons, New York.
Hoenig, J. M., D. S. Robson, C. M. Jones, and K. H. Pollock. 1993. Scheduling counts in the instantaneous and progressive count methods for estimating sportfishing effort. North American Journal of Fisheries Management 13(4):723–736.
McCormick, J. L., and K. A. Meyer. 2017. Sample size estimation for on-site creel surveys. North American Journal of Fisheries Management 37:970–980.
Pollock, K. H., C. M. Jones, and T. L. Brown. 1994. Angler survey methods and their applications in fisheries management. American Fisheries Society, Bethesda, Maryland.