DOI: 10.5061/dryad.4j0zpc8k1
title: Data from: To the top or into the dark? Relationships between elevational and canopy cover distribution shifts in mountain forests

description: Numerous studies have reported that observed species shifts in mountain
 areas lag behind expectations under current warming trends, however, the
 mechanisms remain poorly understood. One important mechanism might be
 microclimatic heterogeneity causing migration of species to cooler
 conditions under closed forest canopies; however, evidence is scarce. We
 here compared the distributions of 710 species (11 taxonomic groups
 including fungi, plants, and animals) along an elevation gradient
 (287-1,419 m a.s.l.) in a temperate low mountain range between 2006-2008
 and 2016-2017 to address this open question. We characterized each
 species’ distribution (peak and breadth) based on their abundance along
 two environmental gradients: elevation and canopy cover. We then analysed
 changes in species’ distribution peaks, asking whether shifts in canopy
 distribution and initial distribution characteristics explain variation in
 elevational distribution shifts. Across all taxa, the mean shift in
 elevational distribution peak was +35.3 metres (i.e., upslope).
 Species' baseline distribution peaks were strong predictors of
 elevational distribution shifts with stronger upslope shifts in
 low-elevation and open-forest species. Even though we observed
 considerable variation in the responses among species, canopy distribution
 shifts had a significant negative effect on elevational distribution
 shifts overall and in six taxonomic groups. We suggest that this is
 related to cooler microclimatic conditions under closed compared to open
 forest canopies. Shifts to closed-canopy forests may thus partly
 compensate for elevational distribution shifts, highlighting the
 conservation value of heterogeneous landscapes featuring microclimatic
 refugia. Yet, it is likely that other mechanisms, such as habitat
 limitation, are also at play. Future studies need to quantify the
 potential of microclimatic refugia under accelerating forest dynamics
 considering the interplay of canopy cover and other factors
 driving microclimate and to illuminate the complex climate change response
 mechanisms among species and taxonomic groups.
description: We used abundance data of 710 species (11 taxonomic groups
 including fungi, plants, and animals) collected during two surveys
 (2006-2008 and 2016-2017) in the Bavarian Forest National Park along an
 elevation and a canopy cover gradient using taxon-specific standard survey
 methods. The canopy cover of the upper two tree layers was visually
 estimated for all plots during both surveys and we used a probabilistic
 approach (Fischer 2015) accounting for the overlap between vegetation
 layers to obtain one combined value for canopy cover per plot and survey.
 We then calculated the species-specific abundance-weighted mean (=
 distribution peak) and standard deviation (= distribution width) of each
 gradient value during both surveys. We calculated each species'
 distribution shift in elevation and canopy cover as the change in
 distribution peak between the two surveys. Finally, we used linear (mixed)
 models to assess the relationship between distribution shifts along the
 elevational gradient with distributions shifts along the canopy cover
 gradient as well as species' baseline distribution peaks and
 breadths. For details see the Methods section and
 Supporting information of the related article.
description: # Data from: To the top or into the dark? Relationships between
 elevational and canopy cover distribution shifts in mountain forests
 [https://doi.org/10.5061/dryad.4j0zpc8k1
 ](https://doi.org/10.5061/dryad.4j0zpc8k1) The provided dataset contains
 the original input data and scripts used to study species distributions
 along an elevation and a canopy cover gradient in a temperate low mountain
 range. Based on the abundance of each species across study plots, we
 characterized species' distributions along two dimensions: elevation
 and forest canopy cover. We then analysed changes in species’ distribution
 peaks, asking whether shifts in canopy distribution peak and initial
 distribution characteristics explain variation in elevational distribution
 shifts. The present datasets contains the relevant scripts, input data,
 and results. Note that for data protection reasons, geographic coordinates
 of our research plots are not provided. ## Description of the data and
 file structure We conducted our analyses in R 4.3.2 (R Core Team 2023). We
 only used open source packages available on CRAN and GitHub. All analysis
 was conducted within one R project, which comes with a set workspace and
 relative folder paths, ensuring input data can be accessed with the
 provided code on all devices. We thus recommend to open the scripts
 directly via the R project by first opening the Rproj-file
 (*elevational_vs_canopy_distribution_shifts.Rproj*) and to follow the
 following folder structure: MAIN_FOLDER (e.g. "analysis")
 containing the following folders and files (files are printed in italic):
 * 01_input * biodiv_rawdata * env_rawdata * 02_Rda * 02_scripts *
 03_output * 2_StatisticalAnalysis * 3_SupportingInformation *
 *elevational_vs_canopy_distribution_shifts.Rproj* * *renv.lock* We created
 the project with a *renv* environment (Version 1.0.5; Ushey & Wickham
 2024) to record all used package versions. *renv.lock* is the lockfile,
 which contains metadata about all used packages, so that the same versions
 can be re-installed on a new device. After opening the R project file on a
 new device, users will need to run the script *0_initiate_renv.R* to
 install and initiate the *renv* package. This will generate a
 project-specific library within the same folder as the R project file.
 Then run `renv::restore()` to install all packages with version control
 into the project library. For help using *renv* see:
 [https://rstudio.github.io/renv/articles/renv.html.](https://rstudio.github.io/renv/articles/renv.html) --- The folder **01_input** contains raw data that our results are based on, including biodiversity and abiotic data. Geographic coordinates and data and unpublished data generated by others are not included. All input data was processed in the provided scripts only. Descriptions of files in subfolder **biodiv_rawdata**: *bees_raw.csv*, *beetles_raw.csv*, *bugs_raw.csv*, *cicadas_raw.csv*, *hoverflies_raw.csv*, *spiders_raw.csv*, *smammals_raw.csv*, *springtails_raw.csv*: raw data of bees, beetles, true bugs, cicadas, hoverflies, spiders, small mammals, and springtails, respectively (collected in arthropod traps) * plot: name of the study plot (categorical) * species: name of the collected species (categorical) * number: number of collected specimen (continuous integer) * year: year of collection (categorical integer) * month: month of collection (categorical integer) * trap: trap type (categorical, FIT = flight interception trap, MaF = Malaise trap, PiT = pitfall trap) * CompSet1: column to determine whether sampling was comparable between the surveys (see Friess et al. (2018) for details) - not provided for small mammals, here all data were included * data holder: owner of the data (one category: BF NP = Bavarian Forest National Park Administration) *birds_raw.csv*: raw data of birds, surveyed in situ via visual and acoustic bird mapping * plot: name of the study plot (categorical) * species: name of the observed species (categorical) * number: number of observed specimen (continuous integer) * year: year of collection (categorical integer) * sampling: code for number and date of the sampling within a given survey year (categorical, 3 = March, 4 = April, 5_I = early May, 5_I = late May, 6 = June) * CompSet1: column to determine whether sampling was comparable between the surveys (see Friess et al. (2018) for details) * data holder: owner of the data (one category: BF NP = Bavarian Forest National Park Administration) *lichens_raw.csv*, *mosses_raw.csv*, *wfungi_raw.csv*: raw data of lichens, mosses, and wood fungi, respectively, surveyed in situ on trees within the plot * plot: name of the study plot (categorical) * object ID: ID of the tree on which the moss/lichen was growing (categorical) * species: name of the observed species (categorical) * year: year of collection (categorical integer) * CompSet1: column to determine whether sampling was comparable between the surveys (see Friess et al. (2018) for details) - only in lichens and wood fungi (all data were comparable between years for mosses) * data holder: owner of the data (one category: BF NP = Bavarian Forest National Park Administration) *plants_raw.csv*: raw data of plants, surveyed in situ on an area of 200 m2 around the plot centre * Plot: name of the study plot (categorical) * species: name of the observed species (categorical) * layer: vegetation layer in which a species was found (categorical, herb = herb layer, gras = grasses, shrub = shrub layer (&lt; 5 m height), tree2 = lower tree layer (5-15 m height), tree1 = upper tree layer (&gt; 15 m height)) * cover: visually estimated cover of each plant species (in %) * year: year of collection (categorical integer) * CompSet1: column to determine whether sampling was comparable between the surveys (see Friess et al. (2018) for details) * data holder: owner of the data (one category: BF NP = Bavarian Forest National Park Administration) *snails_raw.csv*: raw data of molluscs. surveyed in situ via hand collection * Plot: name of the study plot (categorical) * species: name of the observed species (categorical) * number: number of observed specimen (continuous integer) * year: year of collection (categorical integer) * CompSet1: column to determine whether sampling was comparable between the surveys (see Friess et al. (2018) for details) * data holder: owner of the data (one category: BF NP = Bavarian Forest National Park Administration) Descriptions of files in subfolder **env_rawdata**: *canopy_cover_field_mapping_200m2.csv*: visually estimated cover data of different strata for an area of 200 m^2 around the plot centre. * plot: name of the study plot (categorical) * location: name of the location where the study plot is situated (categorical) * year: year of survey (categorical integer) * tree 1 cover: estimated cover of trees &gt; 15 m height (in %) * tree 2 cover: estimated cover of trees of 5-15 m height (in %) * shrub cover: estimated cover of the shrub layer (in %) * herb cover: estimated cover of understory plants (excl. grasses and cryptogams) (in %) * gras cover: estimated cover of grasses (in %) * crypt cover: estimated cover of cryptogams (in %) * tree 1 height: estimated height of the upper tree layer (&gt; 15 m) (in %) * tree 2 height: estimated height of the lower tree layer (5-15 m) (in %) * shrub height: estimated height of the shrub layer (in %) * herb height: estimated height of the herb layer (in %) * gras height: estimated height of grasses (in %) * crypt height: estimated height of cryptogams (in %) * block cover: estimated cover of rocks (in %) * deadwood cover: estimated cover of deadwood (in %) * litter cover: estimated cover of litter (in %) * water cover: estimated cover of water (in %) * track cover: estimated cover of hiking or forestry tracks/trails (in %) * others cover: estimated cover of substrates not listed above (in %) *plotdata_2006.csv* and *plotdata_2016.csv*: table of study plots (plot coordinates are not provided) * Plot: name of the study plot (categorical) * location: name of the location where the study plot is situated (categorical) * altitude: elevation of the plot (continuous, in metres above sea-level) *plot_envdata_full_incl_methods.csv*: canopy cover and topography data for each plot in wide format, as well as information about the survey methods applied at each plot * plot: name of the study plot (categorical) * elevation: elevation of the plot as determined by Bässler et al. (2008) (continuous, in metres above sea-level) * tree1_cover_year1: estimated cover of trees &gt; 15 m height during first survey (in %) * tree1_cover_year2: estimated cover of trees &gt; 15 m height during second survey (in %) * tree2_cover_year1: estimated cover of trees of 5-15 m height during first survey (in %) * tree2_cover_year2: estimated cover of trees of 5-15 m height during second survey (in %) * shrub_cover_year1: estimated cover of shrubs during first survey (in %) * shrub_cover_year2: estimated cover of shrubs during second survey (in %) * canopy_trees_year1: sum of the cover of upper + lower tree layer during first survey (in %, can take values up to 200%) * canopy_trees_year2: sum of the cover of upper + lower tree layer during second survey (in %, can take values up to 200%) * canopy_all_year1: sum of the cover of upper tree layer + lower tree layer + shrub layer during first survey (in %, can take values up to 300%) * canopy_all_year2: sum of the cover of upper tree layer + lower tree layer + shrub layer during second survey (in %, can take values up to 300%) * canopy_fischer_year1: combination of upper + lower tree layer cover using the approach by Fischer (2015) during first survey (in %) * canopy_fischer_year2: combination of upper + lower tree layer cover using the approach by Fischer (2015) during second survey (in %) * canopy_fischer_all_year1: combination of upper tree layer + lower tree layer + shrub layer cover using the approach by Fischer (2015) during first survey (in %) * canopy_fischer_all_year2: combination of upper tree layer + lower tree layer + shrub layer cover using the approach by Fischer (2015) during second survey (in %) * year_year1: year of first survey (integer) * year_year2: year of second survey (integer) * slope: average slope of an area of 500 m2 (r = 12.6 m) around the plot centre based on DEM (continuous, in degrees) * aspect: average aspect of an area of 500 m2 (r = 12.6 m) around the plot centre based on DEM (continuous, in degrees) * northness: cosine of the aspect (continuous between -1 and 1, no unit) * eastness: sine of the aspect (continuous between -1 and 1, no unit) * vegetation: column indicating whether vegetation mapping was conducted at the plot (binary, 1 = yes, 0 = no) * wfungi: column indicating whether fungi mapping was conducted at the plot (binary, 1 = yes, 0 = no) * mosses_lichens: column indicating whether mosses and lichens were surveyed at the plot (binary, 1 = yes, 0 = no) * PiT: column indicating whether pitfall traps were installed at the plot (binary, 1 = yes, 0 = no) * MaT: column indicating whether a Malaise trap was installed at the plot (binary, 1 = yes, 0 = no) * FIT: column indicating whether a flight-interception trap was installed at the plot (binary, 1 = yes, 0 = no) * snails: column indicating whether molluscs were surveyed at the plot (binary, 1 = yes, 0 = no) * birds: column indicating whether birds were mapped at the plot (binary, 1 = yes, 0 = no) *forest_types.csv*: characterization of study plots to different forest types (from *S4a_data_preparation_microclimate_model.R*) * plot: name of the study plot (categorical) * year: year of survey (categorical integer) * cover_broadleaved: total cover of broadleaved trees (continuous portion between 0 and 1) * cover_needleleaved: total cover of needleleaved trees (continuous portion between 0 and 1) * total_tree_cover: total tree cover (i.e. cover_broadleaved: + cover_needleleaved; continuous) * conifer_share: cover share of coniferous tree species (i.e. cover_needleleaved/total_tree_cover; continuous portion between 0 and 1) * forest_category: forest type of the reference plot (categorical) *modeldata_LAI.csv*: data used to model LAI for plots with no LiDAR data available (in *S4a_data_preparation_microclimate_model.R*) * plot: name of the study plot (categorical) * elevation: elevation of the plot as determined by Bässler et al. (2008) (continuous, in metres above sea-level) * slope: average slope of an area of 500 m2 (r = 12.6 m) around the plot centre based on DEM (continuous, in degrees) * aspect: average aspect of an area of 500 m2 (r = 12.6 m) around the plot centre based on DEM (continuous, in degrees) * northness: cosine of the aspect (continuous between -1 and 1, no unit) * eastness: sine of the aspect (continuous between -1 and 1, no unit) * LAI: leaf-area index based on LiDAR (continuous, in m^2 m^−2) * canopy_fischer: combination of upper + lower tree layer cover using the approach by Fischer (2015) (in %) * canopy_fischer_all: combination of upper tree layer + lower tree layer + shrub layer cover using the approach by Fischer (2015) (in %) * year: reference survey (categorical, "year1" or "year2") * LAI_sqrt: squareroot-transformed leaf-area index (continuous) * LAI_log: log-transformed leaf-area index (continuous) * forest_category: forest type of the reference plot (categorical) * conifer_share: cover share of coniferous tree species (i.e. cover_needleleaved/total_tree_cover; continuous portion between 0 and 1) * tree.1.height: height of tree layer 1 (continuous) * tree.2.height: height of tree layer 2 (continuous) * max_canopy_height: maximum canopy height (continuous) * year_fac: reference survey (categorical, "year1" or "year2") - to be transformed to factor when opening the file in R * forest_category_fac: forest type of the reference plot (categorical) - to be transformed to factor when opening the file in R *plotdata_LAI.csv*: LAI values for all 133 study plots (either measured via LiDAR or modelled) from *S4a_data_preparation_microclimate_model.R* in wide format. * plot: name of the study plot (categorical) * LAI_method_year1: method for LAI assessment for the first survey (categorical, either "LiDAR" or "predicted") * LAI_year1: value of LAI for the first survey (continuous, in m^2 m^−2) * LAI_lower_year1: lower limit of 95% confidence interval of LAI prediction for the first survey (continuous, in m^2 m^−2) * LAI_upper_year1: upper limit of 95% confidence interval of LAI prediction for the first survey (continuous, in m^2 m^−2) * LAI_method_year2: method for LAI assessment for the second survey (categorical, either "LiDAR" or "predicted") * LAI_year2: value of LAI for the second survey (continuous, in m^2 m^−2) * LAI_lower_year2: lower limit of 95% confidence interval of LAI prediction for the second survey (continuous, in m^2 m^−2) * LAI_upper_year2: upper limit of 95% confidence interval of LAI prediction for the second survey (continuous, in m^2 m^−2) --- The folder **02_scripts** contains all scripts used to perform data analysis, from data preparation to linear models and final illustration of results. The names of the scripts follows the order of the individual calculation steps and they should thus be run in consecutive order. Descriptions of files: *0_initiate_renv.R*: Script to initiate the Renv environment and to restore the used packages.\ Output: none *01a_data_preparation.R*: Script for preparation and curation of raw environment and biodiversity data.\ Output (Rda files): *env_plotlist_common.Rda*;* biodiv_db_species_full.Rda* \ Output (csv tables): *plot_envdata_full_incl_methods.csv; master_df_biodiv_data.csv; summary_plotspersurvey_fullset.csv* *01b_data_processing_biodiv_data.R*: Script for further processing of raw biodiversity data (e.g. filtering for species occurring in both surveys).\ Output (Rda files): *biodiv_db_species_full_Noccur3_final_df.Rda; biodiv_db_species_full_Noccur3_final.Rda; weights_samplings_survey1.Rda; weights_samplings_survey2.Rda*\ Output (csv tables): *duplicate_species.csv; db_species_full_Noccur3_final_df.csv; summary_speciespergroup_fullset_Noccur3.csv* *01c_trends_mean_annual_temperature_macroclimate.R*: Script to explore the macroclimatic background conditions.\ Output (Rda files): none\ Output (csv tables): *MAT_per_plot_and_year.csv; MAT_vs_year.csv; MAT_vs_plot.csv*\ Output (figures): Figure 1 (main body of related article) *02_niche_model_function.R*: Script with the function to characterize species distribution peaks and breadths.\ Output: none *03_run_niche_model.R*: Script to run the species distribution characterization (from *02_niche_model_function.R*) of species distribution along the elvational and canopy cover gradient.\ Output (Rda files): *niche_model_elevation_run1.Rda; niche_model_elevation_run2.Rda; niche_model_canopy_run1.Rda; niche_model_canopy_run2.Rda* *04a_Post_niche_model_exploration_filtered_below1100.R*: Script for exploration of distribution characterization outputs (*03_run_niche_model.R*) and for filtering to species &lt; 1 distribution breadth from the upper/lower elevational boundaries and with elevational distributions peaks &gt; 1100 metres above sea-level.\ Output (Rda files): *niche_model_results_filtered_wide_filtered_below_1100.Rda*\ Output (figures): Figure 2 (main body of related article)\ Output (other): several summaries (e.g. of number of (significant) shifts in distribution peaks overall and per taxonomic group, summary statistics of distribution characterization outputs) and exploratory figures, as well as the filtering steps can be reproduced by running the script. *04b_Post_niche_model_exploration_unfiltered.R*: Script for exploration of distribution characterization outputs (*03_run_niche_model.R*) and for filtering to species &lt; 1 distribution breadth from the upper/lower elevational boundaries BUT inclusion of species with elevational distributions peaks &gt; 1100 metres above sea-level.\ Output (Rda files): *niche_model_results_unfiltered_wide.Rda*\ Output (other): several summaries (e.g. of number of (significant) shifts in distribution peaks overall and per taxonomic group, summary statistics of distribution characterization outputs) and exploratory figures, as well as the filtering steps can be reproduced by running the script. *05a_Post_niche_model_analyses_filtered_below_1100.R*: Script to run the statistical analyses adressing the relationship between distribution peak shifts along the elevational and the canopy cover gradient (for filtered species from 04a_Post_niche_model_exploration_filtered_below1100.R). Includes model diagnostics.\ Output (csv tables): *2_StatisticalAnalysis/filtered_below_1100/lm_deltaAWMelev_overall.csv; 2_StatisticalAnalysis/filtered_below_1100/anova_lm_deltaAWMelev_overall.csv; 2_StatisticalAnalysis/filtered_below_1100/lm_deltaAWMelev_groups.csv; 2_StatisticalAnalysis/filtered_below_1100/anova_lm_deltaAWMelev_groups.csv*\ Output (figures): Figure 3 and Figure 4 (main body of related article)\ Output (other): model results, additional figures, and model diagnostics can be reproduced by running the script *05b_Post_niche_model_analyses_unfiltered.R*: Script to run the statistical analyses adressing the relationship between distribution peak shifts along the elevational and the canopy cover gradient (for unfiltered species from *04b_Post_niche_model_exploration_unfiltered.R*). Includes model diagnostics.\ Output (csv tables): *2_StatisticalAnalysis/unfiltered/lm_deltaAWMelev_overall.csv; 2_StatisticalAnalysis/unfiltered/anova_lm_deltaAWMelev_overall.csv; 2_StatisticalAnalysis/unfiltered/lm_deltaAWMelev_groups.csv; 2_StatisticalAnalysis/unfiltered/anova_lm_deltaAWMelev_groups.csv*\ Output (other): model results, figures, and model diagnostics can be reproduced by running the script *S1_map.R*: Script to generate map of the plots within the study area (Supporting information of related article)\ Output: none *S2_environmental data_exploration.R*: Script for exploration of environmental conditions at the study plots.\ Output (other): Figures in S2 (Supporting information of related article) can be reproduced by running the script. *S4a_data_preparation_microclimate_model.R*: script for data preparation for the microclimate model run in *S4b_microclimate_model_microclimc.R*.\ Output (csv tables): *forest_types.csv; modeldata_LAI.csv; plotdata_LAI.csv* *S4b_microclimate_model_microclimc.R*: script used to model microclimatic conditions at 15 centimetres above the ground per plot and survey based on macrolimate data and the microclimc package (Maclean and Klinges 2021).\ Output (Rda files): *microclim_07_15cm.Rda, microclim_16_15cm.Rda* *S4c_microclimatic_niches.R*: script to run the species distribution characterization with modelled microclimatic conditions based on *03_run_niche_model.R* and results from *S4b_microclimate_model_microclimc.R*\ Output (Rda files): *niche_model_T_macro.Rda; niche_model_T_micro_15cm.Rda; niche_model_T_offset_15cm.Rda* *S4d_microclimate_model_exploration_niche_shifts.R:* script for the exploration of modelled microclimate and microclimatic distribution characteristics (from *S4c_microclimatic_niches.R*)\ Output (figures): *figure_microclimatic_offset_vs_elevational_shift.Rda* (inset in Figure 3 of main body of related article)\ Output (other): figures and data in S4 (Supporting information of related article) can be reproduced by running the script. --- The folder **02_Rda** contains Rda-files that were stored as interim results after time-intensive preparation steps or from scripts that cannot be run to enable follow-up analyses. Descriptions of files: *biodiv_db_species_full.Rda*: combined list of dataframes containing all curated species data. The list contains separate dateframes for each taxonomic group and method (indicated with \_[method]) where several methods were used to survey one group.\ The list only contains species occuring during both surveys. Each dataframe features the same columns: * plot: name of the study plot (categorical) * species: name of the observed species (categorical) * group: taxonomic group (categorical) * method: survey method used to collect the data (categorical) * abu_survey1: abundance during the first survey (continuous) * abu_survey2: abundance during the second survey (continuous) *biodiv_db_species_full_Noccur3_final_df.Rda*: dataframe of species abundance data included in the niche model analyses (i.e. only species collected on a minimum of 3 plots during both surveys) * plot: name of the study plot (categorical) * species: name of the observed species (categorical) * group: taxonomic group (categorical) * method: survey method used to collect the data (categorical) * abu_survey1: abundance during the first survey (continuous) * abu_survey2: abundance during the second survey (continuous) * abu_tot_survey1: total abundance (i.e. across plots) during the first survey (continuous) * abu_tot_survey2: total abundance (i.e. across plots) during the second survey (continuous) * relabu_survey1: relative abundance, i.e. the abundance per plot divided by the total abundance during the first survey (ratio between 0 and 1) * relabu_survey2: relative abundance, i.e. the abundance per plot divided by the total abundance during the second survey (ratio between 0 and 1) *biodiv_db_species_full_Noccur3_final.Rda*: combined list of dataframes containing all curated species abundance data included in the niche model analyses (i.e. only species collected on a minimum of 3 plots during both surveys). The list contains separate dateframes for each taxonomic group and method (indicated with "_[method]") where several methods were used to survey one group. The list only contains species occuring during both surveys. Each dataframe features the same columns: * plot: name of the study plot (categorical) * species: name of the observed species (categorical) * group: taxonomic group (categorical) * method: survey method used to collect the data (categorical) * abu_survey1: abundance during the first survey (continuous) * abu_survey2: abundance during the second survey (continuous) * abu_tot_survey1: total abundance (i.e. across plots) during the first survey (continuous) * abu_tot_survey2: total abundance (i.e. across plots) during the second survey (continuous) * relabu_survey1: relative abundance, i.e. the abundance per plot divided by the total abundance during the first survey (ratio between 0 and 1) * relabu_survey2: relative abundance, i.e. the abundance per plot divided by the total abundance during the second survey (ratio between 0 and 1) *figure_microclimatic_offset_vs_elevational_shift.Rda*: ggplot object of a 2D-density plot of species distribution shifts along the elevational versus the microclimatic offset gradient. Used as inset for Figure 3 in script *05a_Post_niche_model_analyses_filtered_below_1100.R.* *env_plotlist_common.Rda*: character vector of plots that were sampled in both surveys *microclim_07_15cm.Rda, microclim_16_15cm.Rda*: List of modelled daily microclimatic summer conditions at 15 centimetres above the ground per plot for the years 2006 and 2016, respectively, based on macrolimate data and the microclimc package (Maclean and Klinges 2021). The list contains separate dataframes for each plot. * obs_time: reference day (date) * reftemp: reference (macroclimatic) air temperature at 2 m height (°C) * tout: modelled temperature at 15 cm above the ground (°C) * tleaf: leaf temperature (°C) * relhum: relative humidity (percentage) * SWin: incoming shortwave radiation (W / m^2) * LWin: incoming longwave radiation (W / m^2) * H: total sensible heat flux to/from canopy (W / m^2) * L: sensible heat flux (W / m^2) * G: total heat flux to/from ground (W / m^2) *niche_model_elevation_run1.Rda, niche_model_elevation_run2.Rda, niche_model_canopy_run1.Rda, niche_model_canopy_run2.Rda:* lists with results from the first and second run of our distribution characterization (for ease of language called "niche model" here) for species distributions along the elevation and canopy cover gradient, respectively. The list contains separate dateframes for each taxonomic group and method (indicated with "_[method]") where several methods were used to survey one group. The list only contains species occuring during both surveys. We only used the results generated in the first run for follow-up analyses. \ The second run was used to assess the robustness of our distribution characterization.\ Each dataframe features the same columns: * species: name of the observed species (categorical) * working_order: taxonomic group (categorical) * method: survey method used to collect the data (categorical) * env1: name of plotdata column containing the values of the environmental gradient of interest (categorical) during the first survey (categorical) * env2: name of plotdata column containing the values of the environmental gradient of interest (categorical) during the second survey (categorical) * Noccur1: number of occupied plots during the first survey (continuous integer) * Noccur2: number of occupied plots during the second survey (continuous integer) * tot_abundance_year1: total abundance (i.e. across plots) during the first survey (continuous) * tot_abundance_year2: total abundance (i.e. across plots) during the second survey (continuous) * tot_adj_abundance_year1: total adjusted abundance during first survey, i.e. sum of adjusted abundances per plot, where adjusted abundance = absolute abundance / number of samplings per plot (continuous) * tot_adj_abundance_year2: total adjusted abundance during second survey, i.e. sum of adjusted abundances per plot, where adjusted abundance = absolute abundance / number of samplings per plot (continuous) * AWM_year1: abundance-weighted mean of gradient value (= distribution peak) during first survey (continuous, same unit as the input gradient) * AWSD_year1: abundance-weighted standard deviation of gradient value (= distribution breadth) during first survey (continuous, same unit as the input gradient) * nullmean_year1: expected null abundance-weighted mean if species is randomly distributied across plots (mean of 10,000 random permutations) during first survey (continuous, same unit as the input gradient) * p_nullmean_year1: p-value indicating whether the observed abundance-weighted mean differs significantly from the expected null value during first survey (values between 0 and 1) * nullsd_year1: expected null abundance-weighted standard deviation if species is randomly distributied across plots (mean of 10,000 random permutations) during first survey (continuous, same unit as the input gradient) * p_nullsd_year1: p-value indicating whether the observed abundance-weighted standard deviation differs significantly from the expected null value during first survey (values between 0 and 1) * AWM_year2: abundance-weighted mean of gradient value (= distribution peak) during second survey (continuous, same unit as the input gradient) * AWSD_year2: abundance-weighted standard deviation of gradient value (= distribution breadth) during second survey (continuous, same unit as the input gradient) * nullmean_year2: expected null abundance-weighted mean if species is randomly distributied across plots (mean of 10,000 random permutations) during second survey (continuous, same unit as the input gradient) * p_nullmean_year2: p-value indicating whether the observed abundance-weighted mean differs significantly from the expected null value during second survey (values between 0 and 1) * nullsd_year2: expected null abundance-weighted standard deviation if species is randomly distributied across plots (mean of 10,000 random permutations) during second survey (continuous, same unit as the input gradient) * p_nullsd_year2: p-value indicating whether the observed abundance-weighted standard deviation differs significantly from the expected null value during second survey (values between 0 and 1) * delta_AWM_eff: effective change in abundance-weighted mean gradient value between surveys (i.e. AWM_year2 - AWM_year1) (continuous, same unit as the input gradient) * delta_AWSD_eff: effective change in abundance-weighted standard deviation of gradient value between surveys (i.e. AWSD_year2 - AWSD_year1) (continuous, same unit as the input gradient) * mean_delta_AWM_stand: standardized change in abundance-weighted mean between surveys accounting for the changes in the single null models based on differences in the sampled sites between the years (continuous, same unit as the input gradient) - not used in analysis! * mean_delta_AWSD_stand: standardized change in abundance-weighted standard deviation between surveys accounting for the changes in the single null models based on differences in the sampled sites between the years (continuous, same unit as the input gradient) - not used in analysis! * delta_nullmean: mean change of the 10,000 randomized null values for abundance-weighted mean between the surveys (continuous, same unit as the input gradient) * p_delta_AWM_eff_nullmean: p-value indicating whether the observed change in abundance-weighted mean gradient value differs significantly from the expected change based on null values (values between 0 and 1) * p_delta_AWM_stand_zero: p-value indicating whether the standardized change in abundance-weighted mean gradient value differs significantly from zero (values between 0 and 1) * delta_nullsd: mean change of the 10,000 randomized null values for abundance-weighted standard deviation between the surveys (continuous, same unit as the input gradient) * p_delta_AWSD_eff_nullsd: p-value indicating whether the observed change in abundance-weighted standard deviation of the gradient value differs significantly from the expected change based on null values (values between 0 and 1) * p_delta_AWSD_stand_zero: p-value indicating whether the standardized change in abundance-weighted standard deviation of the gradient value differs significantly from zero (values between 0 and 1) * niche_year1: description of distribution position during survey 1 in words (categorical) * niche_year2: description of distribution position during survey 2 in words (categorical) *niche_model_T_macro.Rda, niche_model_T_micro_15cm.Rda, niche_model_T_offset_15cm.Rda*: lists with results of our distribution characterization for species distributions along gradients of macroclimate, microclimate, and microclimatic offset, respectively. The list contains separate dateframes for each taxonomic group and method (indicated with "_[method]") where several methods were used to survey one group. Same columns as *niche_model_elevation_run1.Rda, niche_model_elevation_run2.Rda, niche_model_canopy_run1.Rda*, and *niche_model_canopy_run2.Rda.* *niche_model_results_filtered_wide_filtered_below_1100.Rda*: dataframe with reshaped distribution characterization model outputs (in wide format) for the elevation and canopy cover gradients. Based on *niche_model_elevation_run1.Rda* and *niche_model_canopy_run1.Rda* after removing species with distribtuion peaks &lt; one distribution breadth from the upper/lower elevational boundaries and with distribution peaks &gt; 1100 metres above sea-level. Same columns as *niche_model_elevation_run1.Rda* and *niche_model_canopy_run1.Rda*, but with suffices "_elev" and "_can" indicating the reference environmental gradient (elevation or canopy cover, respectively). *weights_samplings_survey1.Rda* and *weights_samplings_survey2.Rda*: weighting factors for the niche model analyses, i.e. dataframe containing the number of samplings conducted per plot and method during survey 1 and 2, respectively. * plot: name of the study plot (categorical) * vegetation: number of samplings for vegetation mapping (continuous integer) * mosses_lichens: number of samplings for moss and lichen mapping (continuous integer) * wfungi: number of samplings for wood fungi mapping (continuous integer) * birds: number of samplings for bird mapping (continuous integer) * snails: number of samplings for snail hand sampling (continuous integer) * PiT: number of samplings for pitfall traps (continuous integer) * FIT: number of samplings for flight-interception traps (continuous integer) * MaT: number of samplings for Malaise traps (continuous integer) --- The folder **03_output** contains generated tables and figures and the subfolder structure roughly follows the structure of the manuscript. Descriptions of files in subfolder **2_StatisticalAnalysis/filtered_below_1100**: *anova_lm_deltaAWMelev_groups.csv:* summary of ANOVA outputs of the taxon-specific models based on the FILTERED dataset (from *05a_Post_niche_model_analyses_filtered_below_1100.R*). * group: taxonomic group (categorical) * Predictor: reference predictor (categorical, either one of the model predictors or "Residuals") * Df: number of used degrees of freedom (continuous integer) * Sum.Sq: sum of squares (continuous) * Mean.Sq: mean sum of squares (i.e. Sum.Sq/Df) (continuous) * F.value: test statistic from the F test (continuous) * Pr..F.: p-value of the F test (continuous) * PctExp: percentage of explained variance by the reference predictor (percentage) *anova_lm_deltaAWMelev_overall.csv*: summary of ANOVA output of the overall model based on the FILTERED dataset (from *05a_Post_niche_model_analyses_filtered_below_1100.R*). * variable: reference predictor (categorical) * Sum Sq: sum of squares (continuous) * Mean Sq: mean sum of squares (i.e. Sum.Sq/DenDF) (continuous) * NumDF: numerator degrees of freedom (continuous integer) * DenDF: denominator degrees of freedom (continuous) * F value: test statistic from the F test (continuous) * Pr(&gt;F): p-value of the F test (continuous) * PctExp: percentage of explained variance by the reference predictor (percentage) *lm_deltaAWMelev_groups.csv*: model summary of the taxon-specific models based on the FILTERED dataset (from *05a_Post_niche_model_analyses_filtered_below_1100.R*). * group: taxonomic group (categorical) * Predictor: reference predictor (categorical) * mean: mean value of reference predictor variable (continuous) * sd: standard deviation of reference predictor variable (continuous) * Estimate: effect estimate of reference predictor variable (continuous) * beta_s: standardized effect size of reference predictor variable (i.e. Estimate/sd) * Std..Error: standard error of reference predictor variable (continuous) * t.value: test statistic from the t test (continuous) * Pr...t..: p-value of the t test (continuous) * p_model: model p-value (continuous) * R2_model: model R-squared (continuous between 0 and 1) * R2adj_model: model adjusted R-squared (continuous) * vif: Variance Inflation Factor of reference predictor variable (continuous) *lm_deltaAWMelev_overall.csv*: model summary of the overall model based on the FILTERED dataset (from *05a_Post_niche_model_analyses_filtered_below_1100.R*). * Predictor: reference predictor (categorical) * Estimate: effect estimate of reference predictor variable (continuous) * beta_s: standardized effect size of reference predictor variable (i.e. Estimate/sd) * Std. Error: standard error of reference predictor variable (continuous) * df: degrees of freedom (continuous) * t value: test statistic from the t test (continuous) * Pr(&gt;|t|): p-value of the t test (continuous) * p_model: model p-value (continuous) * R2m_model: marginal R-squared of the model (continuous between 0 and 1) * R2c_model: conditional R-squared of the model (continuous between 0 and 1) * mean: mean value of reference predictor variable (continuous) * sd: standard deviation of reference predictor variable (continuous) Descriptions of files in subfolder **2_StatisticalAnalysis/unfiltered**: *anova_lm_deltaAWMelev_groups.csv*: summary of ANOVA outputs of the taxon-specific models based on the UNFILTERED dataset (from *05b_Post_niche_model_analyses_unfiltered.R*). * group: taxonomic group (categorical) * Predictor: reference predictor (categorical, either one of the model predictors or "Residuals") * Df: number of used degrees of freedom (continuous integer) * Sum.Sq: sum of squares (continuous) * Mean.Sq: mean sum of squares (i.e. Sum.Sq/Df) (continuous) * F.value: test statistic from the F test (continuous) * Pr..F.: p-value of the F test (continuous) * PctExp: percentage of explained variance by the reference predictor (percentage) *anova_lm_deltaAWMelev_overall.csv*: summary of ANOVA output of the overall model based on the UNFILTERED dataset (from *05b_Post_niche_model_analyses_unfiltered.R*). * variable: reference predictor (categorical) * Sum Sq: sum of squares (continuous) * Mean Sq: mean sum of squares (i.e. Sum.Sq/DenDF) (continuous) * NumDF: numerator degrees of freedom (continuous integer) * DenDF: denominator degrees of freedom (continuous) * F value: test statistic from the F test (continuous) * Pr(&gt;F): p-value of the F test (continuous) * PctExp: percentage of explained variance by the reference predictor (percentage) *lm_deltaAWMelev_groups.csv*: model summary of the taxon-specific models based on the UNFILTERED dataset (from *05b_Post_niche_model_analyses_unfiltered.R*). * group: taxonomic group (categorical) * Predictor: reference predictor (categorical) * mean: mean value of reference predictor variable (continuous) * sd: standard deviation of reference predictor variable (continuous) * Estimate: effect estimate of reference predictor variable (continuous) * beta_s: standardized effect size of reference predictor variable (i.e. Estimate/sd) * Std..Error: standard error of reference predictor variable (continuous) * t.value: test statistic from the t test (continuous) * Pr...t..: p-value of the t test (continuous) * p_model: model p-value (continuous) * R2_model: model R-squared (continuous between 0 and 1) * R2adj_model: model adjusted R-squared (continuous) * vif: Variance Inflation Factor of reference predictor variable (continuous) *lm_deltaAWMelev_overall.csv:* model summary of the overall model based on the UNFILTERED dataset (from *05b_Post_niche_model_analyses_unfiltered.R*). * Predictor: reference predictor (categorical) * Estimate: effect estimate of reference predictor variable (continuous) * beta_s: standardized effect size of reference predictor variable (i.e. Estimate/sd) * Std. Error: standard error of reference predictor variable (continuous) * df: degrees of freedom (continuous) * t value: test statistic from the t test (continuous) * Pr(&gt;|t|): p-value of the t test (continuous) * p_model: model p-value (continuous) * R2m_model: marginal R-squared of the model (continuous between 0 and 1) * R2c_model: conditional R-squared of the model (continuous between 0 and 1) * mean: mean value of reference predictor variable (continuous) * sd: standard deviation of reference predictor variable (continuous) Descriptions of files in subfolder **3_SupportingInformation/biodiv_data**: *db_species_full_Noccur3_final_df.csv*: table of species abundance data included in the niche model analyses (i.e. only species collected on a minimum of 3 plots during both surveys) * plot: name of the study plot (categorical) * species: name of the observed species (categorical) * group: taxonomic group (categorical) * method: survey method used to collect the data (categorical) * abu_survey1: abundance during the first survey (continuous) * abu_survey2: abundance during the second survey (continuous) * abu_tot_survey1: total abundance (i.e. across plots) during the first survey (continuous) * abu_tot_survey2: total abundance (i.e. across plots) during the second survey (continuous) * relabu_survey1: relative abundance, i.e. the abundance per plot divided by the total abundance during the first survey (ratio between 0 and 1) * relabu_survey2: relative abundance, i.e. the abundance per plot divided by the total abundance during the second survey (ratio between 0 and 1) *duplicate_species.csv*: Summary of duplicate species, i.e. species that were observed in more than one trap type. We used the data of the most efficient collection method for each species, i.e. the method that yielded the highest number of that respective species during both surveys (i.e. across plots). If the most efficient method varied between survey years, we used the method with the highest total number of collected specimen (i.e. across plots and years). * species: name of the observed species (categorical) * group: taxonomic group (categorical) * abu_tot_survey1_PiT: total number (across plots) of specimen collected in pitfall traps during first survey (continuous integer) * abu_tot_survey1_FIT: total number (across plots) of specimen collected in flight-interception traps during first survey (continuous integer) * abu_tot_survey1_MaT: total number (across plots) of specimen collected in Malaise traps during first survey (continuous integer) * abu_tot_survey2_PiT: total number (across plots) of specimen collected in pitfall traps during second survey (continuous integer) * abu_tot_survey2_FIT: total number (across plots) of specimen collected in flight-interception traps during second survey (continuous integer) * abu_tot_survey2_MaT: total number (across plots) of specimen collected in Malaise traps during second survey (continuous integer) * Noccur_survey1_PiT: total number (across plots) of plots on which the species was collected in pitfall traps during first survey (continuous integer) * Noccur_survey1_FIT: total number (across plots) of plots on which the species was collected in flight-interception traps during first survey (continuous integer) * Noccur_survey1_MaT: total number (across plots) of plots on which the species was collected in Malaise traps during first survey (continuous integer) * Noccur_survey2_PiT: total number (across plots) of plots on which the species was collected in pitfall traps during second survey (continuous integer) * Noccur_survey2_FIT: total number (across plots) of plots on which the species was collected in flight-interception traps during second survey (continuous integer) * Noccur_survey2_MaT: total number (across plots) of plots on which the species was collected in Malaise traps during second survey (continuous integer) * abu_tot_PiT: total number of specimen collected in pitfall traps (across plots and surveys; continuous integer) * abu_tot_FIT: total number of specimen collected in flight-interception traps (across plots and surveys; continuous integer) * abu_tot_MaT: total number of specimen collected in Malaise traps (across plots and surveys; continuous integer) * keep_duplicate: column indicating which method yielded the dataset to be included in the analysis (i.e. the one most effective collection method per species) (categorical) *master_df_biodiv_data.csv*: curated species data * plot: name of the study plot (categorical) * species: name of the observed species (categorical) * year: year of collection (categorical integer) * abundance: abundance (continuous) * group: taxonomic group (categorical) * method: survey method used to collect the data (categorical) *summary_plotspersurvey_fullset.csv*: Number of sampled plots and species per taxonomic group, method, and survey * group: taxonomic group (categorical) * method: survey method used to collect the data (categorical) * no_plots_survey1: number of sampled plots during first survey (continuous integer) * no_plots_survey2: number of sampled plots during second survey (continuous integer) * no_species_survey1: number of observed species during first survey (continuous integer) * no_species_survey2: number of observed species during second survey (continuous integer) *summary_speciespergroup_fullset_Noccur3.csv*: Total number of sampled species and plots included in the analysis per taxonomic group and method * group: taxonomic group (categorical) * method: survey method used to collect the data (categorical) * no_species: total number of observed species (continuous integer) * no_plots: number of sampled plots (continuous integer) Descriptions of files in subfolder **3_SupportingInformation/envdata_context** *MAT_per_plot_and_year.csv*: Macroclimatic mean annual temperatures based on Klöcking (2018), averaged per plot and year * plot: name of the study plot (categorical) * year: reference year (integer) * n_months: number of months with available data (plots were only included when n_months = 12) * temperature: mean annual temperature averaged from daily values (continuous, in °C) *MAT_vs_plot*: Macroclimatic mean annual temperatures based on Klöcking (2018), averaged per plot * plot: name of the study plot (categorical) * elevation: elevation of the plot (in metres above sea-level) * n_years: number of years with available data (continuous integer) * temperature: mean temperature at the plot averaged averaged across years from daily values (continuous, in °C) *MAT_vs_year*: Macroclimatic mean annual temperatures based on Klöcking (2018), averaged per year * year: reference year (integer) * n_months: number of months with available data (plots were only included when n_months = 12) * temperature: mean annual temperature across plots averaged from daily values (continuous, in °C) ## Code/Software The analysis was conducted in R version 4.3.2 (2023-10-31; R Core Team 2023) under Windows 10 x64 (build 19045). We used the *renv* package (Version 1.0.5; Ushey & Wickham 2024) for version control of the used R packages. **References:** Bässler, C. et al. 2008. The BIOKLIM Project: Biodiversity Research between Climate Change and Wilding in a temperate montane forest – The conceptual framework. – Waldökologie, Landschaftsforschung und Naturschutz: 21–34. Fischer, H. S. 2015. On the combination of species cover values from different vegetation layers. – Appl Veg Sci 18: 169–170. Friess, N. et al. 2018. Biodiversity along an elevational gradient of the Bohemian Forest – the BIOKLIM project. – Silva Gabreta 24: 149–160. Klöcking, B. 2018. Simulation of meteorological conditions in the Bohemian Forest. – Silva Gabreta: 69–84. Maclean, I. M. and Klinges, D. H. 2021. Microclimc: A mechanistic model of above, below and within-canopy microclimate. – Ecol Modell 451: 109567. R Core Team 2023. R: A language and environment for statistical - R Foundation for Statistical Computing. Ushey K, Wickham H (2024). *renv: Project Environments*. R package version 1.0.5, [https://github.com/rstudio/renv](https://github.com/rstudio/renv), [https://rstudio.github.io/renv/.](https://rstudio.github.io/renv/.)