Unextrapolated Interview Summaries

Introduction

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:

  • Describing who was interviewed (angler type, method, species sought)
  • Checking for refusals and participation rates
  • Examining trip-length distributions
  • Computing catch-while-sought and harvest-while-sought rates as quality indicators

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").

Build the Design

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.

Interview Participation

Use summarize_refusals() to understand how many potential interviewees declined to participate. High refusal rates can bias estimates if refusers differ systematically from participants.

summarize_refusals(design)
#>   month participation  N percent
#> 1  June      accepted 22     100

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.

Interview Composition

Seven tabulation functions describe the composition of the interview sample.

Day Type

summarize_by_day_type(design)
#>   month day_type  N percent
#> 1  June  weekday 13    59.1
#> 2  June  weekend  9    40.9

Angler Type

summarize_by_angler_type(design)
#>   month angler_type  N percent
#> 1  June        bank 13    59.1
#> 2  June        boat  9    40.9

Fishing Method

summarize_by_method(design)
#>   month     method  N percent
#> 1  June artificial  7    31.8
#> 2  June       bait 10    45.5
#> 3  June        fly  5    22.7

Species Sought

summarize_by_species_sought(design)
#>   month species  N percent
#> 1  June    bass  6    27.3
#> 2  June panfish  5    22.7
#> 3  June walleye 11    50.0

Successful Parties

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_successful_parties(design)
#>   angler_type species_sought N_total N_successful percent
#> 1        bank           bass       5            1    20.0
#> 2        bank        panfish       3            1    33.3
#> 3        bank        walleye       5            4    80.0
#> 4        boat           bass       1            1   100.0
#> 5        boat        panfish       2            0     0.0
#> 6        boat        walleye       6            3    50.0

Trip Length Distribution

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.0

The trip-length distribution is useful for detecting outliers and understanding effort patterns.

Catch-While-Sought (CWS) and Harvest-While-Sought (HWS) Rates

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.

CWS Rates by Species Sought

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.1114669

CWS Rates Collapsed Across All Groupings

summarize_cws_rates(design, by = NULL)
#>    N n_unknown_target n_unknown_effort n_nonpositive_effort mean_rate        se
#> 1 22                0                0                    0  0.418263 0.1295774
#>   ci_lower ci_upper
#> 1 0.148792 0.687734

HWS Rates

summarize_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.6835807

Interpretation 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 Frequency Distributions

Length data attached via add_lengths() can be summarized by catch type and species.

Harvest Lengths

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.0

Release Lengths

Release 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.0

Many 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.

All-Catch Lengths

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.1

Extrapolated Species-Level Estimates

For 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.

Catch Per Unit Effort by Species

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    17

Total Catch by Species

estimate_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.     17

Total Harvest by Species

estimate_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.     17

Release Rate and Total Releases by Species

estimate_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    17

For grouped estimates combining calendar strata with species, use by = c(day_type, species). See vignette("interview-estimation") for the complete extrapolated estimation workflow.

Summary

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 %