This is a tutorial for using the R package dietr
.
dietr
uses diet or food item data to calculate trophic
levels following the procedures described in TrophLab
(Pauly et al., 2000), which currently is only avaialble as a Microsoft
Access database program. Our implementation is very easy to use and
extremely fast as users can specify all their data as dataframes. It
also differs from TrophLab in that users can specify a taxonomic
hierarchy and measure trophic levels from their data at various levels
(e.x. individual,population, species,genus, etc.). dietr
also works well with FishBase (Froese & Pauly, 2018) data and can
use diet and food item data obtained in R using the rfishbase package
(Boettiger et al., 2012). In addition to estimating trophic levels,
dietr
can also estimate various electivity indices used in
diet studies.
For this tutorial we will refer to diet data as quantitative stomach content data where the proportion of prey items are known (e.x. percent volume or weight of prey items, be cautious using percent frequency as various literature suggest it may be misleading). In this case, trophic level is simply estimated by adding one to the sum of trophic levels of the prey items consumed weighted by their contribution to the diet. The trophic level of consumer i(\(Troph_i\)) is defined by the equation below:
\[Troph_i=1+\sum_{j=1}^{G}DC_{ij}\times Troph_j\]
Here \(Troph_j\) is the trophic level of the jth prey item consumed in the diet of i, \(DC_{ij}\) is the fraction of prey item j in the diet of i, and G is the number of prey species in the diet.
As estimates of prey trophic levels may not be exact, the standard error around the estimate of the trophic level can be calculated with equation 2. TrophLab gets around this by assigning a standard error for each trophic level and using the below equation to measure the standard error (which they also refer to as the omnivory index). Here, the standard error of the focal species i, \(s.e._{i}\), is calculated as the square root of the sum of the product of the standard errors of the prey items \(s.e._{j}\) to the second weighted by their respective contribution in the diet, \(DC_{ij}\) over 100.
\[s.e_{i}=\sqrt{\frac{\sum_{j=1}^{G}DC_{ij}*s.e._{j}^2}{100}}\]
For estimating trophic levels from food items found in the diet that
don’t have proportions, a random sampling and ranking of the food items
is used to get an estimate of the trophic level. The simulated
proportion of prey items for calculating trophic level, P
is calculated using the following equation:
\[log_{10}P=2-1.9log_{10}R-0.16log_{10}G\]
Here, R
is the rank of the food item and G
is the number of food items, up to 10. If more than 10 food items are
listed, then a subsample of ten are randomly selected. The trophic level
is then calculated using the following equation:
\[Troph=\sum(P_i*Troph_i)/\sum{P_i}\]
Here, \(P_i\) is the simulated proportion of the prey item i in the diet and \(Troph_i\) is the trophic level of prey item i. This procedure is repeated n times and the mean of these n simulations is taken as the trophic level. In cases where only a single prey item is in the diet, the procedure is much simpler and the estimated trophic level is simply calculated by adding 1 to the trophic level of the single prey item.
The estimate of the standard error around the trophic level from food item data is defined below. Here, the standard error is the square root of the sum of the product of the standard error of a prey item squared and the contribution of the prey item minus 1 divided by the sum of the contribution of the prey items, P, minus the total number of prey items, G. For food item data, the random sampling routine and calculation to estimate trophic level and standard error is repeated 100 times, with the final trophic level and standard error being the mean of these 100 calculations.
\[s.e_{i}=\sqrt{\frac{(s.e_{1})^2*(P_{1}-1)+(s.e._{2})^2*(P_{2}-1)...(s.e_{G})^2*(P_{G}-1)}{\sum{P-G}}}\]
In this tutorial we will cover the basics of how to use
dietr
to measure trophic levels. We will first discuss how
to read in data from FishBase using rfishbase and how to pass that data
into dietr
. We will then show how one can input their own
raw data and use the package to estimate trophic levels.
In order to install the stable CRAN version of the dietr
package:
install.packages("dietr")
While we recommend use of the stable CRAN version of this package, we
recommend using the package devtools
to temporarily install
the development version of the package from GitHub if for any reason you
wish to use it:
#1. Install 'devtools' if you do not already have it installed:
install.packages("devtools")
#2. Load the 'devtools' package and temporarily install the development version of
#'dietr' from GitHub:
library(devtools)
dev_mode(on=T)
install_github("sborstein/dietr") # install the package from GitHub
library(dietr)# load the package
#3. Leave developers mode after using the development version of 'dietr' so it will not
#remain on your system permanently.
dev_mode(on=F)
To load dietr
and all of its functions/data:
library(dietr)
To run dietr
you will need the following data as inputs.
First is diet or food item data, which our functions call in DietTroph
and FoodTroph as DietItems
and FoodItems
respectively. These should be organized from most inclusive to least
inclusive from left to right and have column names.
The second is a dataframe of trophic levels of the prey, or as we
name them in the functions, PreyValues
. We include a few
different datasets with prey values users can use, though you can also
supply your own. FishBasePreyVals
are the values
FishBase/TrophLab use to calculate trophic levels.
CortesPreyVals
are standardized diet prey values for sharks
from Cortes, 1999. Both of these can be loaded into R from
dietr
using the data()
function:
data(FishBasePreyVals)#Load the Fishbase trophic levels of prey items
#Standardized trophic levels of prey items for elasmobranchs
data(CortesPreyVals)#Load the Cortes (1992)
The last data object we need is a data frame we call
Taxonomy
. Columns of this dataframe should move from least
inclusive to most inclusive from left to right. This data is used to
assign individuals to groups for measuring hierarchical trophic levels
(ex. trophic levels for an individuals, populations, species, etc.).
This can be as simple as just a single column data frame if you only
want to measure trophic levels for each individual and not at a higher
level.
Our first example will use FishBase diet data. Unfortunately, this
was easier to do with previous versions of rfishbase
where
you could specify the taxa you wanted data for from the
diet function
and this function had to be re-written to
work with rfishbase 3.0
. In version 3.0 and above, the
rfishbase
seperated the function into two different
functions that are not intuitively useful as one returns the actual diet
data (diet_items
) and the other returns the metadata for
the diet records (diet
). Unfortunately, one must manually
merge these records together to see what species belong to which diet
data and uses can no longer specify a single taxon to retrieve data for.
dietr
’s ConvertFishBaseDiet
function does the
merging of these two data sets for you and allows you to exclude life
history stages while converting the data into a format that can be used
to calculate trophic levels in dietr
. However, as
rfishbase
no longer allows you to specify species to
return, the function downloads all available diet data, thus, users will
need to filter out their focal taxa.
The function has only one argument, ExcludeStage
, in
which users specify if they want to exclude a stage (ex. larvae) or not
(in which case ExcludeStage = NULL
). It returns a list of
two data frames. The first, named DietItems
contains the
diet items while the second, Taxonomy
, contains the
taxonomy for calculating heirarchical trophic levels. Below, we will get
FishBase diet for use with dietr
while removind records
from immature specimens.
# Convert Fishbase Diet Data and exclude juvenile and larval records
my.diets <- ConvertFishbaseDiet(ExcludeStage=c("recruits/juv.","larvae"))
We can see that my.diets
object we created is a list
containing two data frames. The first one, called DietItems, contains
the information about diet composition, with FoodI
,
FoodII
,FoodIII
, Stage
and
DietPercent
being the fields with descriptors for the
various diets. In this case, each diet item has its own row in the data
frame. The first column, Individual
, contains the fish base
diet reference number unique to that study. By including this, one can
have multiple studies of the same species and then pool the data using
the Taxonomy, which is the second data frame in our list. The
Species
column in the DietItems
data frame
contains the species name. For example, from the
my.diets$DietItems
object we created above, we can see that
the first record in our dataset Merlangius merlangus with the
diet record number of 4
ate eight different items,
mollusks, squids/cuttlefish, bony fish, n.a./other annelids, and a
variety of other invertebrates. If we look at
my.diets$Taxonomy
we will see it is a data frame of two
columns. For FishBase data, our function returns each individual diet
study for a species in the column Individual
. The next
column has the respective species name. This information will then be
used to calculate the trophic levels for each individual diet record and
then for all records belonging to that species.
We can now measure the trophic level from diet items using the
function DietTroph
. Here, we will specify our
DietItems
and Taxonomy
using the
cleaned.diets
object we generated above. We will also
specify the PreyValues
as being the included
FishBasePreyVals
that are part of the package. As the
columns for the PreyVals
and DietItems
use a
calssification of “FoodI”,“FoodII”,“FoodIII”,“Stage”, we will specify
these as a vector for the PreyClass
argument. For this
example, lets just focus on a single species with multiple diet records,
Epinephelus itjara, which has a total of three records.
#Remove Data for Epinephelus itajara
my.diets$DietItems <- my.diets$DietItems[my.diets$DietItems$Species ==
"Epinephelus itajara",]
my.diets$Taxonomy <- my.diets$Taxonomy[my.diets$Taxonomy$Species ==
"Epinephelus itajara",]
We can now calculate the trophic levels. We will use the trophic
levels of prey from FishBase, which is a data object that can be loaded
named FishBasePreyVals
. We will specify our diet data and
taxonomy with the parameter DietItems
and
Taxonomy
respectively. We also need to specify how the prey
is classified. This is meant to be flexible and tells dietr
how to relate the values in DietItems
to the values in
PreyValues
. If we look at the columns of both, we can see
they use a classification scheme of FoodI
,
FoodII
,
“FoodIIIand
Stage, so we will input that information in
PreyClass. We will show the flexibility of this parameter a little later in this vignette in another example.The final parameter,
SumCheckchecks that the diet data do infact sum to 100 as would be expected if they are percent composition and will recalculate if they are not. I strongly recommend this always be set to
TRUE`.
data(FishBasePreyVals)#load the FishBase prey values that are part of the dietr package
#Calculate trophic level with DietTroph function
my.TL<-DietTroph(DietItems = my.diets$DietItems,PreyValues = FishBasePreyVals,
Taxonomy = my.diets$Taxonomy, PreyClass=c("FoodI","FoodII","FoodIII","Stage"),
SumCheck = TRUE)
We can see that the my.TL
object we just created
contains a list of length two, each with a data frame, with the names of
these data frames matching the Taxonomy
we provided. We can
see that the first data frame in this list, named
Individual
contains the trophic levels for each individual
study that we input, while the data frame named Species
provides the mean trophic level and SE and the number of studies across
all individuals for each species.
Our second example will estimate trophic level from food item data.
The process is extremely similar to the above. For this example, let’s
get some data from rfishbase using the fooditems
function
for the same two species we did above.
#Get some food item data from rfishbase
my.food<-rfishbase::fooditems(c("Lutjanus apodus","Epinephelus itajara"))
In order to use this in dietr
, we will need to convert
it using the function ConvertFishbaseFood
. This function is
basically identical to the ConvertFishbaseDiet
function we
used above, except our data frame is from the fooditems
function. We will then use FoodTroph
function to calculate
the trophic level. It is important to note that as this method randomly
samples food items and ranks them for calculating the trophic level,
that each time you run the function you will get a slightly different
result, though they should largey be close in value.
#Convert FishBase food item data to a format usable for FoodTroph
converted.foods<-ConvertFishbaseFood(my.food)
#Calculate trophic level from food items
my.TL<-FoodTroph(FoodItems = converted.foods$FoodItems,PreyValues = FishBasePreyVals,
Taxonomy = converted.foods$Taxonomy,PreyClass=c("FoodI","FoodII","FoodIII","Stage"),
Iter = 100, SE.Type = "TrophLab")
dietr
was written with flexability in mind so it is easy
for users to use their own data or data from non-FishBase sources to
calculate trophic levels. In this section, we will discuss how we can
use this flexibility to customize trophic level calculations for a
dataset. For this example, we will use data from Magalhaes et al., 2015,
which analyzed the stomach contents of the cichlid Herichthys
minckleyi volumetrically. Do note that this example is likely more
complex than how it would be to use dietr
on your own data
given the data from Magalhaes et al., 2015 is not formatted in a way
that is super compatible with dietr
. A lot of this code in
the example for formatting the data for use with dietr
may
not be necessary if your data is collected and formatted in a way that
is similar to what is used by dietr
.
First we can load the data. We will mostly be focusing on the last ten columns, which contain the volumetric proportions of the prey items as well as the first three columns which contain information on the individual fish, the lake it was caught, and the year in which it was caught.
data(Herichthys)
Note, this is the raw data from their paper and contains other data on morphology and genotypes. As such, not all individuals have diet data associated with them, so we will want to remove them.
#Subset out individuals with diet data
HMdat<-Herichthys[Herichthys$total==100,]
For this tutorial lets measure four hierarchical trophic levels.
Specifically, we will measure trophic levels at the individual, lake by
year, lake (across all years), and for the species inclusive of all
Herichthys minckleyi individuals. To do this, we will need to
generate a four column data frame to input as our Taxonomy
parameter. We can do this by doing the following.
#Make a data frame of the individuals, lake by year, and lake.
HMtax<-cbind.data.frame(HMdat$individual,paste(HMdat$lake,HMdat$year),HMdat$lake)
#Name the data frame
colnames(HMtax)<-c("Individual","Lake x Year","Lake (all years)")
#To calculate trophic level for the entire species, add a vector to the data frame of
#the species name
HMtax$species<-"Herichthys minckleyi"
Next, we need to organize the data for input with dietr. First, lets grab out the data.
HMdat<-HMdat[,c("individual","X.Gastrop","X.Insect","X.Fish","X.Zoopl","X.plants",
"X.algae", "X.detritus")]
Remember that dietr
requires each row to be a unique
diet item per individual and that the first column contains the
individual’s name. We will need to format our data to work. Currently,
we can see that for each individual, there are columns for the prey
items, so we will need to take the data in these columns and make each
prey item a row.
#Repeat the individual name the number of unique prey types (6)
Inds<-rep(x = HMdat$individual, times=6)[order(rep(x = HMdat$individual, times=6))]
#Repeat the number of food typed the length of the number of individuals
FoodTypes<-rep(x = colnames(HMdat[2:7]),times=length(unique(HMtax$Individual)))
#Make a data frame, the length of the individuals with three columns
HM.mat<-as.data.frame(matrix(nrow = length(Inds),ncol = 3))
#Name these columns
colnames(HM.mat)<-c("Individual","FoodItem","Percent")
#Populate the dataframes first column with the individual and the second column with
#the prey type
HM.mat$Individual<-Inds
HM.mat$FoodItem<-FoodTypes
#Run this for loop to find the diet data based on the individual and then match the
#diet percentage based on the name of the prey type
for(i in 1:nrow(HMdat)){
rows2match<-which(HM.mat$Individual==HMdat$individual[i])
HM.mat$Percent[rows2match]<-as.vector(as.numeric(HMdat[i,2:7]))
}
#Remove prey that do not contribute to diets
HM.mat<-HM.mat[!HM.mat$Percent==0,]
We can see that our data frame HM.mat
is of three
columns. The first row has our individual names, the second, the prey
name, and the third, the dietary contribution of that prey. We now need
to generate the prey values we want to use for calculating trophic
levels into a format that can be used with dietr
. For our
example, we can easily do this by creating a data frame, which we will
call PreyMat. The dimensions of this data frame will be three columns,
so we can input the prey name, prey trophic level, and prey SE (if we
want to have one, we can also just set them to 0, and functionally not
measure it). Note for this example, the values of the prey will be
equivalent to those in FishBasePreyVals
, but as an example,
I will show a simple way one could make prey values with vectors.
#Create a empty data frame for prey values
PreyMat<-as.data.frame(matrix(ncol = 3,nrow = 6))
#Name the columns something useful
colnames(PreyMat)<-c("FoodItem","TL","SE")
#Add in the prey name to the PreyMat
PreyMat[,1]<-unique(FoodTypes)
#Add in the trophic levels of the prey
PreyMat[,2]<-c(2.37,2.2,3.5,2.1,2,2)
#Add in the SE of the prey
PreyMat[,3]<-c(.58,.4,.8,.3,0,0)
We now have all our needed information to calculate trophic levels
(DietItems
, Taxonomy
, and
PreyValues
). We can now call dietr's
DietTroph
function and calculate trophic levels at the
individual, lake by year, lake, and species level we defined in our
Taxonomy data frame.
HM.TL<-DietTroph(DietItems = HM.mat,PreyValues = PreyMat, PreyClass = "FoodItem",
Taxonomy = HMtax, SumCheck = TRUE)
We can see that the object returned HM.TL
is a list that
has a length of four (one for each of our specified levels in taxonomy).
Each element of the list is a data frame containing the trophic level
calculations at the respective hierarchical levels.
While dietr
can estimate trophic levels from food item
and diet composition data as highlighted above, it can also measure a
number of popular electivity indices used in studies of trophic ecology.
The dietr
function Electivity
implements
Ivlev’s (1961), Strauss’ (1979), Jacob’s Q and D (1974), Chesson’s
(1983)(Which is similar to Manl’y Alpha (1974)), and Vanderploeg &
Scavia (1979) electivity indices. Electivity
takes two data
frames as input. One should contain the relative abundance of consumed
prey (argument Diet
) and the other should contain the
relative abundance of available prey items in the habitat (argument
Available
. Not that abundance percent should be as a
decimal (i.e. sum to 1, not 100). If users choose, they can upload input
data that is not in units of percent abundance and use the
CalcAbundance
option to do so. The input data frames should
be formatted as such. The data frame for Diet
should have
each individual row as a diet record. The first column should contain
the name of the diet record, the second, a identifier that links that
record to an identifier in the first row in the data frame for
Available
(i.e. a habitat name, year, etc.). All remaining
columns should contain a unique prey item and its relative abundance in
the diet. The Available
data frame contains similar data,
however, in this data frame, the first column contains the identifier
for the available prey relative abundance and all remaining columns
should represent prey items available in the habitat and match those in
Diet
. Note that the prey items in Diet
should
be the same as those in Available
and vice versa.
To highlight an example of how to use this function and how data should be formatted for it, we can load data from Horn, 1982. This is a dataset containing data on relative abundance by percent weight of macroalgae prey consumption and availability for two species of Stichaeidae in two different years. We can load it as such and see the format of the data by doing the following.
data(Horn1982)# load data
Horn1982$Consumed#See data for prey consumption
Horn1982$Available#See data for available prey
We can see here that we are identifying available prey her by year
and month in the first column of Horn1982$Available
and
that all remaining columns are prey items available during those two
time periods. In Horn1982$Consumed
we can see that the
first column is the name of the record and the second column matches a
record in the first column of Horn1982$Available
to link it
to prey availability. We can then run one or any of the indices using
the following code and arguments. We will define the consumed prey with
the Diet
argument as Horn1982$Consumed
,
Available
prey as Horn1982$Available
, and we
will denote we want to calculate all of the indices using the
Indices
argument. For calculating Jacobs’ Q, we will use
the argument LogQ
which takes log10
of Q,
which is recommended. We will also denote that we do not want to account
for prey depletion in the calculation of Chesson’s index. If set to
true, Chesson’s case 2 will be calculated.
my.indices <- Electivity(Diet = Horn1982$Consumed, Available = Horn1982$Available,
Indices = c("ForageRatio","Ivlev","Strauss","JacobsQ","JacobsD","Chesson",
"VanderploegScavia"),LogQ = TRUE, CalcAbundance = FALSE, Depleting = FALSE)
We can see that the Electivity
function returned a list
of data frames of class Electivity
. Each data frame
contains a calculated index and is named respective of the index
calculated. Do not that in some cases of these calculations, certain
calculations may yield NaN
values or Inf
values, for instance due to division by 0 or log of zero or negative
number. These typically arise when a prey item is either presentin the
habitat but not consumed, present in the diet but not in the habitat, or
where they are both absent from a record. In these cases,
NA
is returned.
We can also use the function PlotElcectivity
to plot our
Electivity calculations. This function takes an object of class
Electivity
and a few other parameters to choose what
indices are plotted as well as options for the plots themselves, such as
font size and color. Electivity calculations are input using hte
Electivity.Calcs
parameter. Users use the parameter
indices
to choose which of Ivlev’s, Strauss’, Jacob’s D,
and Vanderploeg & Scavia indices they want plotted. If numerous
indices are selected, numerous plots will be made. If users supply
colors via the BarColor
parameter, they must be the same
length as the number of records calculated in Electivity and supplied
via Electivity.Calcs
. IF no colors are supplied,
dietr
will automatically assign colors. The parameters
NameSize
, AxisFontSize
,
BorderCol
, LegendFontSize
, and
LegendTitle
control the font size of the names of prey
plotted, axis label size, color of bar plot border outlines, font size
of the legend, and the text used in the title of the legend
respectively.
For instance, if we wanted to plot the Vanderploeg & Scavia index
we calculated above, we could run the following. This will assign a
seperate color using the BarColor
argument.
PlotElectivity(Electivity.Calcs = my.indices, Indices = "VanderploegScavia",
BarColor = c("Red","Purple","Black","Grey"))
If we wanted to plot all four of the possible indices we can plot
that were previously calculated, we could also run this chunk of code.
For this example, I will not specify colors using BarColor
to highlight the default color selection. Note that based on the size of
your plotting window, you may need to adjust the size of the font.
PlotElectivity(Electivity.Calcs = my.indices)
If users have diet data that is in percent frequency of occurrence,
percent number, and percent volume or weight, dietr
can be
used to calculate three different composite indices. The first, the
Index of Preponderance (Natarajan & Jhingran, 1961 AKA Feeding Index
Kawakami & Vazzoler, 1980) is the product of the frequency of
occurrence of prey with either their volumetric or weight contribution
to the diet. The Index of Relative Importance (Pinkas et al., 1971) is
calculated as the the product of the sum of the weight or volume of a
prey item and the percent number and the percent frequency occurrence.
The Feeding Quotient (Hureau, 1970) is the product of the percent number
and the percent weight. For a review of these indices, I recommend de
Silviera et al., 2020.
The formatting for the input data is rather minimal for this
function. It is mandatory for this function that the first column
contain the diet record identifier and the second column the names of
the prey. The diet record identifier should be a unique name for each
record, which allows one to calculate feeding indices for numerous
records with a single call of the function. As the second column
contains the prey identifier, if a species feeds upon three different
prey, the first three rows of the dataset would have the same record
identifier. The remaining columns should contain information on the
percent frequency of occurrence, percent number, and percent weight or
volume, though the order of these does not matter as they are assigned
using the arguments PercentOccurrence
,
PercentNumber
, and PercentVolWeight
respectively. Users can specify which index/indices they want to
calculate with the Indices
argument, with the options being
IRI
, IOP
, FQ
for Index of
Relative Importance, Index of Preponderance, and Feeding Quotient
respectively. Users have the option of returning the full calculations
and the percents or just the percents with the PercentOnly
argument. If set to TRUE
only the percent of these indices
is returned. Additionally, if users want the raw data returned as well,
they can do so with the ReternRaw
argument. The dataset
Casaux1998
contains data highlighting how data should be
formatted for these functions as well as to run the examples.
#Load diet data from Casaux1998, which contains diet for two populations
#and is listed in percent frequency, percent number, and percent mass.
data(Casaux1998)
#Calculate all three diet indices (IOP, IRI, FQ), return the raw data, and all calculations.
CompositeIndices(DietData = Casaux1998, Indices = c("IOP","IRI","FQ"), PercentNumber = 4,
PercentOccurrence = 3, PercentVolWeight = 5, ReturnRaw = TRUE, PercentOnly = FALSE)
## $Harpagifer_antarcticus_PotterCove
## Prey PercentNumber PercentOccurrence PercentVolWeight IOP
## 1 Gammarids 86.5 98.4 95.9 9436.56
## 2 Isopods 2.0 8.9 0.3 2.67
## 3 Gastropods 5.8 23.6 0.5 11.80
## 4 Bivalves 0.3 1.6 0.0 0.00
## 5 Chitons 0.1 0.8 0.0 0.00
## 6 Polychaetes 0.7 4.9 1.7 8.33
## 7 Algae 4.6 30.9 1.6 49.44
## %IOP IRI %IRI FQ %FQ
## 1 99.24028269 17948.16 9.796384e+01 8295.35 99.854948600
## 2 0.02807925 20.47 1.117284e-01 0.60 0.007222476
## 3 0.12409557 148.68 8.115185e-01 2.90 0.034908636
## 4 0.00000000 0.48 2.619914e-03 0.00 0.000000000
## 5 0.00000000 0.08 4.366524e-04 0.00 0.000000000
## 6 0.08760306 11.76 6.418790e-02 1.19 0.014324578
## 7 0.51993942 191.58 1.045673e+00 7.36 0.088595710
##
## $Harpagifer_antarcticus_HarmonyPoint
## Prey PercentNumber PercentOccurrence PercentVolWeight IOP
## 1 Euphausia superba 88.7 95.5 95.9 9158.45
## 2 Gammarids 11.3 18.2 4.1 74.62
## %IOP IRI %IRI FQ %FQ
## 1 99.1918181 17629.30 98.435028 8506.33 99.4582972
## 2 0.8081819 280.28 1.564972 46.33 0.5417028
#Calculate all three diet indices and return only the percent of the index
CompositeIndices(DietData = Casaux1998, Indices = c("IOP","IRI","FQ"), PercentNumber = 4,
PercentOccurrence = 3, PercentVolWeight = 5, ReturnRaw = FALSE, PercentOnly = TRUE)
## $Harpagifer_antarcticus_PotterCove
## Prey %IOP %IRI %FQ
## 1 Gammarids 99.24028269 9.796384e+01 99.854948600
## 2 Isopods 0.02807925 1.117284e-01 0.007222476
## 3 Gastropods 0.12409557 8.115185e-01 0.034908636
## 4 Bivalves 0.00000000 2.619914e-03 0.000000000
## 5 Chitons 0.00000000 4.366524e-04 0.000000000
## 6 Polychaetes 0.08760306 6.418790e-02 0.014324578
## 7 Algae 0.51993942 1.045673e+00 0.088595710
##
## $Harpagifer_antarcticus_HarmonyPoint
## Prey %IOP %IRI %FQ
## 1 Euphausia superba 99.1918181 98.435028 99.4582972
## 2 Gammarids 0.8081819 1.564972 0.5417028
#Calculate Feeding Quotient and return the raw data and the all calculations.
CompositeIndices(DietData = Casaux1998, Indices = "FQ", PercentNumber = 4,
PercentVolWeight = 5,ReturnRaw = FALSE, PercentOnly = FALSE)
## $Harpagifer_antarcticus_PotterCove
## Prey FQ %FQ
## 1 Gammarids 8295.35 99.854948600
## 2 Isopods 0.60 0.007222476
## 3 Gastropods 2.90 0.034908636
## 4 Bivalves 0.00 0.000000000
## 5 Chitons 0.00 0.000000000
## 6 Polychaetes 1.19 0.014324578
## 7 Algae 7.36 0.088595710
##
## $Harpagifer_antarcticus_HarmonyPoint
## Prey FQ %FQ
## 1 Euphausia superba 8506.33 99.4582972
## 2 Gammarids 46.33 0.5417028
As we can see, this function returns a list with the calculated
composite indices for each record in the diet data supplied as well as
how the different options for PercentOnly
and
ReturnRaw
work.
dietr
also has functions to calculate the gastro-somatic
and Vacuity indices. The Vacuity index is simply the percentage
frequency of fishes that lack stomach contents. The first column should
contain the specimen identifier and the second column should contain the
weight of the stomach contents. Below is a quick example showing how to
use the dietr
function VacuityIndex
to
calculate the vacuity index using the example dataset
SebastesStomachs
, which contains NOAA data on the stomach
content weight and predator weight for Sebastes flavidus
specimens. For now, we will ignore the PredatorWeight
column which contains the weight of the specimens as we will use that
later in the tutorial.
data(SebastesStomachs)#load example data
VacuityIndex(StomachData = SebastesStomachs)
## [1] 18.18182
To gastro-somatic index is the percentage weight the stomach contents
represents relative to the total weight of a specimen, which can provide
information on the feeding condition of a fish. The function
GastrosomaticIndex
calculates this. Data should be
formatted similar as described above for the VacuityIndex
,
but a third column containing the wight of the specimen is also needed.
For an example of how this data should be formatted, see the dataset
SebastesStomachs
. Besides the argument
StomachData
which should be the data frame with the stomach
content and predator weights, an additional argument
Calc.Vacuity
is available. If
Calc.Vacuity = TRUE
, then in addition to the gastro-somatic
index, the vacuity index is also calculated for the same data. This
function will return a list contianing the gastro-somatic index of each
specimen, the mean gastro-somatic index of all specimens, and, if
Calc.Vacuity = TRUE
, the vacuity index. We could run the
function as such using the SebastesStomachs
dataset.
data(SebastesStomachs)#load example data
#Calculate the Gastro-somatic Index and Vacuity Index
GastrosomaticIndex (StomachData = SebastesStomachs, Calc.Vacuity = TRUE)
## $IndividualGSI
## Sebastes_flavidus_1_8_11_11 Sebastes_flavidus_1_8_9_11
## 0.0000000000 0.0012410250
## Sebastes_flavidus_10_8_11_11 Sebastes_flavidus_2_8_11_11
## 0.0221241702 0.0010421057
## Sebastes_flavidus_3_8_11_11 Sebastes_flavidus_4_8_11_11
## 0.0288197699 0.0002769944
## Sebastes_flavidus_5_8_11_11 Sebastes_flavidus_6_8_11_11
## 0.0001150405 0.0012811259
## Sebastes_flavidus_7_8_11_11 Sebastes_flavidus_8_8_11_11
## 0.0009243458 0.0048773364
## Sebastes_flavidus_9_8_11_11
## 0.0000000000
##
## $MeanGSI
## [1] 0.005518356
##
## $VacuityIndex
## [1] 18.18182
Further information on the functions and their usage can be found in
the helpfiles help(package=dietr)
. For any further issues
and questions send an email with subject ‘dietr support’ to sam@borstein.com or
post to the issues section on GitHub(https://github.com/sborstein/dietr/issues).
Boettiger C, Lang DT, and Wainwright PC. 2012. rfishbase: exploring, manipulating and visualizing FishBase data from R. Journal of Fish Biology 81:2030-2039.
Chesson, J. 1983. The estimation and analysis of preference and its relatioship to foraging models. Ecology 64:1297-1304.
Cortes E. 1999. Standardized diet compositions and trophic levels of sharks. ICES Journal of marine science 56:707-717. da Silveira EL, Semmar N, Cartes JE, Tuset VM, Lombarte A, Ballester ELC, and Vaz-dos-Santos AM. 2019. Methods for Trophic Ecology Assessment in Fishes: A Critical Review of Stomach Analyses. Reviews in Fisheries Science & Aquaculture 28:71-106. 10.1080/23308249.2019.1678013
Froese R, and Pauly D. 2024. FishBase. http://www.fishbase.us).
Horn M, Murray S, and Edwards T. 1982. Dietary selectivity in the field and food preferences in the laboratory for two herbivorous fishes (Cebidichthys violaceus and Xiphister mucosus) from a temperate intertidal zone. Marine Biology 67:237-246.
Hureau J-C. 1970. Biologie comparee de quelques poissons antarctiques (Nototheniidae). Bulletin de l’Institut Oceanographique de Monaco 68:1-244.
Ivlev, U. 1961. Experimental ecology of the feeding of fish. Yale University Press, New Haven.
Jacobs, J. 1974. Quantitative measurement of food selection. Oecologia 14:413-417.
Kawakami E, and Vazzoler G. 1980. Metodo grafico e estimativa de indice alimentar aplicado no estudo de alimentacao de peixes. Boletim do Instituto Oceanografico 29:205-207.
Magalhaes IS, Ornelas-Garcia CP, Leal-Cardin M, Ramirez T, and Barluenga M. 2015. Untangling the evolutionary history of a highly polymorphic species: introgressive hybridization and high genetic structure in the desert cichlid fish Herichtys minckleyi. Mol Ecol 24:4505-4520. 10.1111/mec.13316.
Manly, B. 1974. A model for certain types of selection experiments. Biometrics 30:281-294.
Natarajan A, and Jhingran A. 1961. Index of preponderance-a method of grading the food elements in the stomach analysis of fishes. Indian Journal of Fisheries 8:54-59.
Pauly D, Froese R, Sa-a P, Palomares M, Christensen V, and Rius J. 2000. TrophLab manual. ICLARM, Manila, Philippines.
Pinkas L, Oliphant MS, and Iverson IL. 1971. Food Habits of Albacore, Bluefin Tuna, and Bonito In California Waters. Fish Bulletin 152:1-105.
Strauss, R. E. 1979. Reliability Estimates for Ivlev’s Electivity Index, the Forage Ratio, and a Proposed Linear Index of Food Selection. Transactions of the American Fisheries Society 108:344-352.
Vanderploeg, H., and D. Scavia. 1979. Two electivity indices for feeding with special reference to zooplankton grazing. Journal of the Fisheries Board of Canada 36:362-365.