## ----setup, include = FALSE--------------------------------------------------- knitr::opts_chunk$set( collapse = TRUE, comment = "#>", fig.width = 7, fig.height = 5, message = FALSE, warning = FALSE ) library(fb4package) ## ----species-params----------------------------------------------------------- data(fish4_parameters) chinook_db <- fish4_parameters[["Oncorhynchus tshawytscha"]] stage <- if ("juvenile" %in% names(chinook_db$life_stages)) { "juvenile" } else { names(chinook_db$life_stages)[1] } sp_params <- chinook_db$life_stages[[stage]] sp_info <- chinook_db$species_info sp_info$life_stage <- stage cat("Life stage :", stage, "\n") cat("CEQ (consumption equation):", sp_params$consumption$CEQ, "\n") cat("REQ (respiration equation):", sp_params$respiration$REQ, "\n") ## ----temperature-------------------------------------------------------------- set.seed(42) days <- 1:180 base_temp <- 7 + 7 * sin(pi * (days - 20) / 180) # peak ~14 °C at day 110 temp_vec <- pmax(2, base_temp + rnorm(180, 0, 0.4)) temp_data <- data.frame( Day = days, Temperature = round(temp_vec, 2) ) cat(sprintf("Temperature range : %.1f – %.1f °C\n", min(temp_data$Temperature), max(temp_data$Temperature))) cat(sprintf("Mean temperature : %.1f °C\n", mean(temp_data$Temperature))) ## ----diet--------------------------------------------------------------------- alewife <- pmax(0, 0.55 + 0.25 * sin(pi * (days - 30) / 180)) shrimp <- pmax(0, 0.28 - 0.10 * sin(pi * (days - 30) / 180)) inverts <- pmax(0, 1 - alewife - shrimp) total <- alewife + shrimp + inverts diet_props <- data.frame( Day = days, Alewife = round(alewife / total, 4), Shrimp = round(shrimp / total, 4), Inverts = round(inverts / total, 4) ) prey_energy <- data.frame( Day = days, Alewife = 4900, # J/g (wet weight) Shrimp = 3200, Inverts = 2600 ) cat("Diet proportions (first 3 days):\n") print(head(diet_props, 3)) ## ----bio-object--------------------------------------------------------------- bio_chinook <- Bioenergetic( species_params = sp_params, species_info = sp_info, environmental_data = list(temperature = temp_data), diet_data = list( proportions = diet_props, prey_names = c("Alewife", "Shrimp", "Inverts"), energies = prey_energy ), simulation_settings = list(initial_weight = 5, duration = 180) ) # Predator energy density: linear interpolation from 4 200 to 5 000 J/g # as the fish accumulate lipids through summer (PREDEDEQ = 1 from DB) bio_chinook$species_params$predator$ED_ini <- 4200 bio_chinook$species_params$predator$ED_end <- 5000 print(bio_chinook) ## ----plot-setup, fig.cap="Model setup dashboard: environmental and diet data coverage."---- plot(bio_chinook, type = "dashboard") ## ----plot-temperature, fig.cap="Seasonal temperature profile used in the simulation."---- plot(bio_chinook, type = "temperature", colors = "red") ## ----plot-diet, fig.cap="Daily diet composition over the 180-day season."----- plot(bio_chinook, type = "diet", colors = "green") ## ----binary-search------------------------------------------------------------ res_bs <- run_fb4( x = bio_chinook, fit_to = "Weight", fit_value = 40, strategy = "binary_search", verbose = FALSE ) cat(sprintf("Estimated p-value : %.4f\n", res_bs$summary$p_value)) cat(sprintf("Final weight : %.1f g\n", res_bs$summary$final_weight)) cat(sprintf("Total consumption : %.1f g\n", res_bs$summary$total_consumption_g)) cat(sprintf("Simulation converged : %s\n", res_bs$summary$converged)) ## ----plot-growth, fig.cap="Daily weight trajectory from binary search fit."---- plot(res_bs, type = "growth") ## ----plot-energy, fig.cap="Daily energy budget partitioning (J/day)."--------- plot(res_bs, type = "energy") ## ----plot-dashboard, fig.cap="Simulation dashboard: growth, consumption, temperature, and energy."---- plot(res_bs, type = "dashboard") ## ----direct------------------------------------------------------------------- res_direct <- run_fb4( x = bio_chinook, fit_to = "p_value", fit_value = 0.75, strategy = "direct_p_value", verbose = FALSE ) cat(sprintf("Final weight at p = 0.75 : %.1f g\n", res_direct$summary$final_weight)) cat(sprintf("Total consumption : %.1f g\n", res_direct$summary$total_consumption_g)) ## ----bootstrap, cache=TRUE---------------------------------------------------- set.seed(123) n_obs <- 25 final_wt_true <- res_bs$summary$final_weight obs_weights <- rnorm(n_obs, mean = final_wt_true, sd = final_wt_true * 0.08) res_boot <- run_fb4( x = bio_chinook, fit_to = "Weight", observed_weights = obs_weights, strategy = "bootstrap", n_bootstrap = 100, upper = 1, parallel = FALSE, confidence_level = 0.95, verbose = FALSE ) cat(sprintf("p mean (bootstrap) : %.4f\n", res_boot$summary$p_mean)) cat(sprintf("p SD : %.4f\n", res_boot$summary$p_sd)) cat(sprintf("95%% CI : [%.4f, %.4f]\n", res_boot$method_data$confidence_intervals$p_ci_lower, res_boot$method_data$confidence_intervals$p_ci_upper)) ## ----plot-boot, cache=TRUE, fig.cap="Bootstrap distribution of estimated p-values with 95% CI."---- plot(res_boot, type = "uncertainty") ## ----analysis----------------------------------------------------------------- growth_stats <- analyze_growth_patterns(res_bs) feeding_stats <- analyze_feeding_performance(res_bs) energy_budget <- analyze_energy_budget(res_bs) # Growth metrics cat("=== Growth ===\n") cat(sprintf(" Final weight : %.1f g\n", growth_stats$final_weight$estimate)) cat(sprintf(" Total growth : %.1f g\n", growth_stats$total_growth$estimate)) cat(sprintf(" Specific growth rate : %.4f g/g/day\n", growth_stats$specific_growth_rate$estimate)) # Feeding performance cat("\n=== Feeding performance ===\n") cat(sprintf(" Total consumption : %.1f g\n", feeding_stats$total_consumption$estimate)) cat(sprintf(" Gross conv. efficiency : %.3f\n", feeding_stats$gross_conversion_efficiency$estimate))