---
title: "Using Optistock"
output: rmarkdown::html_document
vignette: >
%\VignetteIndexEntry{using-optistock}
%\VignetteEngine{knitr::rmarkdown}
%\VignetteEncoding{UTF-8}
---
```{r, include = FALSE}
knitr::opts_chunk$set(
collapse = TRUE,
comment = "#>"
)
options(rmarkdown.html_vignette.check_title = FALSE)
```
```{r setup, echo = FALSE}
library(optistock)
```
The main point of the optistock package is to produce cost-per-fish (CPF)
curves for determining how expensive it is to stock fish on any given day
based on the management outcome. The model combines information from a species
growth and natural mortality, as we well as hatchery rearing costs to determine
the economically optimum time to stock fish that will result in the lowest cost.
A simple CPF curve might look something like the following:
\
```{r, cpf_curve, fig.height = 4, fig.width = 7, echo = FALSE}
curve(
cost_per_fish(
time_at_stocking = x,
time_at_rec = 1000,
n_recruits_desired = 200,
cost_fun = linear_total_cost,
cost_fun_args = list(int = 20, beta = 0.01),
mort_fun = exp_mort,
mort_fun_args = list(
m_init = 0.001, m_inf = 0.0001, alpha = 0.05, t_scale = 200
)
),
0, 1000,
xlab = "Time (days)", ylab = "Cost-per-fish ($)"
)
```
The code to produce the above curve is called with a single function that
includes arguments for mortality and cost curves. Growth is used in the model
to determine how long it will take for fish to get to a certain length. Here is
the code that produced the above curve. While it may look unwieldy at first it
is actually fairly concise once all the compoents are understood.
```{r, cpf_curve_code, fig.height = 4, fig.width = 7, eval = FALSE}
curve(
cost_per_fish(
time_at_stocking = x,
time_at_rec = 1000,
n_recruits_desired = 200,
cost_fun = linear_total_cost,
cost_fun_args = list(int = 20, beta = 0.01),
mort_fun = exp_mort,
mort_fun_args = list(
m_init = 0.001, m_inf = 0.0001, alpha = 0.05, t_scale = 200
)
),
0, 1000,
xlab = "Time (days)", ylab = "Cost-per-fish ($)"
)
```
### Shiny App
You can create your own examples by calling `optistock_app()`, which will
open a shiny application that allows you to adjust the model.
___
## Package Details
This package contains all the necessary functions to be able to compute
cost-per-fish for different fish stocking scenarios so long as growth,
mortality, and hatchery costs are known (or assumed). The model starts with a
management objective of having a certain number of fish of a certain length in a
waterbody at some point in the future. Starting there one can work backwards
using a growth function to determine how long (on average) it will take fish to
grow that long. Once the time-to-length is calculated a mortality function can
be used to determine how many fish need to be stocked at any given time to
result in the desired number of fish of length $L$ at recruitment time $t_R$.
## Growth functions
The growth functions in this package are used to determine how long it will take
a fish to reach length $L$. There are both growth functions and inverse growth
functions. Growth functions take an input of time $t$ and corresponding growth
parameters (i.e. for von Bertalanffy -- $L_{\infty}$, $k$, and $t_0$). The returned
value is the length $L$ at time $t$.
Inverse growth functions take the same growth parameters as the corresponding
growth function, but take a length $L$ and return the time $t$ that the average
fish will reach that length.
### Growth Curve
```{r, fig.height = 4, fig.width = 7}
time <- 1:1000
linf <- 50
k <- 0.4 / 365
t0 <- -0.5 * 365
len_at_age <- vbgf(time, linf, k, t0)
plot(len_at_age ~ time, type = "l", xlab = "Age (days)", ylab = "Length")
```
\
\
### Inverse Growth Curve
```{r, fig.height = 4, fig.width = 7}
age_at_len <- inv_vb(len_at_age, linf, k, t0)
plot(age_at_len ~ len_at_age, type = "l", xlab = "Length", ylab = "Age (days)")
```
\
\
## Mortality functions
There are currently 8 different mortality functions in optistock. These
return the natural mortality at time $t$ given the input parameters.
```{r, mortality_curves, fig.height = 4, fig.width = 7}
curve(
exp_mort(x, m_init = 0.5, m_inf = 0.05, alpha = 0.05, t_scale = 200),
0, 1000,
xlab = "Time (days)", ylab = "M"
)
curve(
decreasing_mort(x, m_init = 0.5, m_inf = 0.05, alpha = 0.99),
0, 1000,
xlab = "Time (days)", ylab = "M"
)
```
\
\
## Cost functions
There are two types of cost functions available to calculate total costs to
raise fish to a certain day. One is a linearly increasing function where total
costs increase at a constant rate across time. The other is an exponentially
increasing function where the total cost increases at a greater rate as time
goes along. In both cases the cost can be made to increase exponentially along
with the number of recruits raise if that behavior is so desired.
### Linear total cost
```{r, linear_total_cost, fig.height = 4, fig.width = 7}
recruits <- 1
int <- 1.2
beta <- 0.05
curve(
linear_total_cost(x, recruits, int, beta),
0, 1000,
xlab = "Time (days)", ylab = "Cost ($)"
)
```
### Exponential Total Cost
```{r, total_daily_cost, fig.height = 4, fig.width = 7}
init_cost <- 0.01
time_slope <- 0.01
time_exp <- 1.05
rec_slope <- 1
rec_exp <- 1
curve(
total_daily_cost(x, recruits, init_cost, time_slope, time_exp, rec_slope, rec_exp),
0, 1000,
xlab = "Time (days)", ylab = "Cost ($)"
)
```