Creel surveys produce two types of summary products: unextrapolated summaries and extrapolated estimates. This vignette covers unextrapolated summaries — raw tabulations of interview records that describe the composition of interviewed parties without applying survey-design weighting.
When to use unextrapolated summaries:
All unextrapolated functions are interview-weighted, not
pressure-weighted: every interview counts once. A day with many
interviews therefore counts for more than a day with few, however many
anglers were fishing on each. For pressure-weighted, design-based
estimates, use estimate_catch_rate(),
estimate_total_catch(), and the related functions in
vignette("interview-estimation").
Start by assembling a design with every data layer the summaries use:
library(tidycreel)
# Load example datasets
data(example_calendar)
data(example_counts)
data(example_interviews)
data(example_catch)
data(example_lengths)
# Step 1: Define the survey calendar and stratification
design <- creel_design(example_calendar, date = date, strata = day_type)
# Step 2: Attach effort. example_counts already holds angler-hours for each
# sampled day, so it goes in through prep_counts_daily_effort()
design <- add_counts(design, prep_counts_daily_effort(example_counts,
date = date, strata = day_type, daily_effort = effort_hours
))
# Step 3: Attach interview records, with the optional descriptive fields
design <- add_interviews(design, example_interviews,
catch = catch_total,
effort = hours_fished,
harvest = catch_kept,
trip_status = trip_status,
trip_duration = trip_duration,
angler_type = angler_type,
angler_method = angler_method,
species_sought = species_sought,
n_anglers = n_anglers,
refused = refused
)
# Step 4: Attach species-level catch data
design <- add_catch(design, example_catch,
catch_uid = interview_id,
interview_uid = interview_id,
species = species,
count = count,
catch_type = catch_type
)
# Step 5: Attach fish length data (individual harvest + binned release)
design <- add_lengths(design, example_lengths,
length_uid = interview_id,
interview_uid = interview_id,
species = species,
length = length,
length_type = length_type,
count = count,
release_format = "binned"
)
print(design)
#>
#> ── Creel Survey Design ─────────────────────────────────────────────────────────
#> Type: "instantaneous"
#> Date column: date
#> Strata: day_type
#> Calendar: 14 days (2024-06-01 to 2024-06-14)
#> day_type: 2 levels
#> Counts: 14 observations
#> PSU column: date
#> Count column: daily_effort
#> Party-size term: not carried
#> Count type: "instantaneous"
#> Survey: <survey.design2> (constructed)
#> Interviews: 22 observations
#> Type: "access"
#> Catch: catch_total
#> Effort: hours_fished
#> Harvest: catch_kept
#> Trip status: 17 complete, 5 incomplete
#> Angler type: angler_type
#> Angler method: angler_method
#> Species sought: species_sought
#> Party size: n_anglers
#> Refused: refused
#> Survey: <survey.design2> (constructed)
#> Catch Data: 42 rows, 3 species
#> caught: 8, harvested: 17, released: 17
#> Length Data: 20 rows, 3 species, length: 155–512 mm
#> harvest: 14 individual
#> release: 6 binned
#> Sections: "none"The print() output shows all five data layers: calendar,
counts, interviews, catch, and lengths.
Use summarize_refusals() to understand how many
potential interviewees declined to participate. High refusal rates can
bias estimates if refusers differ systematically from participants.
All 22 interviews in example_interviews were accepted
(no refusals). In a field survey, check whether refusals cluster in a
stratum, a site or an angler type; the estimators assume the interviewed
parties stand for the ones that refused.
Seven tabulation functions describe the composition of the interview sample.
summarize_successful_parties() counts parties that
caught at least one fish of their target species (as recorded in catch
data), broken down by angler type and species sought.
summarize_by_trip_length(design)
#> trip_length_bin N percent
#> 1 [0,1) 2 9.1
#> 2 [1,2) 5 22.7
#> 3 [2,3) 8 36.4
#> 4 [3,4) 4 18.2
#> 5 [4,5) 3 13.6
#> 6 [5,6) 0 0.0
#> 7 [6,7) 0 0.0
#> 8 [7,8) 0 0.0
#> 9 [8,9) 0 0.0
#> 10 [9,10) 0 0.0
#> 11 10+ 0 0.0The trip-length distribution is useful for detecting outliers and understanding effort patterns.
CWS and HWS rates are the mean, across parties seeking a species, of
each party’s catch (CWS) or harvest (HWS) of that species per
angler-hour. A party’s catch is its caught row when it
recorded one, and otherwise its harvested + released fish, as
add_catch() documents, so data that record only
dispositions give the same CWS. These are useful quality indicators and
input parameters for population models, but should not
be treated as pressure-weighted catch rates for management use — they
reflect the interview sample composition, not fishing pressure across
the survey period.
summarize_cws_rates(design, by = species_sought)
#> species_sought N n_unknown_target n_unknown_effort n_nonpositive_effort
#> 1 bass 6 0 0 0
#> 2 panfish 5 0 0 0
#> 3 walleye 11 0 0 0
#> mean_rate se ci_lower ci_upper
#> 1 0.1854167 0.1330890 0.0000000 0.5275328
#> 2 0.2333333 0.2333333 0.0000000 0.8811705
#> 3 0.6293290 0.2163859 0.1471911 1.1114669summarize_hws_rates(design, by = species_sought)
#> species_sought N n_unknown_target n_unknown_effort n_nonpositive_effort
#> 1 bass 6 0 0 0
#> 2 panfish 5 0 0 0
#> 3 walleye 11 0 0 0
#> mean_rate se ci_lower ci_upper
#> 1 0.0312500 0.0312500 0.00000000 0.1115807
#> 2 0.1333333 0.1333333 0.00000000 0.5035260
#> 3 0.3887987 0.1322997 0.09401668 0.6835807Interpretation guidance: these are rates, not
proportions. A CWS of 0.6 means the parties seeking that species caught,
on average, 0.6 of it per angler-hour; rates above 1.0 are common. For
the share of parties that caught at least one, use
summarize_successful_parties().
Length data attached via add_lengths() can be summarized
by catch type and species.
summarize_length_freq(design, type = "harvest", by = species, bin_width = 25)
#> species length_bin N percent cumulative_percent
#> 1 bass [225,250) 1 25.0 25.0
#> 2 bass [250,275) 1 25.0 50.0
#> 3 bass [275,300) 2 50.0 100.0
#> 4 panfish [150,175) 2 100.0 100.0
#> 5 walleye [375,400) 2 25.0 25.0
#> 6 walleye [400,425) 3 37.5 62.5
#> 7 walleye [475,500) 1 12.5 75.0
#> 8 walleye [500,525) 2 25.0 100.0Release lengths in example_lengths are stored in
pre-binned format, as "lower-upper" labels in mm.
summarize_length_freq() converts each bin to its
midpoint:
summarize_length_freq(design, type = "release", by = species)
#> species length_bin N percent cumulative_percent
#> 1 bass [275,276) 4 44.4 44.4
#> 2 bass [325,326) 5 55.6 100.0
#> 3 panfish [175,176) 6 66.7 66.7
#> 4 panfish [225,226) 3 33.3 100.0
#> 5 walleye [375,376) 2 40.0 40.0
#> 6 walleye [425,426) 3 60.0 100.0Many agencies record released fish by inch group
instead, a single value such as "12" with a count. Declare
the unit and the group width when attaching the lengths, and each group
is read as its lower bound ("12" is 12.0 to under 13
inches) and converted to mm, so it combines correctly with harvest
lengths measured in mm:
design <- add_lengths(design, lengths_with_inch_groups,
length_uid = interview_id, interview_uid = interview_id,
species = species, length = length, length_type = length_type, count = count,
release_format = "binned", release_bin_unit = "inch", release_bin_width = 1
)If your inch groups are rounded to the nearest inch rather than
truncated, give "lower-upper" labels
("11.5-12.5") instead.
summarize_length_freq(design, type = "catch", by = species, bin_width = 25)
#> species length_bin N percent cumulative_percent
#> 1 bass [225,250) 1 7.7 7.7
#> 2 bass [250,275) 1 7.7 15.4
#> 3 bass [275,300) 6 46.2 61.6
#> 4 bass [325,350) 5 38.5 100.1
#> 5 panfish [150,175) 2 18.2 18.2
#> 6 panfish [175,200) 6 54.5 72.7
#> 7 panfish [225,250) 3 27.3 100.0
#> 8 walleye [375,400) 4 30.8 30.8
#> 9 walleye [400,425) 3 23.1 53.9
#> 10 walleye [425,450) 3 23.1 77.0
#> 11 walleye [475,500) 1 7.7 84.7
#> 12 walleye [500,525) 2 15.4 100.1For pressure-weighted estimates broken down by species, use the estimators. These combine the effort estimate with species-specific catch rates from the interview and catch data, using the ratio of means for these complete trips. The calendar lists only the sampled days, so the totals are totals over those days.
The example is small, 17 complete trips, so the rate calls warn that the sample is small for a ratio estimator, and the species totals warn that the weekend rate rests on fewer than 10 trips. Both are about precision, and the standard errors reflect them.
estimate_catch_rate(design, by = species)
#> Warning: Small sample size for CPUE estimation.
#> ! Sample size is 17. Ratio estimates are more stable with n >= 30.
#> ℹ Variance estimates may be unstable with n < 30.
#> ℹ Repeats on this design are recorded, not printed: see `get_warnings()`.
#>
#> ── Creel Survey Estimates ──────────────────────────────────────────────────────
#> Method: ratio-of-means-cpue-species
#> Variance: Taylor linearization
#> Confidence level: 95%
#> Grouped by: species
#> Unit: fish/angler-hour
#>
#> # A tibble: 3 × 6
#> species estimate se ci_lower ci_upper n
#> <chr> <dbl> <dbl> <dbl> <dbl> <int>
#> 1 bass 0.205 0.0743 0.0590 0.350 17
#> 2 panfish 0.0558 0.0311 -0.00518 0.117 17
#> 3 walleye 0.465 0.0957 0.278 0.653 17estimate_total_catch(design, by = species)
#> Warning: 1 rate cell in "species total catch" rests on fewer than 10 trips.
#> • day_type=weekend: n=7
#> ℹ The total multiplies each cell's effort by a rate built from that cell's
#> trips alone; a ratio from so few trips is unstable, and the rate functions
#> refuse a group this small.
#> ℹ Combine cells or collect more interviews. Totals warn here rather than refuse
#> (GH #417).
#> ℹ Repeats on this design are recorded, not printed: see `get_warnings()`.
#>
#> ── Creel Survey Estimates ──────────────────────────────────────────────────────
#> Method: Total Catch (Effort × CPUE)
#> Variance: Taylor linearization
#> Confidence level: 95%
#> Grouped by: species
#> Effort target: sampled_days
#>
#> # A tibble: 3 × 6
#> species estimate se ci_lower ci_upper n
#> <chr> <dbl> <dbl> <dbl> <dbl> <int>
#> 1 bass 63.2 21.9 16.5 110. 17
#> 2 panfish 27.2 10.4 5.10 49.3 17
#> 3 walleye 190. 46.0 92.3 288. 17estimate_total_harvest(design, by = species)
#>
#> ── Creel Survey Estimates ──────────────────────────────────────────────────────
#> Method: Total Harvest (Effort × HPUE)
#> Variance: Taylor linearization
#> Confidence level: 95%
#> Grouped by: species
#> Effort target: sampled_days
#>
#> # A tibble: 3 × 6
#> species estimate se ci_lower ci_upper n
#> <chr> <dbl> <dbl> <dbl> <dbl> <int>
#> 1 bass 29.8 9.84 8.82 50.8 17
#> 2 panfish 18.1 6.92 3.40 32.9 17
#> 3 walleye 131. 31.4 64.4 198. 17estimate_release_rate(design, by = species)
#>
#> ── Creel Survey Estimates ──────────────────────────────────────────────────────
#> Method: ratio-of-means-rpue
#> Variance: Taylor linearization
#> Confidence level: 95%
#> Grouped by: species
#> Unit: fish/angler-hour
#>
#> # A tibble: 3 × 6
#> species estimate se ci_lower ci_upper n
#> <chr> <dbl> <dbl> <dbl> <dbl> <int>
#> 1 bass 0.102 0.0407 0.0225 0.182 17
#> 2 panfish 0.0186 0.0104 -0.00173 0.0389 17
#> 3 walleye 0.140 0.0385 0.0640 0.215 17
estimate_total_release(design, by = species)
#>
#> ── Creel Survey Estimates ──────────────────────────────────────────────────────
#> Method: product-total-release
#> Variance: Taylor linearization
#> Confidence level: 95%
#> Grouped by: species
#> Effort target: sampled_days
#>
#> # A tibble: 3 × 6
#> species estimate se ci_lower ci_upper n
#> <chr> <dbl> <dbl> <dbl> <dbl> <int>
#> 1 bass 33.4 14.1 3.43 63.5 17
#> 2 panfish 9.07 3.46 1.70 16.4 17
#> 3 walleye 58.9 18.8 18.9 98.9 17For grouped estimates combining calendar strata with species, use
by = c(day_type, species). See
vignette("interview-estimation") for the complete
extrapolated estimation workflow.
| Function | Data required | Output |
|---|---|---|
summarize_refusals() |
refused field | month × participation × N × % |
summarize_by_day_type() |
strata | month × day_type × N × % |
summarize_by_angler_type() |
angler_type | month × angler_type × N × % |
summarize_by_method() |
angler_method | month × method × N × % |
summarize_by_species_sought() |
species_sought | month × species × N × % |
summarize_successful_parties() |
catch + angler_type + species_sought | angler_type × species × success rate |
summarize_by_trip_length() |
trip_duration | bin × N × % |
summarize_cws_rates() |
catch + species_sought | CWS rate ± SE by grouping |
summarize_hws_rates() |
catch + species_sought | HWS rate ± SE by grouping |
summarize_length_freq() |
lengths | bin × N × % × cumulative % |