rintegrate

Integrate functions for depth integrated species abundance


Hei,

I am trying to calculate the organisms quantity per class over the entire depth range (e.g., from 10 m to 90 m). To do that I have the abundance at certain depths (e.g., 10, 30 and 90 m) and I use the integrate function which calculate: the average of abundance between each pair of depths, multiplied by the difference of the pairs of depths. The values are summed up over the entire depth water column to get a totale abundance over the water column. See an example (only a tiny part of bigger data set with several locations and year, more class and depths):

View(df)
      Class      Depth   organismQuantity
1   Ciliates        10  1608.89
2   Ciliates        30  2125.09
3   Ciliates        90  1184.92
4   Dinophyceae     10  0.00
5   Dinoflagellates 30  28719.60
6   Dinoflagellates 90  4445.26



integrate = function(x) {
  averages = (x$organismQuantity[1:length(x)-1] + x$organismQuantity[2:length(x)]) / 2
  sum(averages * diff(x$Depth))
}
result = ddply(df, .(Class), integrate)
print(result)

But I got these result and warning message for lines with NA value :

     Class       V1
1        Ciliates 136640.1
2 Dinoflagellates       NA
3     Dinophyceae      0.0

Warning messages:
1: In averages * diff(x$Depth) :
  longer object length is not a multiple of shorter object length

I don't understand why Dinoflagellates got NA value... It is the same for several others class in my complete data set (for some class abundance the integration equation applies for others I got the warning message). thank you for the help!! Cheers, Lucie


Solution

  • Here is a way using function trapz from package caTools, adapted to the problem.

    #
    # library(caTools)
    # Author(s)
    # Jarek Tuszynski
    #
    # Original, adapted
    trapz <- function(DF, x, y){
      x <- DF[[x]]
      y <- DF[[y]]
      idx <- seq_along(x)[-1]
      as.double( (x[idx] - x[idx-1]) %*% (y[idx] + y[idx-1]) ) / 2
    }
    
    library(plyr)
    
    ddply(df, .(Class), trapz, x = "Depth", y = "organismQuantity")
    #            Class       V1
    #1        Ciliates 136640.1
    #2 Dinoflagellates 994945.8
    #3     Dinophyceae       NA
    

    Data

    df <- read.table(text = "
          Class      Depth   organismQuantity
    1   Ciliates        10  1608.89
    2   Ciliates        30  2125.09
    3   Ciliates        90  1184.92
    4   Dinophyceae     10  0.00
    5   Dinoflagellates 30  28719.60
    6   Dinoflagellates 90  4445.26
    ", header = TRUE)