Nothing
## ----setup, include = FALSE---------------------------------------------------
knitr::opts_chunk$set(
collapse = TRUE,
comment = "#>",
fig.width = 7,
fig.height = 5,
message = FALSE,
warning = FALSE
)
library(fb4package)
## ----species-db---------------------------------------------------------------
data(fish4_parameters)
cat("Species in database:", length(fish4_parameters), "\n")
head(names(fish4_parameters), 8)
## ----chinook-params-----------------------------------------------------------
chinook_db <- fish4_parameters[["Oncorhynchus tshawytscha"]]
stage <- names(chinook_db$life_stages)[1]
cat("Life stage used:", stage, "\n")
sp_params <- chinook_db$life_stages[[stage]]
sp_info <- chinook_db$species_info
# Key consumption parameters
cat("CEQ:", sp_params$consumption$CEQ,
" CA:", sp_params$consumption$CA,
" CB:", sp_params$consumption$CB, "\n")
## ----env-diet-----------------------------------------------------------------
days <- 1:100
# Seasonal temperature (°C)
temp_data <- data.frame(
Day = days,
Temperature = round(10 + 5 * sin(2 * pi * (days - 60) / 365), 2)
)
# Two-prey diet (constant proportions, J/g energy densities)
diet_data <- list(
proportions = data.frame(Day = days, Alewife = 0.7, Shrimp = 0.3),
prey_names = c("Alewife", "Shrimp"),
energies = data.frame(Day = days, Alewife = 4900, Shrimp = 3200)
)
head(temp_data, 3)
## ----bio-object---------------------------------------------------------------
bio <- Bioenergetic(
species_params = sp_params,
species_info = sp_info,
environmental_data = list(temperature = temp_data),
diet_data = diet_data,
simulation_settings = list(initial_weight = 1800, duration = 100)
)
# Required when PREDEDEQ = 2 (energy density as function of weight)
bio$species_params$predator$ED_ini <- 4500
bio$species_params$predator$ED_end <- 5500
print(bio)
## ----direct-------------------------------------------------------------------
res_direct <- run_fb4(bio, strategy = "direct", p_value = 0.8)
print(res_direct)
## ----binary-search------------------------------------------------------------
res_bs <- run_fb4(bio,
strategy = "binary_search",
fit_to = "Weight",
fit_value = 3000)
cat("Estimated p-value :", round(res_bs$summary$p_value, 4), "\n")
cat("Final weight :", round(res_bs$summary$final_weight, 1), "g\n")
cat("Total consumption :", round(res_bs$summary$total_consumption_g, 1), "g\n")
## ----obs-weights-def, include=FALSE-------------------------------------------
set.seed(42)
obs_weights <- rnorm(30, mean = 3000, sd = 80)
## ----mle, cache=TRUE, dependson="obs-weights-def"-----------------------------
set.seed(42)
obs_weights <- rnorm(30, mean = 3000, sd = 80) # 30 observed final weights
res_mle <- run_fb4(bio,
strategy = "mle",
fit_to = "Weight",
observed_weights = obs_weights)
cat("p-value (MLE) :", round(res_mle$summary$p_value, 4), "\n")
cat("SE :", round(res_mle$summary$p_se, 4), "\n")
cat("Converged :", res_mle$summary$converged, "\n")
## ----bootstrap, cache=TRUE, dependson=c("obs-weights-def", "mle")-------------
set.seed(42)
res_boot <- run_fb4(bio,
strategy = "bootstrap",
fit_to = "Weight",
observed_weights = obs_weights,
upper = 1,
n_bootstrap = 100,
parallel = FALSE)
cat("p mean (bootstrap):", round(res_boot$summary$p_mean, 4), "\n")
cat("p SD :", round(res_boot$summary$p_sd, 4), "\n")
## ----compare, echo=FALSE------------------------------------------------------
comparison <- data.frame(
Strategy = c("binary_search", "mle", "bootstrap"),
p_estimate = round(c(res_bs$summary$p_value,
res_mle$summary$p_value,
res_boot$summary$p_mean), 4),
SE_or_SD = round(c(NA, res_mle$summary$p_se, res_boot$summary$p_sd), 4),
Uncertainty = c("none (point estimate)", "SE (asymptotic)", "SD (non-parametric)"),
stringsAsFactors = FALSE
)
knitr::kable(comparison,
col.names = c("Strategy", "p estimate", "SE / SD", "Uncertainty type"),
align = c("l", "r", "r", "l"),
caption = "All strategies use the same bio object (Chinook salmon, 100-day simulation). MLE and bootstrap fit to obs_weights; binary search fits to a target weight.")
## ----analysis-----------------------------------------------------------------
growth <- analyze_growth_patterns(res_bs)
feeding <- analyze_feeding_performance(res_bs)
energy <- analyze_energy_budget(res_bs)
cat(sprintf("Final weight : %.1f g\n",
growth$final_weight$estimate))
cat(sprintf("Specific growth rate : %.4f g/g/day\n",
growth$specific_growth_rate$estimate))
cat(sprintf("Total consumption : %.1f g\n",
feeding$total_consumption$estimate))
cat(sprintf("Gross conversion efficiency: %.3f\n",
feeding$gross_conversion_efficiency$estimate))
## ----plot-growth, fig.cap="Daily growth trajectory from binary search fit."----
plot(res_bs, type = "growth")
## ----plot-energy, fig.cap="Daily energy budget partitioning."-----------------
plot(res_bs, type = "energy")
## ----plot-dashboard, fig.cap="Full dashboard (growth, consumption, temperature, energy)."----
plot(res_bs, type = "dashboard")
## ----sensitivity, fig.cap="Temperature and p-value sensitivity grid.", message=FALSE, warning=FALSE----
plot(bio,
type = "sensitivity",
temperatures = seq(6, 20, by = 2),
p_values = seq(0.3, 1.0, by = 0.1))
Any scripts or data that you put into this service are public.
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.