Analyses of heat requirement of species in a plant community

  • Data import & handling
  • Building the reference
  • Scaling of the evaluation data to an ecological-condition index

Data import & handling

We have three data sources for this indicator:

Ellenberg indicator data
NiN generalized species lists for mountain ecosystems
ANO data
- geography
- locations
- species

ell.dat is a data frame with British Ellenberg species indicators. Literature reference:

Hill, M. O., Mountford, J. O., Roy, D. B., & Bunce, R. G. H. (1999). Ellenberg’s Indicator Values for British Plants. Institute of Terrestrial Ecology, Huntingdon, UK.

head(ell.dat)
##   ord                species L F R N S HM  T  K TRU
## 1   P Acaena novae-zelandiae 8 3 6 3 0 NA NA NA  NA
## 2   P         Acer campestre 5 5 7 6 0 NA NA NA  NA
## 3   P       Acer platanoides 4 5 7 7 0 NA NA NA  NA
## 4   P    Acer pseudoplatanus 4 5 6 6 0 NA NA NA  NA
## 5   P  Aceras anthropophorum 7 4 8 3 0 NA NA NA  NA
## 6   P   Achillea millefolium 7 5 6 4 1 NA NA NA  NA

Eco_State.RData is an R-list containing the generalized species lists from NiN. References:

Halvorsen, R., Skarpaas, O., Bryn, A., Bratli, H., Erikstad, L., Simensen, T., & Lieungh, E. (2020). Towards a systematics of ecodiversity: The EcoSyst framework. Global Ecology and Biogeography, 29(11), 1887-1906. doi:10.1111/geb.13164

Halvorsen, R., Bryn, A., & Erikstad, L. (2015). NiNs systemkjerne – teori, prinsipper og inndelingskriterier. – Natur i Norge, Artikkel 1 (versjon 2.0.0)

str(Eco_State)

ANOpkt.geo is a data frame with geographical information for each ANO site and point

ANOpkt.geo[1:3,]
##   X OBJECTID        SSBID   ANOID RSIZE ROW  COL  XCOOR   YCOOR ANONUM PakkeNr
## 1 1      818 2.094001e+13 ANO0003   500 402  283  94250 6559750      3       5
## 2 2      601 2.343501e+13 ANO0006   500 901 1326 343750 7081250      6       5
## 3 3      751 2.114501e+13 ANO0007   500 443  146 114750 6491250      7       5
##   OvervÃ.kingsÃ.r CountyNr MunicNr     CountyName Region.x RegionNr Kommune_OLD
## 1            2019        9    4220 Aust-Agder nor        S        4         938
## 2            2019       50    5038 Trøndelag nor        C        2        1721
## 3            2019        9    4202 Aust-Agder nor        S        4         904
##    Kommune           Fylke   Region.y refs_blabar
## 1  BYGLAND      Aust-Agder Sørlandet        12.5
## 2   VERDAL Nord-Trøndelag Midt-Norge        12.5
## 3 GRIMSTAD      Aust-Agder Sørlandet        12.5

ANOpkt is a data frame with ecological information for each ANO-point (only showing the header here)

colnames(ANOpkt)
##  [1] "Aar"                                            
##  [2] "ObjectID"                                       
##  [3] "GlobalID"                                       
##  [4] "ANO_flate_ID"                                   
##  [5] "ANO_punkt_ID"                                   
##  [6] "Hovedoekosystem_orig"                           
##  [7] "Hovedoekosystem_rute"                           
##  [8] "Hovedoekosystem_sirkel"                         
##  [9] "Andel_hovedoekosystem_sirkel"                   
## [10] "Punktet_utilgjengelig"                          
## [11] "Begrunnelse_utilgjengelig"                      
## [12] "Hovedtype_rute"                                 
## [13] "Hovedtype_rute_navn"                            
## [14] "Kartleggingsenhet_rute"                         
## [15] "Hovedtype_sirkel"                               
## [16] "Hovedtype_sirkel_navn"                          
## [17] "Kartleggingsenhet_sirkel"                       
## [18] "Andel_Kartleggingsenhet_sirkel"                 
## [19] "Groeftingsintensitet"                           
## [20] "Aktuell_bruksintensitet"                        
## [21] "Beitetrykk"                                     
## [22] "Slaatteintensitet"                              
## [23] "Spor_etter_ferdsel_med_tunge_kjoeretoey"        
## [24] "Spor_etter_slitasje_og_slitasjebetinget_erosjon"
## [25] "Kommentar_NiN"                                  
## [26] "Arter_registrert"                               
## [27] "Arter_tilstede"                                 
## [28] "Dekning_karplanter_totalt"                      
## [29] "Dekning_karplanter_feltsjikt"                   
## [30] "Dekning_moser"                                  
## [31] "Dekning_torvmoser"                              
## [32] "Dekning_lav"                                    
## [33] "Dekning_stroe"                                  
## [34] "Dekning_bar_substrat"                           
## [35] "Dekning_grov_ved"                               
## [36] "Dekning_alger"                                  
## [37] "Kommentar_ruten"                                
## [38] "Dekning_krypende_vier"                          
## [39] "Dekning_ikke_krypende_vier"                     
## [40] "Dekning_vedplanter_feltsjikt"                   
## [41] "Dekning_busk_busksjikt"                         
## [42] "Dekning_traer_tresjikt"                         
## [43] "Dekning_roesslyngskade"                         
## [44] "Dekning_problemarter"                           
## [45] "Dekning_fremmedarter"                           
## [46] "Kommentar_sirkel"                               
## [47] "CreationDate"                                   
## [48] "Creator"                                        
## [49] "EditDate"                                       
## [50] "Editor"

sp is a data frame with plant species information (occurrence and abundance) for each ANO-point

sp[1:3,]
##    Aar ObjectID                             GlobalID
## 1 2020        1 2c8884e3-192e-42bf-9627-f0f27b1f9135
## 2 2020        2 665f55e2-4efe-496b-a292-73101afd37c8
## 3 2020        3 d78897b8-b550-4cdf-9f9d-d0e9deb8def0
##                              Navn Dekning..
## 1      blåbær_vaccinium_myrtillus        27
## 2    maiblom_maianthemum_bifolium         3
## 3 skogstjerne_lysimachia_europaea         2
##                         ParentGlobalID     CreationDate
## 1 b89694ab-9a06-4648-9b7e-7ebd320c8adb 17.06.2020 08:08
## 2 b89694ab-9a06-4648-9b7e-7ebd320c8adb 17.06.2020 08:08
## 3 b89694ab-9a06-4648-9b7e-7ebd320c8adb 17.06.2020 08:08
##                    Creator         EditDate                   Editor
## 1 heimyk_miljodirektoratet 17.06.2020 08:08 heimyk_miljodirektoratet
## 2 heimyk_miljodirektoratet 17.06.2020 08:08 heimyk_miljodirektoratet
## 3 heimyk_miljodirektoratet 17.06.2020 08:08 heimyk_miljodirektoratet

After some merging and data wrangling we arrive at: (i) NiN species lists for mountains matched with Heat-requirement values (Note that the abundance values in the NiN species lists are maximum abundance). From here we can build the reference.

mount.dat.cov[1:3,]
##                     sp T14-C1 T14-C2 T3-C3C6 T3-C9C12 T3-C2C5 T3-C8C11 T3-C1a
## 1 Abietinella abietina      0      0       0  0.03125       0    0.375      0
## 2     Acer platanoides      0      0       0  0.00000       0    0.000      0
## 3 Achillea millefolium      0      0       0  0.00000       0    0.000      0
##   T3-C1b T3-C4   T3-C7  T3-C10 T3-C13 T3-C14 T7-C1 T7-C2 T7-C3 T7-C6 T7-C8
## 1      0     0 0.03125 0.03125      0      0     0     0     0     0     0
## 2      0     0 0.00000 0.00000      0      0     0     0     0     0     0
## 3      0     0 0.00000 0.00000      0      0     0     0     0     0     0
##   T7-C12 T7-C13C14 T7-C4 T7-C7C9 T7-C5 T7-C10 T22-C1C3a T22-C1C3b T22-C2C4 L N
## 1      0         0     0       0     0      0         0         0        0 8 2
## 2      0         0     0       0     0      0         0         0        0 4 7
## 3      0         0     0       0     0      0         0         0        0 7 4

…and at (ii) Species data from the ANO monitoring program matched with Heat-requirement values

sp[1:3,]
##                         ParentGlobalID               Species  Aar ObjectID
## 1 0007ef7c-b13d-4950-b8ad-9fdadbea6311   Vaccinium myrtillus 2021    15468
## 2 0007ef7c-b13d-4950-b8ad-9fdadbea6311         Festuca ovina 2021    15470
## 3 0007ef7c-b13d-4950-b8ad-9fdadbea6311 Diphasiastrum alpinum 2021    15469
##                               GlobalID                             Navn Dekning
## 1 fb262080-b939-4edb-b92a-092242f20265       blåbær_vaccinium_myrtillus      26
## 2 8652575b-66ab-4e8c-9677-6b075b7ec976        sauesvingel_festuca_ovina       1
## 3 6280b435-7ce5-43ba-a547-18cbdd97fa73 fjelljamne_diphasiastrum_alpinum       4
##       CreationDate                  Creator         EditDate
## 1 15.08.2021 10:03 wenfje_miljodirektoratet 15.08.2021 10:03
## 2 15.08.2021 10:03 wenfje_miljodirektoratet 15.08.2021 10:03
## 3 15.08.2021 10:03 wenfje_miljodirektoratet 15.08.2021 10:03
##                     Editor L N Hovedoekosystem_rute Hovedtype_rute
## 1 wenfje_miljodirektoratet 6 2                fjell             T3
## 2 wenfje_miljodirektoratet 7 2                fjell             T3
## 3 wenfje_miljodirektoratet 7 2                fjell             T3
##   Kartleggingsenhet_rute
## 1                 T3-C-6
## 2                 T3-C-6
## 3                 T3-C-6

Building the reference (scaling values)

Concept for the reference

The reference condition is defined by a distribution of species indicator values (for mountain ecosystems these are Ellenberg L & N) for each basic ecosystem type (grunntype) in NiN. To get such indicator distributions we bootstrap the generalized species lists underlying the NiN-ecosystem-type-categorization on the grunntype-level and calculate a community weighted mean of Ellenberg L & N for each bootstrap in each generalized species list. That way we generate a reference distribution for each grunntype in NiN that is connected to an underlying generalized species list.

Bootstrap function

# function to calculate community weighted means of selected indicator values (ind)
# for species lists (sp) with given abundances (on a scale from 0 to 6) in one or more 'sites' (abun)
# with a given number of iterations (iter),
# with species given a certain minimum abundance occurring in all bootstraps (obl), and
# with a given resampling ratio of the original species list (rat)
# in every bootstrap iteration the abundance of the sampled species can be 
# randomly changed by +/-1 if wished (var.abun)

indBoot <- function(sp,abun,ind,iter,obl,rat=2/3,var.abun=F) {
  
  ind.b <- matrix(nrow=iter,ncol=length(colnames(abun)))
  colnames(ind.b) <- colnames(abun)
  ind.b <- as.data.frame(ind.b)  
  
  ind <- as.data.frame(ind)
  ind.list <- as.list(1:length(colnames(ind)))
  names(ind.list) <- colnames(ind)
  
  for (k in 1:length(colnames(ind)) ) 
    { ind.list[[k]] <- ind.b }
  
  for (j in 1:length(colnames(abun)) ) {
    
    dat <- cbind(sp,abun[,j],ind)
    dat <- dat[dat[,2]>0,]            # only species that are present in the ecoystem
    dat <- dat[!is.na(dat[,3]),]      # only species that have Ellenberg values
    
    for (i in 1:iter) {
      
      speciesSample <- sample(dat$sp[dat[,2] < obl], size=round( (length(dat$sp)-length(dat$sp[dat[,2] > (obl-1)])) *rat,0), replace=F)  
      dat.b <- rbind(dat[dat[,2] > (obl-1),],
                     dat[match(speciesSample,dat$sp),]
                     )
      
      if (var.abun==T) {
        for (l in 1: nrow(dat.b)) { dat.b[l,2] <- dat.b[l,2] + sample(c(-1,0,1),size=1) }
        dat.b[!is.na(dat.b[,2]) & dat.b[,2]==(0),2] <- 1
        dat.b[!is.na(dat.b[,2]) & dat.b[,2]==7,2] <- 6
      }
      
      for (k in 1:length(colnames(ind))) {
        
        if ( nrow(dat.b)>2 ) {
          
          ind.b <- sum(dat.b[!is.na(dat.b[,2+k]),2] * dat.b[!is.na(dat.b[,2+k]),2+k] , na.rm=T) / sum(dat.b[!is.na(dat.b[,2+k]),2],na.rm=T)
          ind.list[[k]][i,j] <- ind.b
          
        } else {ind.list[[k]][i,j] <- NA}
        
      }

            print(paste(i,"",j)) 
    }
    
  }
  return(ind.list)
}

Running the bootstrap function to build the reference

#### running bootstraps ####
mount.ind.list <- indBoot(sp=mount.dat[,1],abun=mount.dat[,2:28],ind=mount.dat[,29:30],
                          iter=10000,obl=6,rat=1/3,var.abun=T)

mount.ind.list.cov <- indBoot(sp=mount.dat.cov[,1],abun=mount.dat.cov[,2:28],ind=mount.dat.cov[,29:30],
                          iter=10000,obl=6,rat=1/3,var.abun=T)


### fixing NaN's
for (i in 1:length(mount.ind.list) ) {
  for (j in 1:ncol(mount.ind.list[[i]]) ) {
    v <- mount.ind.list[[i]][,j]
    v[is.nan(v)] <- NA
    mount.ind.list[[i]][,j] <- v
  }
}

for (i in 1:length(mount.ind.list.cov) ) {
  for (j in 1:ncol(mount.ind.list.cov[[i]]) ) {
    v <- mount.ind.list.cov[[i]][,j]
    v[is.nan(v)] <- NA
    mount.ind.list.cov[[i]][,j] <- v
  }
}

Deriving threshold values

Next we derive the limit and reference values from the bootstrapped distribution. e.g. upper and lower limit values = 2.5 & 97.5% percentiles, reference value = median, minimum & maximum value given by the minimum and maximum values of the Ellenberg scale (1 & 9).

summary(mount.cov.ref)
##      N1          N2      hoved        grunn     county    region       Ind    
##  fjell:148   fjell:148   NA:148   T14    :  4   all:148   all:148   EllL1:37  
##                                   T14-C-1:  4                       EllL2:37  
##                                   T14-C-2:  4                       EllN1:37  
##                                   T22    :  4                       EllN2:37  
##                                   T22-C-1:  4                                 
##                                   T22-C-2:  4                                 
##                                   (Other):124                                 
##        Rv              Gv             maxmin 
##  Min.   :1.250   Min.   :-7.429   Min.   :1  
##  1st Qu.:2.012   1st Qu.:-2.082   1st Qu.:1  
##  Median :4.831   Median : 4.181   Median :5  
##  Mean   :4.495   Mean   : 4.524   Mean   :5  
##  3rd Qu.:6.875   3rd Qu.:10.435   3rd Qu.:9  
##  Max.   :7.442   Max.   :18.867   Max.   :9  
## 

Scaling of the evaluation data to an ecological-condition index

We calculate the relative cumulative cover for species at and above the heat requirement threshold for the ANO data and evaluate these against their respective reference values (i.e. scaling according to reference value=1, limit value=0.6, and maximum value=0) This is just technical, so we don’t show the code.

Here’s the result

##      EllL1            EllL2            EllN1            EllN2       
##  Min.   :0.8632   Min.   :0.8848   Min.   :0.0000   Min.   :0.7286  
##  1st Qu.:0.9773   1st Qu.:0.9619   1st Qu.:0.9488   1st Qu.:0.9515  
##  Median :0.9893   Median :0.9753   Median :0.9642   Median :0.9731  
##  Mean   :0.9811   Mean   :0.9718   Mean   :0.9555   Mean   :0.9614  
##  3rd Qu.:0.9943   3rd Qu.:0.9872   3rd Qu.:0.9793   3rd Qu.:0.9881  
##  Max.   :0.9998   Max.   :1.0000   Max.   :0.9998   Max.   :0.9999  
##  NA's   :1591     NA's   :484      NA's   :650      NA's   :1425

And here’s the result as violin plots by main ecosystem types
T3 = mountain heat, leeside, & tundra (fjellhei, leeside & tundra)
T14 = ridge (rabbe)
T7 = snowbed (snøleie)
T22 = grassy mountain heath & tundra (fjellgrashei & grastundra)

## Warning: position_dodge requires non-overlapping x intervals

## Warning: position_dodge requires non-overlapping x intervals

## Warning: position_dodge requires non-overlapping x intervals

## Warning: position_dodge requires non-overlapping x intervals

Ellenberg L shows most deviations from the reference value (index = 1) towards the higher limit value, Ellenberg N shows most deviations from the reference value towards the lower limit value (see N in the respective plot headers). However, the deviations are largely small and within the limits for good ecological condition (0.6 - 1).

Klikk here to see the next step in the analysis, aggregation and standardization of the indicator data set.