Fish biomass per species, aggregated by sampling station, together with environmental covariates for each station. Derived from the fish community monitoring of stream sections across metropolitan France (1995-2018) by the French Office for Biodiversity (formerly ONEMA, "Office National de l'Eau et des Milieux Aquatiques"), using electrofishing.
Format
A list with 2 elements:
- biomass
a 399 x 46 numeric matrix of total biomass (grams) per species (3-letter species code, columns) and station (row names).
- covariates
a data frame with one row per station, in the same order as the rows of `biomass`: `station` (matches `rownames(biomass)`) and 14 environmental variables – `slope`, `alt` (altitude), `d_source` (distance to source), `strahler` (Strahler stream order), `width_river_mean`/`width_river_cv`, `avg_depth_station_mean`/ `avg_depth_station_cv`, `DBO_med`/`DBO_cv` (biological oxygen demand), `flow_med`/`flow_cv` and `temperature_med`/`temperature_cv` (`_med` = median, `_cv` = coefficient of variation, over the monitoring period).
Source
Danet, A., Mouchet, M., Bonnaffe, W., Thebault, E., Fontaine, C. (2021) "Species richness and food-web structure jointly drive community biomass and its temporal stability in fish communities", data set, Zenodo, doi:10.5281/zenodo.5095656 .
Details
The source data is organized around fishing *operations* (`opcod`): several electrofishing operations can be carried out at the same *station* over time. `onema` aggregates this to one row per station: every operation is first mapped to its station (`fishing_protocol.csv`), then biomass (in grams) is summed over every operation recorded at a given station, separately for each species (i.e. `biomass[s, ]` is the total biomass of each species ever caught at station `s`, not a single operation's catch). Stations without environmental data are dropped. Species observed at fewer than 10 stations are also dropped: at that level of rarity, a zero-inflated fit's iterative initialization can fit a species' handful of non-zero observations exactly, driving its estimated noise precision to infinity (these species also carry essentially no information for clustering anyway).
Examples
Y <- log(1 + onema$biomass)
X <- model.matrix(~ 1, data = onema$covariates)
nb_data <- NormalBlockData$new(Y, X)
# \donttest{
out <- normal_block(nb_data, 2:15, control = NB_control(clustering_init = "ward2"))
#> Fitting a diagonal normal-block model with unknown q
#> number of blocks = 2
number of blocks = 3
number of blocks = 4
number of blocks = 5
number of blocks = 6
number of blocks = 7
number of blocks = 8
number of blocks = 9
number of blocks = 10
number of blocks = 11
number of blocks = 12
number of blocks = 13
number of blocks = 14
number of blocks = 15
#> DONE
# }