This extension package for mizer allows you to work with multiple size-structured background resources in the same way in which you work with multiple species in mizer. Modelled species can have different preferences for different resources, defined though maximum availability of resource available to species, in a similar way as setting species interaction matrix. Each background resource can have different minimum and maximum sizes, and different size spectrum slopes (lambda) or abundances (kappa). This allows the user to reproduce emergent onto-genetic dietary shifts, where a species feed in a plankton spectrum when it is small, then switches to benthic spectrum, and later to other fish species.
remotes::install_github("sizespectrum/mizerMR")
library(mizerMR)
Multiple size-structured resources are set up in a very similar manner to multiple species. Just as for multiple species we need a species_params
data frame with the information about the species, for multiple resources we need a resource_params
data frame, with one row for each resource. Here is an artificial example with two resources:
library(tibble)
resource_params <- tribble(
~resource, ~kappa, ~lambda, ~r_pp, ~w_min, ~w_max,
"Resource 1", 1e11, 2.13, 4, NA , 0.01,
"Resource 2", 1e11, 2.05, 10, 1e-4, NA
)
Similarly to how we can set resource parameters for a single resource in standard mizer with setResource()
, you can now set multiple resources with setMultipleResources()
. So if for example we wanted to add these resources to the North Sea model described by the NS_params
MizerParams object, we would do
params <- setMultipleResources(NS_params, resource_params)
This has given us a new MizerParams object in which the original resource has been replaced by our two resources. We can then work with this MizerParams object as usual. For example we can project it forward in time:
sim <- project(params, t_max = 2, t_save = 0.2)
and plot the resulting spectra:
plotSpectra(sim, power = 2)
We can also animate the spectra with animateSpectra(sim)
. Most mizer functions will work as usual.
We can access the simulation results for the resource with NResource()
. This gives a three-dimensional array:
str(NResource(sim))
#> num [1:11, 1:2, 1:226] 9.87e+37 9.87e+37 9.87e+37 9.87e+37 9.87e+37 ...
#> - attr(*, "dimnames")=List of 3
#> ..$ time : chr [1:11] "0" "0.2" "0.4" "0.6" ...
#> ..$ resource: chr [1:2] "Resource 1" "Resource 2"
#> ..$ w : chr [1:226] "2.12e-13" "2.53e-13" "3.02e-13" "3.61e-13" ...
So the first dimension is the time, the second the resource and the third the size. Thus to get the abundance density of Resource 2 at time 0.6 at sizes between 0.1g and 5g we could do
select_w <- w_full(params) >= 1 & w_full(params) <= 5
NResource(sim)["0.6", "Resource 2", select_w]
#> 1.18 1.4 1.68 2 2.39 2.85
#> 29171099375 20197414266 14020889066 9759285393 6811166565 4765970415
#> 3.4 4.06 4.84
#> 3342985300 2349927216 1654807045
This is perfectly analogous to how we would access the abundance density of fish species, except that the range of sizes is given by w_full
rather than by w
.
Just as we are able to specify how strongly a predator species interacts with a prey species via the interaction
matrix, we can also specify how strongly a predator species interacts with each resource via the resource_interaction
, which is a matrix with one row for each species and one column for each resource. For example
resource_interaction <- matrix(runif(24), nrow = 12, ncol = 2)
params <- setMultipleResources(NS_params, resource_params, resource_interaction)
Resource parameters can be changed at any time. For example we can double the carrying capacity of the first resource with
resource_params(params)$kappa[1] <- 2 * resource_params(params)$kappa[1]
We can also use this kind of notation as an alternative to setMultispeciesParams()
. For example
params <- NS_params
resource_params(params) <- resource_params
resource_interaction(params) <- resource_interaction
By default the initial values for the resources will be equal to the carrying capacities. But if a user has their own array (resource x size) of resource number densities my_n_resource
they can set these as the initial values with
initialNResource(params) <- my_n_resource
Users who are not happy with the allometric expressions for the resource carrying capacities or the replenishment rates but have created their own matrices my_capacity
and my_rate
with one row for each resource and one column for each size can set these with
resource_capacity(params) <- my_capacity
resource_rate(params) <- my_rate
Rather than adding the multiple resources to an existing model, the user can also create a new model with multiple resources with
params <- newMRParams(species_params, interaction, resource_params,
resource_interaction, gear_params)