The hardware and bandwidth for this mirror is donated by dogado GmbH, the Webhosting and Full Service-Cloud Provider. Check out our Wordpress Tutorial.
If you wish to report a bug, or if you are interested in having us mirror your free-software or open-source project, please feel free to contact us at mirror[@]dogado.de.
Ice fishing creel surveys share the bus-route structure, but all
access points are sampled with certainty. Every angler leaving the lake
must pass through the single ice access point (the boat ramp area or
designated ice-access site), so there is no site-level subsampling. The
site inclusion probability is always p_site = 1.0, and the
overall inclusion probability reduces to just the period sampling
probability:
\[\pi_i = p\_site \times p\_period = 1.0 \times p\_period = p\_period\]
In tidycreel, this is a degenerate bus-route design. The bus-route Horvitz-Thompson estimators still apply; only the probability structure is simpler.
Ice fishing surveys collect two distinct effort measures:
The effort_type argument to creel_design()
controls which measure the design tracks, and adds a matching column to
the estimate_effort() output:
total_effort_hr_on_ice for "time_on_ice" and
total_effort_hr_active for
"active_fishing_time". Both are aliases of
estimate, which is present on every design and is what
generic code should read.
Ice anglers fish from open-air setups or enclosed dark-house
shelters. Catch rates and effort patterns differ between these groups —
dark-house anglers often target specific species and fish longer hours.
The estimate_effort() function accepts a by
argument to produce separate estimates for each shelter type.
This vignette uses two built-in datasets representing a hypothetical Nebraska ice fishing creel survey at Lake McConaughy in January-February 2024. All 12 sampling days are weekends — a common design choice since ice fishing pressure is concentrated on Saturday and Sunday.
library(tidycreel)
data(example_ice_sampling_frame)
data(example_ice_interviews)
head(example_ice_sampling_frame)
#> date day_type p_period
#> 1 2024-01-06 weekend 0.50
#> 2 2024-01-07 weekend 0.50
#> 3 2024-01-13 weekend 0.50
#> 4 2024-01-14 weekend 0.50
#> 5 2024-01-20 weekend 0.55
#> 6 2024-01-21 weekend 0.55
head(example_ice_interviews)
#> date n_counted n_interviewed hours_on_ice active_fishing_hours
#> 1 2024-01-06 12 5 5.0 4.0
#> 2 2024-01-06 12 4 6.5 5.5
#> 3 2024-01-06 12 3 4.0 3.5
#> 4 2024-01-06 8 3 3.5 3.0
#> 5 2024-01-06 8 3 5.0 4.0
#> 6 2024-01-06 8 2 7.0 6.0
#> walleye_catch perch_catch walleye_kept perch_kept trip_status shelter_mode
#> 1 2 5 1 3 complete open
#> 2 0 8 0 5 complete open
#> 3 1 3 1 2 complete open
#> 4 3 0 2 0 complete dark_house
#> 5 1 4 1 3 incomplete dark_house
#> 6 0 6 0 4 complete dark_house
The sampling frame records the survey calendar and the period
sampling probability (p_period = 0.5 means each day had a
50% chance of being sampled). The interview data contains 72 interviews
with walleye and perch catch, both effort measures, and the shelter type
(shelter_mode) for each angler party.
Build an ice fishing design using creel_design() with
survey_type = "ice". The effort_type argument
is required and determines the column label in downstream output. We use
p_period = 0.5 as a scalar (uniform period sampling
probability across all days).
design <- creel_design(
example_ice_sampling_frame,
date = date,
strata = day_type,
survey_type = "ice",
effort_type = "time_on_ice",
p_period = 0.5
)
print(design)
#>
#> ── Creel Survey Design ─────────────────────────────────────────────────────────
#> Type: "ice"
#> Date column: date
#> Strata: day_type
#> Calendar: 12 days (2024-01-06 to 2024-02-11)
#> day_type: 1 level
#> Counts: "none"
#> Interviews: "none"
#> Sections: "none"
#>
#> ── Ice Fishing Design ──
#>
#> Effort type: time_on_ice
#> p_period (global): 0.5
Omitting effort_type or supplying an unrecognized value
produces an informative error:
creel_design(
example_ice_sampling_frame,
date = date,
strata = day_type,
survey_type = "ice"
)
#> Error in `creel_design()`:
#> ! `effort_type` is required for "ice" survey designs.
#> ✖ No `effort_type` supplied.
#> ℹ Valid values: "time_on_ice" and "active_fishing_time".
Use add_interviews() to attach the survey data to the
design. For ice surveys, n_counted and
n_interviewed are required — they record how many parties
were counted at the access point versus how many were actually
interviewed during each visit, providing the enumeration expansion
factor.
design <- add_interviews(
design,
example_ice_interviews,
catch = walleye_catch,
effort = hours_on_ice,
harvest = walleye_kept,
trip_status = trip_status,
n_counted = n_counted,
n_interviewed = n_interviewed
)
#> Warning: ! No `n_anglers` provided — assuming 1 angler per interview.
#> ℹ Pass `n_anglers = <column>` to use actual party sizes for angler-hour
#> normalization.
#> ℹ If the interviews really are one angler each, pass `n_anglers = 1` to state
#> that and silence this warning.
#> Warning: 23 interviews have zero catch.
#> ℹ Zero catch may be valid (skunked) or indicate missing data.
#> ℹ Added 72 interviews: 60 complete (83%), 12 incomplete (17%)
estimate_effort() dispatches through the bus-route
Horvitz-Thompson estimator and returns the total angler-hours with a
standard error and confidence interval. The effort column is returned
twice: as estimate, the name every design uses and the one
generic code should read, and again under a name recording the effort
type – total_effort_hr_on_ice because the design was built
with effort_type = "time_on_ice".
effort_est <- estimate_effort(design)
print(effort_est)
#>
#> ── Creel Survey Estimates ──────────────────────────────────────────────────────
#> Method: Total
#> Variance: Taylor linearization
#> Confidence level: 95%
#> Effort target: sampled_days
#> Unit: party-hours
#>
#> # A tibble: 1 × 6
#> estimate se ci_lower ci_upper n total_effort_hr_on_ice
#> <dbl> <dbl> <dbl> <dbl> <int> <dbl>
#> 1 2406. 74.6 2260. 2552. 72 2406.
To demonstrate the column-naming distinction, rebuild the design
using effort_type = "active_fishing_time" and the
active_fishing_hours column from the interview data. The
effort-type column is then labeled total_effort_hr_active;
estimate is present either way.
design_aft <- creel_design(
example_ice_sampling_frame,
date = date,
strata = day_type,
survey_type = "ice",
effort_type = "active_fishing_time",
p_period = 0.5
)
design_aft <- suppressMessages(add_interviews(
design_aft,
example_ice_interviews,
catch = walleye_catch,
effort = active_fishing_hours,
harvest = walleye_kept,
trip_status = trip_status,
n_counted = n_counted,
n_interviewed = n_interviewed
))
#> Warning: ! No `n_anglers` provided — assuming 1 angler per interview.
#> ℹ Pass `n_anglers = <column>` to use actual party sizes for angler-hour
#> normalization.
#> ℹ If the interviews really are one angler each, pass `n_anglers = 1` to state
#> that and silence this warning.
#> Warning: 23 interviews have zero catch.
#> ℹ Zero catch may be valid (skunked) or indicate missing data.
effort_aft <- estimate_effort(design_aft)
print(effort_aft)
#>
#> ── Creel Survey Estimates ──────────────────────────────────────────────────────
#> Method: Total
#> Variance: Taylor linearization
#> Confidence level: 95%
#> Effort target: sampled_days
#> Unit: party-hours
#>
#> # A tibble: 1 × 6
#> estimate se ci_lower ci_upper n total_effort_hr_active
#> <dbl> <dbl> <dbl> <dbl> <int> <dbl>
#> 1 1990. 69.1 1855. 2126. 72 1990.
Active fishing hours are shorter than time-on-ice because they exclude travel, setup, and breaks. The difference between the two estimates reflects the non-fishing portion of each trip.
Pass by = shelter_mode to estimate_effort()
to produce separate effort estimates for open-air anglers and dark-house
anglers. This uses the same Horvitz-Thompson framework with the
interview data split by the grouping variable.
effort_by_shelter <- estimate_effort(design, by = shelter_mode)
print(effort_by_shelter)
#>
#> ── Creel Survey Estimates ──────────────────────────────────────────────────────
#> Method: Total
#> Variance: Taylor linearization
#> Confidence level: 95%
#> Grouped by: shelter_mode
#> Effort target: sampled_days
#> Unit: party-hours
#>
#> # A tibble: 2 × 8
#> shelter_mode estimate se ci_lower ci_upper proportion n
#> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <int>
#> 1 dark_house 1250. 56.7 1139. 1361. 0.520 36
#> 2 open 1156. 23.6 1109. 1202. 0.480 36
#> # ℹ 1 more variable: total_effort_hr_on_ice <dbl>
The proportion column shows each shelter group’s share
of total effort. Dark-house anglers tend to fish longer hours on
average, which can make their proportional effort contribution larger
than their share of party counts alone would suggest.
estimate_catch_rate() computes the ratio-of-means CPUE
(fish per angler-hour) using the catch and effort columns specified in
add_interviews(). By default, only complete trips are used
to avoid the well-known incomplete-trip bias in effort-based catch
rates.
cpue_est <- estimate_catch_rate(design)
print(cpue_est)
#>
#> ── Creel Survey Estimates ──────────────────────────────────────────────────────
#> Method: Ratio-of-Means CPUE
#> Variance: Taylor linearization
#> Confidence level: 95%
#> Unit: fish/party-hour
#>
#> # A tibble: 1 × 5
#> estimate se ci_lower ci_upper n
#> <dbl> <dbl> <dbl> <dbl> <int>
#> 1 0.198 0.0121 0.174 0.222 60
The estimate column is walleye per hour-on-ice, with a
standard error and 95% confidence interval. The n column
counts the number of complete interviews used in the ratio.
On instantaneous designs estimate_total_catch()
multiplies a catch rate by a total effort estimate, but ice designs take
the bus-route dispatch instead and form no such product. The total is a
direct Horvitz-Thompson sum over the interviewed parties, each party’s
catch divided by its inclusion probability \(\pi_i\); there is no CPUE term and no
effort term. The method is reported as ht-total-catch
rather than product-total-catch.
Only completed trips enter the sum. A party still fishing has caught
some of its eventual catch, so counting it would expand a partial catch
under the inclusion probability of a finished trip. Of the 72
interviews, the 60 complete ones contribute and the 12 incomplete ones
are dropped — which is why the n column below reads 60. For
the same reason use_trips = "all" is refused on ice and
bus-route designs; incomplete trips support a rate, via
estimate_catch_rate(use_trips = "incomplete"), not a
total.
total_catch_est <- estimate_total_catch(design)
print(total_catch_est)
#>
#> ── Creel Survey Estimates ──────────────────────────────────────────────────────
#> Method: Total Catch (Horvitz-Thompson)
#> Variance: Taylor linearization
#> Confidence level: 95%
#> Unit: fish
#>
#> # A tibble: 1 × 5
#> estimate se ci_lower ci_upper n
#> <dbl> <dbl> <dbl> <dbl> <int>
#> 1 398. 20.6 358. 439. 60
The estimate column is the projected total walleye catch
across the entire survey period. The standard error and 95% confidence
interval come from Taylor linearization on the Horvitz-Thompson sum, not
from the delta method — there is no product of two estimates here whose
uncertainty would need propagating.
Jones, C. M., & Pollock, K. H. (2012). Recreational survey methods: estimation of effort, harvest, and abundance. Chapter 19 in Fisheries Techniques (3rd ed.), pp. 883-919. American Fisheries Society.
Malvestuto, S. P. (1996). Sampling the recreational angler. Chapter 20 in Fisheries Techniques (2nd ed.), pp. 591-623. American Fisheries Society.
These binaries (installable software) and packages are in development.
They may not be fully stable and should be used with caution. We make no claims about them.
Health stats visible at Monitor.