Search code examples
intervalszoovegan

rollapply + specnumber = species richness over sampling intervals that vary in length?


I have a community matrix (samples x species of animals). I sampled the animals weekly over many years (in this example, three years). I want to figure out how sampling timing (start week and duration a.k.a. number of weeks) affects species richness. Here is an example data set:

Data <- data.frame(
  Year = rep(c('1996', '1997', '1998'), each = 5),
  Week = rep(c('1', '2', '3', '4', '5'), 3),
  Species1 =sample(0:5, 15, replace=T),
  Species2 =sample(0:5, 15, replace=T),
  Species3 =sample(0:5, 15, replace=T)
)

The outcome that I want is something along the lines of:

Year  StartWeek  Duration(weeks)  SpeciesRichness 
1996    1            1                 2 
1996    1            2                 3  
1996    1            3                 1 
... 
1998    5            1                 1

I had tried doing this via a combination of rollapply and vegan's specnumber, but got a sample x species matrix instead of a vector of Species Richness. Weird.

For example, I thought that this should give me species richness for sampling windows of two weeks:

test<-rollapply(Data[3:5],width=2,specnumber,align="right")

Thank you for your help!


Solution

  • I figured it out by breaking up the task into two parts: 1. Summing up species abundances using rollapplyr, as implemented in a ddplyr mutate_each thingamabob 2. Calculating species richness using vegan.

    I did this for each sampling duration window separately.

    Here is the bare bones version (I just did this successively for each sampling duration that I wanted by changing the width argument):

    weeksum2 <- function(x) {rollapply(x, width = 2, align = 'left', sum, fill=NA)}
    sum2weeks<-Data%>%
      arrange(Year, Week)%>%
      group_by(Year)%>%
      mutate_each(funs(weeksum2), -Year, -Week)
    
    
    weeklyspecnumber2<-specnumber(sum2weeks[,3:ncol(sum2weeks)], 
                                  groups = interaction(sum2weeks$Week, sum2weeks$Year))
    weeklyspecnumber2<-unlist(weeklyspecnumber2)
    weeklyspecnumber2<-as.data.frame(weeklyspecnumber2)
    weeklyspecnumber2$WeekYear<-as.factor(rownames(weeklyspecnumber2))
    weeklyspecnumber2<-tidyr::separate(weeklyspecnumber2, WeekYear, into = c('Week', 'Year'), sep = '[.]')