Add renewal / initialconditions to a g3 model

g3a_renewal_vonb_recl(
        Linf = g3_parameterized('Linf', value = 1, by_stock = by_stock),
        K = g3_parameterized('K', value = 1, by_stock = by_stock),
        recl = g3_parameterized('recl', by_stock = by_stock),
        recage = g3_parameterized('recage', by_stock = FALSE, optimise = FALSE),
        by_stock = TRUE)

g3a_renewal_vonb_t0(
        Linf = g3_parameterized('Linf', value = 1, by_stock = by_stock),
        K = g3_parameterized('K', value = 1, by_stock = by_stock),
        t0 = g3_parameterized('t0', by_stock = by_stock),
        by_stock = TRUE)

g3a_renewal_initabund(
    scalar = g3_parameterized('init.scalar', value = 1, by_stock = by_stock),
    init = g3_parameterized('init', value = 1, by_stock = by_stock, by_age = TRUE),
    M = g3_parameterized('M', by_stock = by_stock, by_age = TRUE),
    init_F = g3_parameterized('init.F', by_stock = by_stock_f),
    recage = g3_parameterized('recage', by_stock = FALSE, optimise = FALSE),
    proportion_f = ~1,
    by_stock = TRUE,
    by_stock_f = FALSE)

g3a_initialconditions(stock, num_f, wgt_f, run_f = ~cur_time == 0L,
        run_at = g3_action_order$initial)

g3a_initialconditions_normalparam(
        stock,
        factor_f = g3a_renewal_initabund(by_stock = by_stock),
        mean_f = g3a_renewal_vonb_t0(by_stock = by_stock),
        stddev_f = g3_parameterized('init.sd', value = 10,
            by_stock = by_stock, by_age = by_age),
        alpha_f = g3_parameterized('walpha', by_stock = wgt_by_stock),
        beta_f = g3_parameterized('wbeta', by_stock = wgt_by_stock),
        age_offset = quote( cur_step_size ),
        by_stock = TRUE,
        by_age = FALSE,
        wgt_by_stock = TRUE,
        run_f = ~cur_time == 0L,
        run_at = g3_action_order$initial)

g3a_initialconditions_normalcv(
        stock,
        factor_f = g3a_renewal_initabund(by_stock = by_stock),
        mean_f = g3a_renewal_vonb_t0(by_stock = by_stock),
        cv_f = g3_parameterized('lencv', by_stock = by_stock, value = 0.1,
            optimise = FALSE),
        alpha_f = g3_parameterized('walpha', by_stock = wgt_by_stock),
        beta_f = g3_parameterized('wbeta', by_stock = wgt_by_stock),
        age_offset = quote( cur_step_size ),
        by_stock = TRUE,
        by_age = FALSE,
        wgt_by_stock = TRUE,
        run_f = ~cur_time == 0L,
        run_at = g3_action_order$initial)

g3a_renewal(stock, num_f, wgt_f, run_f = ~TRUE,
        run_at = g3_action_order$renewal)

g3a_renewal_normalparam(
        stock,
        factor_f = g3_parameterized('rec',
            by_stock = by_stock,
            by_year = TRUE,
            scale = g3_parameterized(
                name = 'rec.scalar',
                by_stock = by_stock),
            ifmissing = NaN),
        mean_f = g3a_renewal_vonb_t0(by_stock = by_stock),
        stddev_f = g3_parameterized('rec.sd', value = 10, by_stock = by_stock),
        alpha_f = g3_parameterized('walpha', by_stock = wgt_by_stock),
        beta_f = g3_parameterized('wbeta', by_stock = wgt_by_stock),
        by_stock = TRUE,
        wgt_by_stock = TRUE,
        run_age = quote(stock__minage),
        run_projection = FALSE,
        run_step = 1,
        run_f = NULL,
        run_at = g3_action_order$renewal)

g3a_renewal_normalcv(
        stock,
        factor_f = g3_parameterized('rec',
            by_stock = by_stock,
            by_year = TRUE,
            scale = g3_parameterized(
                name = 'rec.scalar',
                by_stock = by_stock),
            ifmissing = NaN),
        mean_f = g3a_renewal_vonb_t0(by_stock = by_stock),
        cv_f = g3_parameterized('lencv', by_stock = by_stock, value = 0.1,
            optimise = FALSE),
        alpha_f = g3_parameterized('walpha', by_stock = wgt_by_stock),
        beta_f = g3_parameterized('wbeta', by_stock = wgt_by_stock),
        by_stock = TRUE,
        wgt_by_stock = TRUE,
        run_age = quote(stock__minage),
        run_projection = FALSE,
        run_step = 1,
        run_f = NULL,
        run_at = g3_action_order$renewal)

Arguments

stock

The g3_stock to apply to

num_f

formula that produces a lengthgroup vector of number of individuals for the current age/area/... length group.

wgt_f

formula that produces a lenghgroup vector of mean weight for the current age/area/... length group.

run_at

Integer order that actions will be run within model, see g3_action_order.

factor_f,mean_f,stddev_f,alpha_f,beta_f

formula substituted into normalparam calcuations, see below.

cv_f

formula substituted into normalcv calcuations, basically stddev_f = mean_f * cv_f, see below.

age_offset

Replace age with age - age_offset in mean_f. Used to simulate initialconditions at time "-1".

run_age

Age to run renewals for, used as age == (run_age) into default run_f

run_projection

Boolean. Run renewal in projection years? If false adds !cur_year_projection into default run_f

run_step

Which step to perform renewal in, or NULL for continuous renewal. Adds cur_step == (run_step) into default run_f

run_f

formula specifying a condition for running this action, For initialconditions defaults to first timestep. For renewal, the default is a combination of run_age, run_step & run_projection.

Linf,K,t0,recl

formula substituted into vonb calcuations, see below.

recage

formula substituted into initial abundance and vonb calcuations, see below.

proportion_f,scalar,init,M,init_F

formula substituted into initial abundance calcuations, see below.

by_stock,wgt_by_stock,by_stock_f,by_age

Controls how parameters are grouped, see g3_parameterized

Details

A model can have any number of g3a_renewal_* actions, so long as the calling arguments are different. For instance, run_f = ~age == 5 and run_f = ~age == 7.

The g3a_renewal_* actions will define the following stock instance variables for stock:

stock__renewalnum

Extra individuals added to the stock

stock__renewalwgt

Mean weight of added individuals

Value

g3a_renewal_vonb_recl

A formula object representing $$ L_{\infty} * {1 - e^{-1 * \kappa * (a - (a_{0} + \frac{\log(1 - L_{0}/L_{\infty})}{\kappa} ))}} $$

\(L_{0}\)

Substituted for recl

\(L_{\infty}\)

Substituted for Linf

\(\kappa\)

Substituted for K

\(a_{0}\)

Substituted for recage

NB: g3a_initialconditions_normalparam will replace \(a\) with \(a - \Delta{t}\), see age_offset

g3a_renewal_vonb_t0

A formula object representing $$ L_{\infty} * (1 - e^{-1 * \kappa * (a - t_{0}) }) $$

\(L_{\infty}\)

Substituted for Linf

\(\kappa\)

Substituted for K

\(t_{0}\)

Substituted for t0

NB: g3a_initialconditions_normalparam will replace \(a\) with \(a - \Delta{t}\), see age_offset

g3a_renewal_vonb

An alias for g3a_renewal_vonb_recl()

g3a_renewal_initabund

A formula object representing $$ scalar * init * e^{-1 * (M + F_{0}) * (a - a_{0}) } * proportion $$

scalar

Substituted for scalar

init

Substituted for init

\(M\)

Substituted for M

\(F_{0}\)

Substituted for init_F

\(a_{0}\)

Substituted for recage

proportion

Substituted for proportion

g3a_initialconditions / g3a_renewal

An action (i.e. list of formula objects) that will, for the given stock, iterate over each area/age/etc. combination, and generate a lengthgroup vector of new individuals and weights using num_f and wgt_f.

renewal will add fish to the existing collection, whereas initialconditions will assume the stock is currently empty.

g3a_initialconditions_normalparam / g3a_renewal_normalparam

As g3a_initialconditions / g3a_renewal, but the following formulae are used to calculate num/wgt:

$$n = e^{-(\frac{L - \mu}{\sigma})^2 / 2}$$ $$N = F 10000 \frac{n}{\sum n}$$ $$W = \alpha L^{\beta}$$

\(L\)

Midlength of length groups for current area/age/...

\(F\)

Substituted for factor_f

\(\mu\)

Substituted for mean_f

\(\sigma\)

Substituted for stddev_f

\(\alpha\)

Substituted for alpha_f

\(\beta\)

Substituted for beta_f

g3a_initialconditions_normalcv / g3a_renewal_normalcv

As g3a_initialconditions / g3a_renewal, but the following formulae are used to calculate num/wgt:

$$n = e^{-(\frac{L - \mu}{\mu * {CV}})^2 / 2}$$ $$N = F 10000 \frac{n}{\sum n}$$ $$W = \alpha L^{\beta}$$

\(L\)

Midlength of length groups for current area/age/...

\(F\)

Substituted for factor_f

\(\mu\)

Substituted for mean_f

\(CV\)

Substituted for cv_f

\(\alpha\)

Substituted for alpha_f

\(\beta\)

Substituted for beta_f

Examples

library(magrittr)
ling_imm <- g3_stock('ling_imm', seq(20, 156, 4)) %>% g3s_age(3, 10)

initialconditions_action <- g3a_initialconditions_normalparam(
    ling_imm,
    by_age = TRUE)  # per-age init.sd parameters
renewal_action <- g3a_renewal_normalparam(
    ling_imm,
    run_step = 2)  # Renewal happens in spring

# To get a single ling_imm.lencv parameter instead of init.sd
initialconditions_action <- g3a_initialconditions_normalcv(
    ling_imm)
renewal_action <- g3a_renewal_normalcv(
    ling_imm,
    run_step = 2)  # Renewal happens in spring

## Plots
par(mar = c(4,2,2,1), cex.main = 1)
curve(g3_eval(g3a_renewal_vonb_t0(Linf = 20, K = 0.8, t0 = 0), age = x),
    0, 10, col = 2, xlab = "age", main = "g3a_renewal_vonb_t0(Linf = 20, K = 0.8..1.4, t0 = 0)")
curve(g3_eval(g3a_renewal_vonb_t0(Linf = 20, K = 1.0, t0 = 0), age = x),
    0, 10, col = 1, add = TRUE)
curve(g3_eval(g3a_renewal_vonb_t0(Linf = 20, K = 1.2, t0 = 0), age = x),
    0, 10, col = 3, add = TRUE)
curve(g3_eval(g3a_renewal_vonb_t0(Linf = 20, K = 1.4, t0 = 0), age = x),
    0, 10, col = 4, add = TRUE)