
Tidy Interface for Creel Survey Design, Estimation, and Reporting
tidycreel provides a pipe-friendly interface for creel survey design, data management, estimation, visualisation, and reporting. Built on the survey package for design-based inference, it lets fisheries biologists work in creel vocabulary — dates, strata, counts, effort, catch, lengths, schedules — without managing survey-package internals directly.
install.packages("tidycreel")
Or the development version from GitHub:
# install.packages("pak")
# pak::pak("chrischizinski/tidycreel")
install.packages("tidycreel", repos = c('https://chrischizinski.r-universe.dev', 'https://cloud.r-project.org'))
# or with devtools
devtools::install_github("chrischizinski/tidycreel")
The website documents the CRAN
release. Documentation for the development version on GitHub is at
/dev/; corrections to the
documentation appear there first and reach the main site with the next CRAN
release. Check your installed version with packageVersion("tidycreel").
Stratified effort estimation from periodic angler counts.
vignette("tidycreel")
PPS site selection with Horvitz-Thompson estimators and enumeration expansion.
vignette("bus-route-surveys")
Degenerate bus-route design with certainty site sampling.
vignette("ice-fishing")
Counter and ingress-egress preprocessing, NB GLMM count imputation, and camera effort indexing.
vignette("camera-surveys")
Single-overflight effort estimation with calibrated open-hours scaling.
vignette("aerial-surveys") | vignette("aerial-glmm")
survey package; biologists write creel vocabulary, not survey-package internals.creel_design() dispatches to the correct workflow for each survey type.audit_strata(), simulate_strata_collapse(), and reallocate_strata() diagnose stratum weights, inclusion probabilities, and coverage; test collapse scenarios before committing to a redesign.autoplot() methods, theme_creel(), creel_palette(), a Quarto Creel Report template scaffold, and the legacy flexdashboard scaffold.library(tidycreel)
# 1. Define survey structure with tidy selectors
design <- creel_design(example_calendar, date = date, strata = day_type)
# 2. Attach the counts. example_counts already holds angler-hours per day,
# so mark it as daily effort rather than instantaneous counts
counts <- prep_counts_daily_effort(example_counts,
date = date, strata = day_type, daily_effort = effort_hours
)
design <- add_counts(design, counts)
# 3. Estimate effort with design-based variance
effort <- estimate_effort(design, by = day_type)
effort
# 4. Use the result as data: one row per estimate, with its method,
# confidence level and unit as columns
tibble::as_tibble(effort)
# Probability-proportional-to-size site selection
design <- creel_design(
example_calendar,
date = date,
strata = day_type,
survey_type = "bus_route",
sampling_frame = my_site_frame,
site = site_id
)
design <- add_interviews(design, interview_data,
catch = catch_total,
effort = hours_fished,
harvest = catch_kept
)
estimate_catch_rate(design)
| If you want to… | Start here |
|---|---|
| Learn the package vocabulary | Glossary (vignette("glossary")) |
| See the main end-to-end workflow | Getting Started (vignette("tidycreel")) |
| Plan a season before sampling starts | Survey Design Toolbox (vignette("survey-design-toolbox")) |
| Estimate angler population or exploitation rate from tag data | Mark-Recapture and Exploitation Rate (vignette("mark-recapture")) |
| Understand plotting and output styling | Visualisation (vignette("visualisation")) and theme_creel()
|
| Build a report/dashboard | Use the bundled Quarto Creel Report starter template, or open R Markdown > From Template > Creel Dashboard for the legacy scaffold |
creel_design() — single entry point; dispatches on survey_type.add_counts(), add_interviews(), add_catch(), add_lengths(), add_ages(), add_sections() — attach observation data.estimate_effort() — total effort with Taylor linearization, bootstrap, or jackknife variance.estimate_catch_rate(), estimate_harvest_rate(), estimate_release_rate() — ratio-based interview estimators.estimate_total_catch(), estimate_total_harvest(), estimate_total_release() — totals via delta-method propagation.est_effort_camera(), est_length_distribution(), est_mean_length(), est_age_distribution(), est_mean_age() — camera effort indexing and weighted size- and age-structure estimation.estimate_exploitation_rate() — exploitation rate from tag returns (Pollock et al.; simple and T-weighted stratified paths).estimate_angler_n() — Petersen and Schnabel mark-recapture population size estimators.estimate_mr_harvest() — population-scale total harvest from mark-recapture data.validate_creel_data(), validation_report(), standardize_species() — clean and validate real-world creel inputs.validate_incomplete_trips(), validate_design(), check_completeness(), compare_variance(), adjust_nonresponse() — QA and estimator diagnostics.audit_strata(), simulate_strata_collapse(), reallocate_strata() — stratification diagnostics; verify weights, simulate collapse scenarios, and rebalance allocations.generate_schedule(), generate_bus_schedule(), generate_count_times(), attach_count_times() — planning/scheduling helpers.creel_n_effort(), creel_n_cpue(), creel_n_camera(), creel_power(), cv_from_n() — sample-size and power tools.season_summary(), summary.creel_estimates(), write_estimates() — report-ready summary/export helpers.autoplot.creel_estimates(), autoplot.creel_schedule(), autoplot.creel_length_distribution(), theme_creel(), creel_palette() — visualisation helpers.All vignettes ship with the package — open one with
vignette("<name>", package = "tidycreel"). They are also published at
https://chrischizinski.com/tidycreel/articles/.
| Vignette | Description |
|---|---|
Getting Started (vignette("tidycreel")) |
Core workflow: design → counts → effort estimation |
| Vignette | Description |
|---|---|
Bus-Route Surveys (vignette("bus-route-surveys")) |
PPS site selection with Horvitz-Thompson estimators |
Ice Fishing (vignette("ice-fishing")) |
Certainty-site (degenerate bus-route) design |
Camera Surveys (vignette("camera-surveys")) |
Counter and ingress-egress preprocessing, count imputation, camera effort |
Aerial Surveys (vignette("aerial-surveys")) |
Single-overflight effort with calibrated open-hours scaling |
Aerial GLMM (vignette("aerial-glmm")) |
Negative-binomial GLMM aerial effort (Askey 2018) |
| Vignette | Description |
|---|---|
Interview Estimation (vignette("interview-estimation")) |
CPUE, catch, and harvest from interview data |
Mark-Recapture and Exploitation Rate (vignette("mark-recapture")) |
Chapman, Petersen, Schnabel estimators; MR harvest; exploitation rate from tag returns |
Incomplete-Trip Interviews (vignette("incomplete-trips")) |
Catch rates from anglers still fishing, and checking them against complete trips |
Progressive Count Surveys (vignette("progressive-count-surveys")) |
Rolling and progressive count workflows |
Section Estimation (vignette("section-estimation")) |
Spatial section-level effort and catch estimation |
Season, Monthly and Annual Totals (vignette("temporal-extrapolation")) |
Season totals from sampled days, and monthly totals that add up to them |
| Vignette | Description |
|---|---|
Unextrapolated Summaries (vignette("unextrapolated-summaries")) |
Raw interview summaries without season-level expansion |
Survey Design Toolbox (vignette("survey-design-toolbox")) |
Sample-size, power, scheduling, and pre-season planning tools |
Survey Scheduling (vignette("survey-scheduling")) |
Count windows, schedules, validation, and completeness checks |
Visualisation (vignette("visualisation")) |
Plotting patterns and output styling with theme_creel()
|
| Vignette | Description |
|---|---|
Counts to Effort (vignette("effort-pipeline")) |
How effort and its between-day and within-day variance are built; progressive counts |
Interviews to Catch (vignette("catch-pipeline")) |
Why access and roving interviews get different rate estimators; totals and their variance |
Variance Methods (vignette("replicate-designs")) |
Taylor, bootstrap and jackknife: what they share and when they differ |
Choosing an Estimator (vignette("estimator-choice")) |
Which estimator runs for effort, rates and totals, and what decides it |
Units (vignette("unit-rules")) |
Where an estimate's unit comes from, and why it is sometimes NA
|
Refusals and NA (vignette("refusals-and-na")) |
Zero, NA and refusal; absent, NA and zero standard-error parts |
| Vignette | Description |
|---|---|
Glossary (vignette("glossary")) |
Plain-language guide to tidycreel terms and concepts |
Bus-Route Equations (vignette("bus-route-equations")) |
Technical equation derivations for bus-route estimators |
Survey Integration (vignette("survey-tidycreel")) |
Effort, catch rate and total catch reproduced with survey package calls |
| API Conventions (website only) | How functions are named, what they take and what they return |
| Vignette | Description |
|---|---|
tidycreel.connect (vignette("tidycreel-connect")) |
Database integration and reproducible data pipelines |
If you have questions about which survey type to use, how to interpret results, or how to structure your data, the best place to start is GitHub Discussions:
GitHub Discussions works like a threaded forum attached to the repository. If you do not already have a GitHub account, you can create one for free at https://github.com/signup — it only requires an email address. Once signed in, click New discussion, select the Q&A category, and describe what you are trying to do. Searching existing threads first is worth a moment; your question may already have an answer.
If a function returns an error, produces a result that does not look right, or behaves differently from what the documentation describes, please open a GitHub Issue:
Step-by-step for first-time GitHub users:
instantaneous,
bus_route, ice, camera, or aerial)packageVersion("tidycreel") in R and
paste the result (e.g., 1.6.0)Writing a reproducible example
The single most useful thing you can include is a short, self-contained R
snippet that demonstrates the problem without needing your real data. Use
the package's built-in example datasets (example_calendar,
example_counts, example_interviews, etc.) wherever possible, or create a
small data frame that triggers the issue.
A good example looks like this:
library(tidycreel)
design <- creel_design(example_calendar, date = date, strata = day_type)
design <- add_counts(design, example_counts)
# The call that produces the unexpected result
estimate_effort(design)
#> Error: ... (paste the full error message here)
The snippet should run from scratch without any additional files or setup.
If reducing your data to a minimal example is not straightforward, share
what you have and describe the context — that is still very helpful. The
reprex package can automatically format and share R output if you want a
polished submission: install it with install.packages("reprex") and run
reprex::reprex() around your code.
For guidance on contributing code, requesting new features, or the development workflow, see CONTRIBUTING.md.
MIT License — see LICENSE.md for details.
Artificial intelligence coding assistants were used during the development of tidycreel, including for code refinement, consistency across functions, GitHub Actions workflows, error checking, code review, and the development of testing infrastructure.
All functions and analytical outputs have been reviewed by the author team and validated against real-world creel survey data and expected analytical behavior. Despite these review and testing efforts, errors may still occur. If you identify a problem or unexpected result, please submit an issue so that it can be reviewed and addressed.