About this Project

WORK IN PROGRESS. LAST UPDATED 2026-03-01

library(ggplot2)
library(ggtext) # expression()
library(dplyr)
library(forcats) # fct_recode
library(tidyr)
library(ggpubr) # ggqqplot(), cor.test()
library(rstatix) # shapiro_test()
library(car) # Anova()
library(vegan)
library(soilfoodwebs)
library(tibble) # rownames_to_column
library(scales) # comma
library(patchwork) # plot_layout
library(ggtext) # element_textbox
library(grid)
library(gridGraphics) # gird.grabExpr()
library(cowplot) # plot_grid()
library(kableExtra) # row_spec()
library(rsconnect)

RNGkind(sample.kind = "Rounding") 


Abstract

Short-term climate perturbations affect both predator and prey species that comprise soil communities, and alter carbon flux. I used a mesocosm experiment to model the effects of experimentally-imposed temperature and moisture conditions that simulate potential future conditions during climate perturbations, on peatland soil food web flux and soil carbon sequestration after three-weeks of experimentally imposed conditions, and then again after an additional three-week recovery under control conditions. I compared system resistance and resilience, and modelled carbon (C) and nitrogen (N) fluxes throughout the mesocosm experiment. There was a lack of resistance of the soil food web to perturbation shown by changes in total faunal abundance under imposed soil moisture treatments. System resistance and resilience are important concepts to understand as climate change threatens C storage in boreal peatlands, a globally significant C store.

Keywords

carbon flux, nitrogen mineralization, soil biodiversity, boreal peatlands, energetic food web models, hydrological changes, warming

Summary for Lay Audience

Carbon (C) makes up the substrate, habitat, and diet of soil-dwelling organisms. Therefore, soil food web C storage is defined by the total amount of C consumed by soil fauna less the total C released to the atmosphere by the respiration of soil fauna. Short-term changes in temperature and soil moisture affect the storage of C in soils. Boreal peatlands are a wetlands ecosystem found across Canada that play an especially important role in global C storage. The goal of my thesis was to determine the effects of potential future temperature and soil moisture conditions on the total number of soil fauna, the total amount of C consumed by soil fauna, and the total C released to the atmosphere by the respiration of soil fauna before the simulated short-term event, immediately following the event, and then following a subsequent recovery period under control conditions in peat-soils collected from White River, Ontario. Overall, the total number of soil fauna tended to decrease following the simulated event, and this was driven by imposed soil moisture treatments. The total number of fauna did not increase following the recovery period, and this was most noticeable in the number of fungal-feeding soil fauna. System resistance and resilience are important concepts to understand as climate change threatens C storage in boreal peatlands, a globally significant C store.

Co-Authorship Statement

In the following thesis, the soil fauna abundance, biomass, and food web modelling following three-week perturbation (i.e., T1 data) was published in a Special Issue on soil food web (Pettit et al. 2023):

Pettit, T., Faulkner, K.J., Buchkowski, R.W., Kamath, D., and Lindo, Z. (2023) Changes in peatland soil fauna biomass alter food web structure and function under warming and hydrological changes. European Journal of Soil Biology 117: 103509. https://doi.org/10.1016/j.ejsobi.2023.103509

TP, KJF and ZL conceived the experiment; TP and KJF performed the field sampling and experiment; TP identified and enumerated the mesofauna samples; DK enumerated the microfauna subsamples; TP generated the biomass data, and performed the food web analysis; RWB wrote the code for the food web model; TP wrote the draft of the manuscript with input from ZL; all authors contributed to the final version of the article.

Acknowledgments

I thank Dr. Zoë Lindo for the support and help through both my undergraduate and graduate research projects. Thank you for always keeping me on track over our many weekly one-on-ones, both virtually and otherwise. Also, thanks to Dr. Brian Branfireun for allowing me to use the facilities in his lab for my research and guidance in the field.

I also thank my advisors, Dr. Keith Hobson and Dr. Yolanda Morbey. Your feedback and flexibility are greatly appreciated! I especially thank Dr. Morbey for advising both my undergraduate and graduate research projects.

Thanks to all my Lindo Lab mates past and present for the tremendous help and numerous teardowns. I especially thank Dr. Katy Faulkner for help from the start through the end of the project and for always being available for questions. I also give special thanks to Dr. Rob Buchkowski for years’ worth of help troubleshooting and for helping me develop my interest in modelling.

Finally, I thank my family and Sydney for their constant support.

Chapter 1: Introduction

1.1 Carbon Cycling in the Soil Food Web

Nearly 80% of all carbon (C) stored in terrestrial ecosystems (2500 GT of C) is found in soils (Batjes, 1996). Net primary production derived from aboveground photosynthesis drives the input of fixed C into soil systems as detritus (i.e., dead organic matter) which serves as the basal energy source for soil food webs (de Vries and Caruso, 2016). Carbon is then transferred from one trophic level (or trophic group) to another via consumption during trophic interactions in an overall process that contributes to decomposition of detritus. At the same time, C transformations occur belowground as C is stored as living biomass, recycled to the detritus pool through feces and other consumptive waste, and as natural (non-consumptive) death of soil organisms. Carbon is lost from soils as carbon dioxide (CO2) as a function of metabolic respiration by members of the soil food web (Moore and de Ruiter, 2012). Thus, the fate of soil C is a function of detrital inputs, the soil food web, and related heterotrophic respiration outputs (Figure 1.1).

Figure 1.1

Conceptualized flow of carbon and nutrients through soil systems.
Carbon initially enters the soil system as detritus which is derived from aboveground photosynthesis and net primary productivity (I.e., carbon fixation). Detritus (dead organic inputs largely from aboveground sources) forms the basal resource for the soil food web. Detrital carbon and nutrients is transferred among members of the food web through consumption. Consumption drives fluxes of carbon within and between nodes in the soil food web. Carbon returns to the detrital pool through waste due to inefficient trophic assimilation (E~a~) and through non-consumptive death (d) of soil organisms. Carbon is lost from the soil system through carbon mineralization, by which organic carbon is turned into inorganic (i.e., mineral) forms. In soils, carbon mineralization is largely heterotrophic respiration associated with metabolism of soil organisms (i.e., production efficiency, E~p~). Soil carbon pools are both the detrital pool and the soil organisms themselves that comprise the soil food web.

Carbon initially enters the soil system as detritus which is derived from aboveground photosynthesis and net primary productivity (I.e., carbon fixation). Detritus (dead organic inputs largely from aboveground sources) forms the basal resource for the soil food web. Detrital carbon and nutrients is transferred among members of the food web through consumption. Consumption drives fluxes of carbon within and between nodes in the soil food web. Carbon returns to the detrital pool through waste due to inefficient trophic assimilation (Ea) and through non-consumptive death (d) of soil organisms. Carbon is lost from the soil system through carbon mineralization, by which organic carbon is turned into inorganic (i.e., mineral) forms. In soils, carbon mineralization is largely heterotrophic respiration associated with metabolism of soil organisms (i.e., production efficiency, Ep). Soil carbon pools are both the detrital pool and the soil organisms themselves that comprise the soil food web.


The soil food web consists of several trophic levels and many taxonomic groups. The primary consumers (decomposers) of detritus are the microbial groups (fungi, bacteria, protists) that use C and other nutrients from detritus as well as root exudates to maintain biomass and metabolic function. Feeding on the microbes (secondary consumers/decomposers) are a wide variety of taxa that include microfauna (e.g., nematodes) and mesofauna (e.g., mites and collembola), while predators of the system are mainly other nematode and mite groups. Carbon is the main energetic currency for heterotrophic organisms, alongside nutrients (e.g., nitrogen (N)), that is transferred among members of the soil food web. However, the process of trophic transfer especially of C is inefficient (Hunt et al., 1989), as C is lost from the food web due to metabolic and other biological processes. Specifically, consumed C (and other nutrients) must first be assimilated (digested) so that energy is available for cellular processes including general metabolic maintenance as well as growth and reproduction. Assimilation efficiency (Ea) differs greatly among soil organisms (e.g., collembola Ea = 50% vs. nematode-feeding mites Ea = 90% (Moore and de Ruiter, 2012)), with unassimilated food released as waste products that return to the detrital source pool. Assimilated C is then allocated to metabolic function or production (i.e., growth and reproduction). Following the Metabolic Theory of Ecology, metabolic functions for soil organisms are largely controlled by temperature (Brown et al., 2004), and C is lost as a by-product of metabolism as CO2 via heterotrophic respiration. Production efficiency (Ep), which then defines the C allocated to growth and reproduction with metabolic waste released as respired CO2, is a function of metabolic activity and also varies across different soil organisms (e.g., fungi Ep = 30% vs. protists Ep = 40% (Moore and de Ruiter, 2012)). Metabolism increases and thus production efficiency decreases with increasing temperature. Thus, changes in both the soil food web topology and metabolism (temperature) drive changes in soil C storage (Figure 1.1).

1.2 The Stability of Soil Food Webs

The stability of a system can be considered as two components (Allison and Martiny, 2008): resistance and resilience. Whether a system resists change under such a perturbation (resistance) and/or how fast a system recovers from a perturbation (resilience) when it does change are important parameters to understand how biodiversity may be altered under climate and other anthropogenic change. The extent to which a community biomass decreases immediately following a disturbance is indicative of the level of resistance (Hillebrand and Kunze, 2020); the faster recovery of community biomass following a disturbance is indicative of resilient communities (Griffiths and Philippot, 2013). The resistance of a community to a disturbance plays an important role in determining how long it will take a community to recover (Hillebrand and Kunze, 2020). The resistance and resilience of communities depends on several factors, including resource availability (Gessler et al., 2017), biodiversity (Isbell et al., 2015), and species traits (Gladstone-Gallagher et al. 2019). However, examples of stability, resistance and resilience are uncommon for whole soil food webs (but see de Vries et al., 2012).

There are several factors that suggest soil systems should show high levels of stability. First, soil food webs are complex systems characterized by many trophic groups (Digel et al., 2014) and high species richness within trophic groups (Verhoef and Brussaard, 1990). Soil food webs are also characterized by many complex interactions, including omnivory (Neutel et al., 2002), cannibalism (Moore and de Ruiter, 2012; Buchkowski et al., 2022), necrophagy (Luxton, 1972), and intraguild predation (Parimuchová et al., 2021). Complex interactions tend to be weaker than other consumer-resource interactions (i.e., direct predator – prey trophic transfer), which has been suggested to have greater stability than systems with fewer complex interactions (O’Gorman and Emmerson, 2009; LeCraw et al., 2014).

Soil food webs also tend to show a ‘diamond’ shaped trophic topology (McCann and Rooney, 2009) with two compartmentalized subwebs stemming from a basal resource and fed upon by a common top predator. This results in the soil food web having two discrete resource compartments or energy channels that form from lower-order consumers (bacteria or fungi) that tend to derive the bulk of their C from different aspects of the detrital pool (Rooney et al., 2006). These two energy channels support different microbial consumers, and the channels differ in production and turnover rate. The bacterial energy channel exhibits faster turnover than the fungal channel as indicated by greater production:biomass ratios in soil systems dominated by non-woody plants (Rooney et al., 2006) and when detrital inputs have low C:N ratios. The fungal energy has a slower turnover rate and is dominant when detrital inputs have high C:N ratios. Top arthropod predators such as predatory mites couple these distinct energy channels as their prey are consumers in both the bacterial and fungal energy channels. Asynchrony in rates of population turnover among members of the two different energy channels translates into a more stable prey base for the top predators, and thus acts as an important stabilizing mechanism (McCann, 2000; Teng and McCann, 2004) for the soil fauna food web. Thus, soil food webs are considered to be biodiverse, complex, and stable systems (de Castro et al., 2021).

The stability (i.e., the resistance to perturbation) of soil fauna food webs has implications for global processes like climate change that include both long-term changes in temperature and precipitation, as well as greater variability in temperature and precipitation extremes. But the stability of soil fauna communities can be impacted by anthropogenic changes such as both changes in habitat geometry (i.e., the amount, shape, and connectivity of habitat) and disturbance regime (i.e., the spatial and temporal patterns of perturbation). For example, a study of moss-living microarthropods found that species richness and abundance declined corresponding to increased disturbance rate, but that the speed of this decline depended on the connectivity of the surrounding habitat (Starzomski and Srivastava, 2007). In another study, Shackelford et al. (2018) found that microarthropod communities connected to undisturbed landscapes showed a linear and rapid recovery following a disturbance, whereas those connected to disturbed landscapes showed a hump-shaped recovery and isolated communities showed a slow but linear recovery. However, abiotic factors other than habitat connectivity that may buffer soil fauna communities from disturbances are less well studied.

Stability (resistance, resilience) in soil food webs also depends on food web topology and the dominant microbial energy channel involved. de Vries et al. (2012) found that temperate grassland soil food webs that were dominated by fungi were more resistant, although not resilient, to drought conditions than bacteria-dominated agricultural soil food webs from wheat fields located on the same slope and from the same soil type. Fungal-dominated grassland soil food webs were also found to incorporate C more efficiently, corresponding to lower amounts of C lost through microbial respiration, and fungal-based food webs supported increased diversity and richness of microarthropods. The greater resistance of fungal-dominated soil food webs to perturbation may have been caused by increased resource availability in the form of increased dissolved organic C and fungal biomass, consistent with findings in previous grasslands studies (Cole et al., 2006). In turn, increased microarthropod diversity was associated with increased N leaching from grassland soils (de Vries et al., 2012), consistent with previous findings that microarthropod richness can stimulate N mineralization (Liiri et al., 2002). Overall, these findings suggest that fungal-based soil food webs support a greater evenness of microbial communities and a greater diversity of microarthropods, which in turn helps improve the resistance of soil fauna food webs to the effects of other abiotic factors, like drought (de Vries et al., 2012).

However, the duration and timing of a perturbation can also affect stability outcomes in soil systems. For instance, Thakur et al. (2021) demonstrated that a one-week, ‘pulse’ extreme heat event significantly affected mesocosm soil microbial communities constructed from northern European soils and that differences in microbial community structure between heat shock and ambient treatments were maintained for the duration of the study suggesting low ecosystem resistance and resilience. These findings highlighted the importance of species traits following a disturbance, as the short-term heat event was more detrimental to microbes than microbial predators. Mechanistically, it was suggested that thermal acclimation (e.g., changes in body size or physiological activity) to heat stress promoted predator resilience, but not microbial resilience.

Yet, it is still unknown how soil fauna food webs will respond to short term disturbances that are expected to become more frequent as a function of climate change (IPCC, 2018). How a soil food web responds to a perturbation with respect to changes in the biomass or metabolism of individual members of the soil food web may subsequently lead to changes in ecosystem-level processes like soil respiration rates (Thompson et al., 2018) ultimately affecting soil C storage potential. However, it is still unknown what effect short-term climate events related to temperature might have on soil fauna food web structure and function, or what role other (potentially mitigating) environmental factors like soil moisture might play. Because C and N cycling are emergent ecosystem properties, resistant and resilient soil communities may better maintain energy and nutrient cycling following a perturbation. This is especially true for disturbance events such as extreme, short-term warming that can alter the metabolic demands of organisms.

1.3 Boreal Peatlands

Boreal peatlands, found across much of northern Canada, are wetlands characterized by low aboveground vascular plant productivity and a thick (in excess of 40 cm deep) layer of peat, or decomposing organic material (Beaulne et al., 2021) arising from slow decomposition. Peatlands are repositories for belowground biodiversity (IUCN, 2021) and are the Earth’s largest terrestrial store of soil C (Limpens et al., 2008). Peatlands store C as soil because inputs from aboveground plant productivity exceed the rate at which C is lost from the system through decomposition as heterotrophic respiration (Gorham, 1991). This occurs despite low levels of productivity because rates of decomposition and C cycling through the soil food web are even lower. Low rates of decomposition and heterotrophic respiration occur because of ecostoichiometric limitations like N limitation, resulting from plant inputs that are generally nutrient poor (Bragazza et al., 2006). Nutrient limitations and waterlogged (anoxic) conditions limit the biomasses of soil fauna, which function as secondary decomposers (Xu et al., 2022). Biological activity (e.g., metabolic processes) also occurs at a slow rate because of low soil temperatures (Carrera et al., 2009) and high soil moisture (Bian et al., 2022). Peatland fauna biomasses are often lower than that of forests (IPCC, 2000) or other non-wetland systems, however these systems store a large amount of C because productivity exceeds rates of heterotrophic respiration.

Boreal peatlands are dominated by plants like mosses, sedges, and shrubs (Gore, 1984). In these systems, peat is thereby primarily composed of litter from these plants in varying stages of decomposition. Peat acts to form a pool of biologically available forms of nutrients, like N and phosphorus, to support a complex and species diverse soil food web. At the same time, this peat serves as habitat for complex microbial communities (Asemaninejad et al., 2017, 2019), nematodes (Kamath et al., 2022), and microarthropods (Barreto and Lindo, 2018). Aboveground plant communities are linked to the structure of microbial and faunal communities. For example, microbial communities in moss-dominated systems are characterized by greater ratios of fungi:bacteria, when compared to those in sedge-dominated systems, corresponding to greater plant diversity and lower quality (i.e., high C:N ratio) litter inputs that form peat (Lyons and Lindo, 2020). Correspondingly, the dominant nematode trophic group is related to the dominant microbial group within a system (i.e., fungal-dominated systems contain greater abundance and biomass of fungal-feeding nematodes), and similarly nematode trophic diversity is higher in fungal-dominated peatland food webs than bacterial-dominated food webs (Kamath et al., 2022). Furthermore, nematode communities in nutrient poor, fungal-dominated peatland food webs are more complex than their bacterial-dominated, intermediate nutrient counterparts, due to an increase in the abundance and size of nematode predators (Kamath et al., 2022). While plant litter quality affects the structure of peatland soil food web fungal and bacterial energy channels and is an important driver of decomposition dynamics, abiotic environmental conditions (e.g., temperature, soil moisture) are the main drivers of the structure of microarthropod communities. Specifically, the richness and abundance of microarthropods in boreal peatland hollow microhabitats, characterized by wet depressions, is greater than that observed in hummock microhabitats, characterized by dry and raised areas (Barreto and Lindo, 2018), but at the same time, peatlands with high levels of peat moisture have lower species richness (Barreto and Lindo, 2021). Strong above- and below-ground linkages help reinforce the complexity and stability of peatland soil food webs.

1.4 Effects of Climate Change on Boreal Peatland Soil Food Webs

Climate change involves several environmental changes including increases in ambient temperature, increased variability in temperature, and changes in precipitation that can include increases, decreases, and increased fluctuations between wet and dry conditions. Global average anthropogenic warming reached +1.25 °C in 2022 (Haustein et al., 2017; Matthews and Wynes, 2022), and the rate of anthropogenic warming is increasing at an estimated 0.2 °C per decade (IPCC, 2018). Changes in temperature are predicted to be more extreme at high latitudes, with short-term extreme warming events (i.e., > 8 °C above average) becoming more common (IPCC, 2018). Global precipitation patterns are also anticipated to be highly variable under future climate conditions with many areas experiencing greater than normal wetting or drying of soils (Zhang et al., 2022). In combination with changes in global temperature regimes, changes in precipitation are expected to drive divergent shifts in the hydrology of boreal peatlands. Zhang et al. (2022) found that the 54% of high-latitude peatlands had become dryer over the past 200-years; yet many (32%) high-latitude peatlands had become wetter over this same time period, while several (14%) showed fluctuating hydrological conditions. However, warmer temperatures may indirectly reduce soil moisture content (Holmstrup et al., 2017) through increased evapotranspiration (Seneviratne et al., 2010). It is still unknown whether greater soil moisture may help buffer the effects of temperature through evaporative cooling in the soil microenvironment, or what the combined effects of short-term changes in temperature and soil moisture are on soil food webs and C dynamics.

Both warming and increased peat saturation are anticipated to affect the peatland soil food web and its C transformations. Mechanistically, warming is anticipated to alter decomposer biomass through increasing organismal metabolism that can lead to faster population turnover rates with increased fecundity and death rates (Kuriki, 2008; Li et al., 2019; Pfingstl and Schatz, 2021). Warming also decreases metabolic assimilation and production efficiencies (Luxton, 1972, 1981; Li et al., 2019), potentially reducing population biomasses and therefore reduce trophic transfer of energy and nutrients from one trophic level to the next. Correspondingly, experimental warming has been shown to decrease (Bokhorst et al., 2008) or increase (Lindo, 2015) soil fauna abundances. For instance, Lindo (2015) found increased abundance in smaller bodied invertebrates under warming, while Barreto et al. (2021) found contrasting effects on species richness depending on initial soil moisture conditions of the site. Meehan et al. (2021) found warming increased abundances in soil predators in boreal forests, but whether the soil community was affected by warming was dependent on other (potentially mitigating) environmental conditions (Meehan et al., 2020). However, it is still unknown what effect short-term extreme climate warming events might have on resistance and resilience of the whole soil food web and C flux, or what role soil moisture might play.

Soil fauna typically show a skewed but unimodal response to soil moisture (Sylvain et al., 2014) where increases in soil moisture are often correlated with increased abundance and species richness of soil microarthropods, except at high levels of soil moisture where reductions in the habitable pore space of soil can reduce soil fauna biomass (Tsiafouli et al., 2005; Turnbull and Lindo, 2015). Alterations in soil moisture can be particularly detrimental for soil organisms in poorly drained, naturally wet soils such as peatlands. For instance, Barreto et al. (2021) found that warming-induced drying of peat soil enhanced faunal species richness where the colonization of more xeric species was possible, but at the expense of peatland-specific semi-aquatic species. The effect of increasing soil moisture on peatland fauna is less well known. Flooded conditions are predicted to become more common with global warming in the 21st century and are predicted to limit soil oxygen availability, thus reducing soil nutrient availability, mineralization, and decomposition of organic material (Schuur and Matson, 2001). Consequently, anaerobic conditions quickly develop in flooded soils (Visser and Voesenek, 2005), which can further cause changes in physical and chemical soil properties (Unger et al., 2010) including the accumulation of phytotoxic products as a function of microbial reduction processes in anoxic conditions (Schuur and Matson, 2001). These changes in soil properties are predicted to affect the composition of soil food webs (González-Macé and Scheu, 2018). However, it is unclear whether the combination of changes in temperature regimes and hydrology expected in peatlands will have an interactive effect on soil food webs, or what effects these changes will have on C and N cycling.

Combined, future warming and changes in soil moisture are thought to threaten the ability of boreal peatlands to sequester C, and may shift boreal peatlands from being a C sink to a C source (Bragazza et al., 2013; Crowther et al., 2016; Harenda et al., 2018). Warming-induced changes in aboveground vegetation (Weltzin et al., 2000; Dieleman et al., 2015; Lyons and Lindo, 2020) and the soil food web (Gilman et al., 2010; Schwarz et al., 2017) drive an increase in total consumptive flux under warming. At the same time, heterotrophic respiration is expected to increase under warming (Brown et al., 2004). Thus, changes in C storage potential for peatland soil food webs can be examined by calculating the total C flux in the soil food web minus the C lost to the atmosphere as heterotrophic CO2 respiration. Whether increased soil moisture can buffer the effects of warming on the soil food web and C and N cycling is unknown.

1.5 Research Objectives

My research investigated how a pulse climate warming event affects the peatland soil fauna food web and corresponding C cycling. My overall objective was to determine how extreme heat and changes in hydrology affect the resistance and resilience of a peatland soil food web and its C functions. Specific objectives included:

  1. Comparing the abundances of the microfauna (nematodes) and mesofauna (microarthropods), and microbial activity (enzyme activity) under short-term (i.e. 21-days), extreme climate perturbations of temperature and soil moisture relative to a field-based control conditions using peat mesocosms and a full-factorial design (Resistance).
  2. Examining whether any measurable response of perturbed mesocosms is mitigated when mesocosms are returned to field-based temperatures (Resilience).
  3. Modeling the C and N flux and mineralization through the soil fauna food web immediately following short-term, extreme climate perturbations of temperature and soil moisture and following a recovery period using an energetic food web model.

I hypothesized that warming will accelerate reproductive rates, especially in small-bodied organisms. Thus, I predicted that soil fauna abundances would increase under warming. At the same time, I hypothesized that greater soil moisture would reduce total soil fauna abundances, corresponding to a reduction in total habitable pore spaces in saturated soils. Correspondingly, I predicted that average total biomass will be greatest in mesocosms assigned to +8 °C warming and field-moist conditions and will be least in those assigned to ambient temperature and saturated conditions. I also hypothesized that soil moisture will enhance system resistance and resilience to heat shock due to the specific heat capacity of water. Thus, I predicted that biomasses in mesocosms assigned to +8 °C warming and saturated conditions will be more resistant and resilient than those assigned to +8 °C warming and field-moist conditions. Furthermore, I predicted that biomasses in mesocosms assigned to +8 °C warming and saturated conditions would be more similar between sampling times immediately following (T1) the climate perturbation and after a recover period (T2) than those assigned to +8 °C warming and field-moist conditions.

In the energetic model of the system, I predicted that the total C flux and C mineralization through the soil fauna food web will be directly correlated with soil fauna population biomasses and temperature-mediated metabolism. Thus, I predicted that C flux and C mineralization will be greatest under +8 °C warming and field-moist conditions and least under ambient temperature and saturated conditions while exposed to the temperature/moisture perturbation. At the same time, I predict that when temperature-mediated metabolic demands are removed, differences between temperature treatments will be more similar, but biomass shifts resulting from alterations in soil moisture will persist as these conditions will take longer to recover from.

I used a paired empirical and model approach to capture changes in both the soil community and larger ecosystem functioning under warming and hydrological changes. Comparing empirical changes in abundance and biomass allowed me to examine population level responses in the soil food web at the level of individual nodes, but this approach alone is limited in generalizability as it does not capture emergent soil properties that operate at the scale of whole ecosystems and landscapes. Integrating both empirical and model approaches will allow me to better understand how changes in ecosystem level functions like soil C and N transformations emerge from changes at the level of individual nodes in the soil fauna food web.

Chapter 2: Methods and Experimental Design

2.1 Soil Sampling

Peatland soils were collected in September 2021 from a Sphagnum-dominated peatland that is part of the BRACE (Biological Response to A Changing Environment) experimental peatland project in the southern boreal mixed-wood forest ecozone. This site is located near White River, Ontario, Canada (48°21′ N, 84°20′ W), and is a long-term research monitoring site used by the Ontario Ministry of Natural Resources and Forestry for the past 20 years. The peatland is a nutrient-poor fen, with a pH ~4.1 and a water table ~30 cm deep that fluctuates seasonally. Previous studies at this site have characterized vegetation (Lyons and Lindo, 2020), bacterial and fungal communities (Asemaninejad et al., 2017, 2019)), nematodes (Kamath et al., 2022), and soil microarthropods (Barreto et al., 2021).

Intact peat core samples (8 x 8 cm x 15 cm deep) were cut and removed using a small, hand peat saw from randomly selected ‘lawn’ areas (i.e., avoiding hummocks and hollows) that were dominated by Sphagnum spp. to exclude vascular plants as much as possible. To account for any heterogeneity in the sampling location, samples were collected in blocks that represented nearby locations of lawn areas, but all samples were collected within a roughly 25 m x 25 m area. Some sample locations were characterized by high microfauna and high mesofauna abundance and were subsequently dealt with in the statistical analyses using block effects (i.e., two blocks, high and low abundance). Intact peat cores were placed in individual plastic bags, kept cool in the field, and refrigerated (4 °C) until the start of the experiment within 48 hours of sample collection. A total of 45 peat core samples were collected.

In the lab, each intact peat core was placed into a 500 mL glass jar to create experimental mesocosms that were placed into incubation at 12 °C under field moist conditions for two weeks to allow each mesocosm to recover from the disturbance. Both the weight of the soil core and the final weight of the mesocosm (soil plus jar) was recorded to monitor moisture loss and replace moisture loss as necessary during the experiment. Following this recovery period, five mesocosms were selected to be destructively sampled (T0). The remaining 40 mesocosms were randomized into experimental treatments of temperature (12 °C and 20 °C) and moisture level regime (field-moist and saturated soil moisture) with ten replicates of each factorial treatment (12 °C field-moist, 12 °C saturated, 20 °C field-moist, 20 °C saturated). Temperature treatments were chosen to reflect the average ambient growing season temperature of the area (12 °C) and an extreme warming event of +8 °C. The southern boreal zone is predicted to see ~4 °C increases in mean annual surface temperature by the end of the century, with increased occurrence of ‘heat waves’ (Perkins-Kirkpatrick and Lewis, 2020), while increases of ~8 °C in mean annual surface temperature are forecast for northern boreal and subarctic areas (Price et al., 2013). Air temperature data from the field site over the past four years indicate that peat-soil surface air temperatures reach or exceed 30 °C at least two days per year, and average soil surface temperatures exceed 20 °C for prolonged periods during summers. Soil moisture regimes were chosen to represent one possible water table scenario that future peatlands may experience under climate change, which has potential for both drying and wetting conditions as well as fluctuations between the two (Zhang et al., 2022).

sample_metadata <- read.csv("Data/sample metadata v2.csv")
sample_metadata$block_effect <- factor(sample_metadata$block_effect, 
                                        levels = c("low", "high"))
head(sample_metadata)
##   Sample_ID destructive_time moisture_tx temp_tx block_effect
## 1   ExRes 1               T2        High      12          low
## 2   ExRes 2               T2     Ambient      12          low
## 3   ExRes 3               T1     Ambient      12         high
## 4   ExRes 4               T2        High      12          low
## 5   ExRes 5               T1     Ambient      20         high
## 6   ExRes 6               T2     Ambient      12          low


Mesocosms were placed under experimental treatment for three weeks, before five replicates of each factorial treatment were destructively sampled (T1). Moisture content across all mesocosms was maintained by adding water to replace any moisture lost during three weeks of experimental conditions. The 20 remaining mesocosms were returned to ambient incubation temperatures for an additional three weeks before they were destructively sampled (T2). At the same time, moisture was no longer added to mesocosms assigned to saturated conditions so that these mesocosms were allowed to slowly return to ambient moisture conditions but moisture in field-moist samples was maintained as described. The T1 mesocosms represent the immediate soil food web response to incubation climate conditions under each assigned combination of temperature and moisture level (resistance to perturbation), while mesocosms sampled at T2 represent mesocosms from each experimental treatment group following three weeks of recovery under ambient temperatures and a slow return to field-moist conditions (resilience).

2.2 Mesocosm Sampling

Each week during the experiment, mesocosms were assessed for soil heterotrophic respiration. These carbon losses, as CO2, were measured every 7 days during the experiment from each mesocosm using a Licor Infrared Gas Analyser (IRGA) with a multiplexing system. Briefly, each mesocosm was sealed, air-filled headspace was purged from the mesocosm, and CO2 concentration was measured every 2 sec over a 90 sec period. Soil heterotrophic respiration was recorded in the units μMol CO2 per m2 per s and converted to g of C per m2 per year. Heterotrophic respiration was measured for all mesocosms at T0. For the T1 mesocosms, heterotrophic respiration was calculated as the average measurement across the four weeks (i.e., starting from the beginning of the experiment (T0) and ending with the destructive sampling of T1 mesocosms three weeks later). The T2 mesocosms are calculated as the average across three weeks of recovery time.

resp.data.temp <- read.csv("Data/respiration data.csv")

mol_per_umol <- 10E-6
molar_weight_CO2 <- 44.01 # g/mol
s_per_year <- 3.1536E7

resp.data.temp2 <- resp.data.temp %>%
  dplyr::select(-c(X.Msgs, Obs., Port., X.Raw, IV.Date)) %>%
  mutate(Lin_Flux_gofCO2perm2pers = Lin_Flux * mol_per_umol * 
           molar_weight_CO2) %>%
  mutate(Lin_Flux_gofCO2perm2peryr = Lin_Flux * mol_per_umol * 
           molar_weight_CO2 * s_per_year) %>%
  mutate(Exp_Flux_gofCO2perm2pers = Exp_Flux * mol_per_umol * 
           molar_weight_CO2) %>%
  mutate(Exp_Flux_gofCO2perm2peryr = Exp_Flux * mol_per_umol * 
           molar_weight_CO2 * s_per_year) %>%
  filter(!Label == "Dummy") %>%
  mutate("Sample_ID" = Label) %>%
  dplyr::select(-c(Label, Lin_Flux, Exp_Flux, Lin_Flux_gofCO2perm2pers, 
                   Exp_Flux_gofCO2perm2pers))

resp.data.temp2$
  Lin_Flux_gofCO2perm2peryr[resp.data.temp2$Lin_Flux_gofCO2perm2peryr<0] <- 0

resp.data.temp2$filter <- 
  interaction(resp.data.temp2$Sample_ID, resp.data.temp2$Sampling_Time)

resp_Q3 <- quantile(resp.data.temp2$Lin_Flux_gofCO2perm2peryr, 0.75) 
resp_Q1 <- quantile(resp.data.temp2$Lin_Flux_gofCO2perm2peryr, 0.25)
resp_IQR <- resp_Q3-resp_Q1

resp_lower_bound <- resp_Q1 - 10*resp_IQR
resp_upper_bound <- resp_Q3 + 10*resp_IQR

resp.data.temp3 <- resp.data.temp2 %>% 
  filter(Lin_Flux_gofCO2perm2peryr >= resp_lower_bound) %>%
  filter(Lin_Flux_gofCO2perm2peryr <= resp_upper_bound)
# outlier 1: W1, ExRes 29
# outlier 2: W1, ExRes 13

resp.data.temp4 <- resp.data.temp3 %>%
  dplyr::select(!c(Exp_FluxCV, Exp_Flux_gofCO2perm2peryr)) %>% 
  dplyr::select(-c(Lin_FluxCV, filter)) %>%  # remove unwanted columns
  group_by(Sample_ID, Sampling_Time) %>%
  summarize(Lin_Flux_gofCO2perm2peryr = 
              mean(Lin_Flux_gofCO2perm2peryr, na.rm = TRUE), 
            .groups = "drop") %>%
  pivot_wider(
    names_from = Sampling_Time,
    values_from = Lin_Flux_gofCO2perm2peryr
  ) 

resp.data.temp5 <- merge(x = sample_metadata, y = resp.data.temp4, 
                         by = "Sample_ID")

resp.data <- resp.data.temp5[, c("Sample_ID", "destructive_time", 
                             "temp_tx", "moisture_tx", "block_effect",
                             "W0", "W1", "W2", "W3", "W4", "W5", "W6")]

resp.data$cum_resp <- log(rowSums(resp.data[,6:9], na.rm = T)/4)
#W0 to W3

resp.data$cum_resp[resp.data$destructive_time == "T0"] <- 
  log(rowSums(resp.data[resp.data$destructive_time == "T0", 6:9], na.rm = T))
# for T0 only 1 week


resp.data$destructive_time <- 
  as.factor(resp.data$destructive_time)
resp.data$block_effect <- 
  as.factor(resp.data$block_effect)
resp.data$temp_tx <- 
  as.factor(resp.data$temp_tx)
resp.data$moisture_tx <- 
  as.factor(resp.data$moisture_tx)

head(resp.data)
##   Sample_ID destructive_time temp_tx moisture_tx block_effect        W0
## 1   ExRes 1               T2      12        High          low 1387.8994
## 2  ExRes 10               T2      20        High          low  555.1597
## 3  ExRes 11               T1      20     Ambient          low 1943.0591
## 4  ExRes 12               T2      12        High          low 1249.1094
## 5  ExRes 13               T1      12        High          low  971.5296
## 6  ExRes 14               T2      12        High          low  832.7396
##          W1        W2        W3        W4        W5 W6 cum_resp
## 1  138.7899  832.7396    0.0000    0.0000    0.0000  0 6.379881
## 2 8466.1861    0.0000    0.0000 4302.4880  693.9497  0 7.721054
## 3 4996.4377    0.0000 2081.8490        NA        NA NA 7.721054
## 4 1526.6893 7494.6565    0.0000    0.0000    0.0000  0 7.850732
## 5        NA    0.0000  555.1597        NA        NA NA 5.944562
## 6    0.0000  138.7899    0.0000  138.7899 1943.0591  0 5.492577


Mesocosms were destructively sampled according to assigned destructive sampling treatments. Accordingly, destructive sampling was performed at three time points: T0 (pre-experiment), T1 (resistance to perturbation), and T2 (resilience following recovery). Destructive sampling included soil fauna extractions to assess the soil food web for soil microfauna (nematodes) and soil microarthropods (mites and collembola), and enzyme assays for microbial potential activity. For each mesocosm, approx. 20 g wet weight of peat was extracted for nematodes and approx. 50 g wet weight peat was used for extraction of microarthropods. Wet extractions (Baermann funnel technique e.g., Forge and Kimpinski, 2008) over 48 hours were used to collect nematodes in water from each mesocosm. Nematodes were preserved in 4% formalin and Rose Bengal stain and enumerated under a stereomicroscope; biomass estimates for fungivores, bacterivores, omnivores, and predators were calculated based on previously established relative abundance distributions and individual body size measurements for each trophic group at the research site (Kamath et al., 2022) and allometric equations of Andrássey (1956). Microarthropods were dry extracted using Tullgren funnels over 72 hours into 75% EtOH, and identified at the suborder-to-family level into the following trophic groups under a stereomicroscope: collembola, juvenile oribatid mites, adult oribatid mites, other non-predatory mites (i.e., most Prostigmata and Astigmata), nematode feeding mites (i.e., Zerconiidae), arthropod feeding mites (i.e., most Mestostigmata excluding Zerconiidae). Oribatid mites were separated into adults vs. juveniles to account for differences in sclerotization that could affect predation rates (see Peschel et al., 2006). Microarthropod abundances were converted to biomass using established allometric equations based on body size (e.g., Edwards, 1967 for collembola; Lebrun, 1971 for oribatid, prostigmatid, and astigmatid mites; Persson and Lohm, 1977 for mesostigmatid mites). All abundances (nematodes and microarthropods) were standardized by the final dry weight of peat soil used in the extraction.

# Conversion Factors
cm3_in_m2 <- 100*100*10 # 15 cm deep, less top 5 cm of OM
bulk_soil_density <- 0.075 # g dwt per cm^3?
# https://sis.agr.gc.ca/cansis/publications/manuals/1984-peat/ca1984_2e_report.pdf
g_per_m2 <- cm3_in_m2*bulk_soil_density # cm3_in_m2 * bulk_soil_density

# Read in abundance data

# extraction metadata
extraction_moisture_data <- 
  read.csv("Data/extraction moisture data.csv") 

# raw mesofauna counts
mesofauna_ab_temp <- 
  read.csv("Data/mesofauna abundances.csv") 

# Carlos' body mass data, in ug of C
meso_body_mass <- 
  read.csv("Data/Barreto et al complete dataset .csv") 

# raw microfauna counts
microfauna_ab_temp <- 
  read.csv("Data/microfauna abundances.csv") %>% # raw abundance data
  mutate(mean_abundance = (ab_1 + ab_2)/2) # average of 2 passes

# body mass from Dev's thesis, in ug wwt
micro_body_mass <- read.csv("Data/Kamath et al dataset.csv") %>% 
  dplyr::select(-prop_ab) 

# proportional abundances from Dev's thesis
micro_prop_ab <- read.csv("Data/Kamath et al dataset.csv") %>% 
  dplyr::select(-body_mass) 

# Create df of mesofauna + dry extraction metadata
dry_extraction <- extraction_moisture_data %>% 
  filter(extraction_type == "Dry") %>%
  dplyr::select(Sample_ID, extraction_type, dry_weight)

temp_dry <- merge(x = mesofauna_ab_temp, y = dry_extraction, 
                  by = "Sample_ID") %>%
  mutate(total_meso_ab_standardized = g_per_m2*total_ab/dry_weight) %>%
  dplyr::select(-total_ab)

temp_dry$collembola <- g_per_m2*temp_dry$collembola/temp_dry$dry_weight
temp_dry$juv_oribatids <- g_per_m2*temp_dry$juv_oribatids/temp_dry$dry_weight
temp_dry$oribatids <- g_per_m2*temp_dry$oribatids/temp_dry$dry_weight
temp_dry$prostigs <- g_per_m2*temp_dry$prostigs/temp_dry$dry_weight
temp_dry$astigmata <- g_per_m2*temp_dry$astigmata/temp_dry$dry_weight
temp_dry$zerconidae <- g_per_m2*temp_dry$zerconidae/temp_dry$dry_weight
temp_dry$mesostigs <- g_per_m2*temp_dry$mesostigs/temp_dry$dry_weight
temp_dry$others <- g_per_m2*temp_dry$others/temp_dry$dry_weight

# Create df of microfauna + wet extraction metadata
wet_extraction <- extraction_moisture_data %>% 
  filter(extraction_type == "Wet") %>%
  dplyr::select(Sample_ID, extraction_type, dry_weight)

temp_wet <- merge(x = microfauna_ab_temp, y = wet_extraction, 
                  by = "Sample_ID") %>% 
  mutate(total_micro_ab_standardized = g_per_m2*mean_abundance/dry_weight)
# note: do not have node level abundances for microfauna as proportional 
# abundances from previous BRACE work (Kamath et al. 2022) was used to 
# estimate node level abundances

# Merge meso- and micro-fauna
abundance_temp <- merge(x = temp_wet, y = temp_dry, by = "Sample_ID") %>%
  dplyr::select(Sample_ID, total_micro_ab_standardized, 
                total_meso_ab_standardized) %>%
  mutate(total_ab_standardized = 
           total_micro_ab_standardized + total_meso_ab_standardized)

# Merge abundance data with sample metadata
abundance_data <- merge(x = sample_metadata, y = abundance_temp, 
                             by = "Sample_ID") 

abundance_data$destructive_time <- 
  as.factor(abundance_data$destructive_time)
abundance_data$moisture_tx <- as.factor(abundance_data$moisture_tx)
abundance_data$temp_tx <- as.factor(abundance_data$temp_tx)
abundance_data$block_effect <- 
  as.factor(abundance_data$block_effect)

abundance_data$block_effect <- factor(abundance_data$block_effect, 
                                        levels = c("low", "high"))

head(abundance_data)
##   Sample_ID destructive_time moisture_tx temp_tx block_effect
## 1   ExRes 1               T2        High      12          low
## 2  ExRes 10               T2        High      20          low
## 3  ExRes 11               T1     Ambient      20          low
## 4  ExRes 12               T2        High      12          low
## 5  ExRes 13               T1        High      12          low
## 6  ExRes 14               T2        High      12          low
##   total_micro_ab_standardized total_meso_ab_standardized total_ab_standardized
## 1                    61567.16                  259615.38              321182.5
## 2                    16891.89                   84199.58              101091.5
## 3                   184459.46                  187759.34              372218.8
## 4                    14516.13                   92633.93              107150.1
## 5                    11227.54                   62874.25               74101.8
## 6                   106060.61                   89939.02              195999.6
# Read in body mass and proportional abundance data

# Carlos' body mass data, in ug of C
meso_body_mass <- 
  read.csv("Data/Barreto et al complete dataset .csv") 

# body mass from Dev's thesis, in ug wwt
micro_body_mass <- read.csv("Data/Kamath et al dataset.csv") %>% 
  dplyr::select(-prop_ab) 

# proportional abundances from Dev's thesis
micro_prop_ab <- read.csv("Data/Kamath et al dataset.csv") %>% 
  dplyr::select(-body_mass) 

# Calculate Mesofauna Biomasses
# Barreto et al. body mass data is in ug of C
# biomass = abundance per m2 * body mass (ug of C) * g of C/ug of C 
mesofauna_biomasses <- 
  data.frame("Sample_ID" = abundance_data$Sample_ID) %>%
  mutate("collembola_biomass" =
           temp_dry$collembola * 
           # abundance per m2
           meso_body_mass$body_mass[meso_body_mass$Node_ID=="collembola"] * 
           # body mass (ug of C)
           1e-6 
         # g of C/ug of C 
         ) %>%  
  mutate("juv_oribatids_biomass" =
           temp_dry$juv_oribatids *
           meso_body_mass$body_mass[meso_body_mass$Node_ID=="juv_oribatids"] *
           1e-6
         ) %>%
  mutate("oribatids_biomass" =
           temp_dry$oribatids *
           meso_body_mass$body_mass[meso_body_mass$Node_ID=="oribatids"] *
           1e-6
         ) %>%
  mutate("prostigs_biomass" = 
           temp_dry$prostigs *
           meso_body_mass$body_mass[meso_body_mass$Node_ID=="prostigs"] *
           1e-6
         ) %>% 
  mutate("astigmata_biomass" = 
           temp_dry$astigmata * 
           meso_body_mass$body_mass[meso_body_mass$Node_ID=="astigmata"] *
           1e-6
         ) %>%
  mutate("zerconidae_biomass" =
           temp_dry$zerconidae *
           meso_body_mass$body_mass[meso_body_mass$Node_ID=="zerconidae"] *
           1e-6
         ) %>%
  mutate("mesostigs_biomass" =
           temp_dry$mesostigs *
           meso_body_mass$body_mass[meso_body_mass$Node_ID=="mesostigmata"] *
           1e-6
         ) %>%
  mutate("total_mesofauna_biomass" = collembola_biomass + 
  juv_oribatids_biomass + oribatids_biomass + prostigs_biomass + 
  astigmata_biomass + zerconidae_biomass + mesostigs_biomass)

# Calculate microfauna biomasses
# Kamath et al. body mass data is in ug wwt
microfauna_biomasses <- 
  data.frame("Sample_ID" = temp_wet$Sample_ID) %>%
  # standardized biomass = group proportional abundance * abundance per m2 * 
  # body mass (ug wwt) * ug to g * g wwt to g dwt * g dwt to g of C  
  mutate(n.bacterivore_biomass =
           micro_prop_ab$prop_ab[micro_prop_ab$Node_ID=="Bacterivore"] * 
           # group proportional abundance
           temp_wet$total_micro_ab_standardized * 
           # abundance per m2
           micro_body_mass$body_mass[micro_body_mass$Node_ID=="Bacterivore"] * 
           # body mass (ug wwt)
           1e-6 * 0.25 * 0.5 
         #ug to g * g wwt to g dwt * g dwt to g of C
         ) %>%
  mutate(n.fungivore_biomass =
           micro_prop_ab$prop_ab[micro_prop_ab$Node_ID=="Fungivore"] *
           temp_wet$total_micro_ab_standardized *
           1e-6 * 0.25 * 0.5
         ) %>%
  mutate(n.herbivore_biomass =
           micro_prop_ab$prop_ab[micro_prop_ab$Node_ID=="Herbivore"] *
           temp_wet$total_micro_ab_standardized *
           micro_body_mass$body_mass[micro_body_mass$Node_ID=="Herbivore"] *
           1e-6 * 0.25 * 0.5
         ) %>%
  mutate(n.omnivore_biomass =
           micro_prop_ab$prop_ab[micro_prop_ab$Node_ID=="Omnivore"] *
           temp_wet$total_micro_ab_standardized *
           micro_body_mass$body_mass[micro_body_mass$Node_ID=="Omnivore"] *
           1e-6 * 0.25 * 0.5
         ) %>%
  mutate(n.predator_biomass =
           micro_prop_ab$prop_ab[micro_prop_ab$Node_ID=="Predator"] *
           temp_wet$total_micro_ab_standardized *
           micro_body_mass$body_mass[micro_body_mass$Node_ID=="Predator"] *
           1e-6 * 0.25 * 0.5 
         ) %>%
  mutate(total_microfauna_biomass = 
           n.bacterivore_biomass + n.fungivore_biomass + n.omnivore_biomass +
           n.predator_biomass)

# Set basal biomass values (non-limiting)
labile_biomass <- 135707
recal_biomass <- 135707

set.seed(1)
fungi_biomass <- rnorm(45, mean = 81.21, sd = 0.10*81.21)

set.seed(1)
bacteria_biomass <- rnorm(45, mean = 10.94, sd = 0.10*10.94)

set.seed(1)
protists_biomass <- rnorm(45, mean = 2.59, sd = 0.10*2.59)

# Merge microfauna and mesofauna biomasses
biomass_temp <- merge(x = mesofauna_biomasses, y = microfauna_biomasses, 
              by = "Sample_ID") %>%
  mutate(labile_biomass = labile_biomass) %>%
  mutate(recal_biomass = recal_biomass) %>%
  mutate(fungi_biomass = fungi_biomass) %>%
  mutate(bacteria_biomass = bacteria_biomass) %>%
  mutate(protists_biomass = protists_biomass)

# combine prostig and astig nodes
biomass_temp2 <- biomass_temp %>%
  mutate(prostig_astig_biomass = prostigs_biomass + astigmata_biomass) %>%
  # remove original cols
  dplyr::select(-prostigs_biomass, -astigmata_biomass)

# re-organize order of nodes, in top-down order
biomass_temp2 <- 
  biomass_temp2[, c("Sample_ID", "mesostigs_biomass", "zerconidae_biomass",
            "prostig_astig_biomass", "juv_oribatids_biomass", 
            "oribatids_biomass", "collembola_biomass", 
            "n.predator_biomass", "n.bacterivore_biomass",
            "n.fungivore_biomass", "n.omnivore_biomass", 
            "protists_biomass", "bacteria_biomass", "fungi_biomass", 
            "labile_biomass", "recal_biomass")]

# Merge biomass data with sample metadata
biomass_temp3 <- merge(x = sample_metadata, y = biomass_temp2, 
                       by = "Sample_ID") 

# Sum biomass in each energy channel
biomass_data <- biomass_temp3 %>%
  mutate(total_biomass = mesostigs_biomass + zerconidae_biomass + 
           prostig_astig_biomass + juv_oribatids_biomass + oribatids_biomass +
           collembola_biomass + n.predator_biomass + n.bacterivore_biomass +
           n.fungivore_biomass + n.omnivore_biomass) %>%
  mutate(bact.ch_biomass = zerconidae_biomass + prostig_astig_biomass + 
           collembola_biomass + n.predator_biomass + n.bacterivore_biomass +
           n.omnivore_biomass) %>%
  mutate(fung.ch_biomass = mesostigs_biomass + juv_oribatids_biomass +
           oribatids_biomass + collembola_biomass + n.predator_biomass +
           n.fungivore_biomass + n.omnivore_biomass) %>%
  mutate(meso_biomass = mesostigs_biomass + zerconidae_biomass + 
           prostig_astig_biomass + juv_oribatids_biomass + oribatids_biomass +
           collembola_biomass ) %>%
  mutate(micro_biomass = n.predator_biomass + n.bacterivore_biomass +
           n.fungivore_biomass + n.omnivore_biomass) 

biomass_data$destructive_time <- as.factor(biomass_data$destructive_time)
biomass_data$moisture_tx <- as.factor(biomass_data$moisture_tx)
biomass_data$temp_tx <- as.factor(biomass_data$temp_tx)
biomass_data$block_effect <- as.factor(biomass_data$block_effect)

biomass_data$block_effect <- factor(biomass_data$block_effect, 
                                        levels = c("low", "high"))

head(biomass_data)
##   Sample_ID destructive_time moisture_tx temp_tx block_effect mesostigs_biomass
## 1   ExRes 1               T2        High      12          low       0.005223677
## 2  ExRes 10               T2        High      20          low       0.002917730
## 3  ExRes 11               T1     Ambient      20          low       0.003882235
## 4  ExRes 12               T2        High      12          low       0.000000000
## 5  ExRes 13               T1        High      12          low       0.000000000
## 6  ExRes 14               T2        High      12          low       0.000000000
##   zerconidae_biomass prostig_astig_biomass juv_oribatids_biomass
## 1        0.001106401            0.05202219            0.18793568
## 2        0.000000000            0.03116554            0.07296909
## 3        0.002466830            0.03887767            0.13797039
## 4        0.000000000            0.03049776            0.06872285
## 5        0.000000000            0.01314873            0.04148062
## 6        0.003625036            0.01785235            0.05256460
##   oribatids_biomass collembola_biomass n.predator_biomass n.bacterivore_biomass
## 1        0.32805451       0.0013094632       0.0006669152          2.305377e-04
## 2        0.05942843       0.0000000000       0.0001829784          6.325153e-05
## 3        0.22733634       0.0029195778       0.0019981239          6.907068e-04
## 4        0.13292910       0.0007852882       0.0001572434          5.435551e-05
## 5        0.11232907       0.0000000000       0.0001216204          4.204144e-05
## 6        0.13072442       0.0085807104       0.0011488824          3.971430e-04
##   n.fungivore_biomass n.omnivore_biomass protists_biomass bacteria_biomass
## 1        0.0021509093       2.508058e-04         2.427748         10.25466
## 2        0.0005901348       6.881239e-05         2.637564         11.14091
## 3        0.0064442723       7.514313e-04         2.373572         10.02582
## 4        0.0005071352       5.913426e-05         3.003178         12.68524
## 5        0.0003922453       4.573758e-05         2.675343         11.30048
## 6        0.0037053314       4.320584e-04         2.377499         10.04241
##   fungi_biomass labile_biomass recal_biomass total_biomass bact.ch_biomass
## 1      76.12257         135707        135707     0.5789511      0.05558631
## 2      82.70137         135707        135707     0.1673860      0.03148058
## 3      74.42386         135707        135707     0.4233376      0.04770434
## 4      94.16528         135707        135707     0.2337129      0.03155378
## 5      83.88593         135707        135707     0.1675601      0.01335813
## 6      74.54698         135707        135707     0.2190305      0.03203618
##   fung.ch_biomass meso_biomass micro_biomass
## 1       0.5255920    0.5756519  0.0032991680
## 2       0.1361572    0.1664808  0.0009051771
## 3       0.3813024    0.4134530  0.0098845343
## 4       0.2031608    0.2329350  0.0007778683
## 5       0.1543693    0.1669584  0.0006016447
## 6       0.1971560    0.2133471  0.0056834152


During the process of destructive sampling, mesocosms were also assessed for physical soil properties and enzyme activity. Soil moisture and pH were measured on 5 g subsamples of each mesocosm using standard soil methods (i.e., gravimetrically and in water, respectively), while percent total C and N were analysed on a CNSH analyser (Elementar Americas IsoCube, New York, USA). A soil enzyme assay protocol modified from Saiya-Cork et al. (2002) was used to measure phenol oxidase and peroxidase activity on 1 g subsamples of each mesocosm.

# read data in
pH_data <- read.csv("Data/pH data.csv")
soil_moisture_data <- read.csv("Data/soil moisture data.csv")
CNS_data <- read.csv("Data/CNS data.csv")
enzyme_data <- na.omit(read.csv("Data/enzyme data.csv"))

# remove enzyme outliers
enzyme_data$Perox[enzyme_data$Sample_ID == "ExRes 37"] <- NA
enzyme_data$Perox[enzyme_data$Sample_ID == "ExRes 33"] <- NA

# merge pH and soil moisture
soil_temp1 <- merge(x = pH_data, y = soil_moisture_data, by = "Sample_ID")

# merge above df with CNS data
soil_temp2 <- merge(x = soil_temp1, y = CNS_data, by = "Sample_ID", 
                    all = TRUE)

# merge above df with enzyme data
soil_temp3 <- merge(x = soil_temp2, y = enzyme_data, by = "Sample_ID", 
                    all = TRUE)

# merge soil data with sample metadata
soil_data <- merge(x = sample_metadata, y = soil_temp3, by = "Sample_ID",
                   all = TRUE)

# tidy data
soil_data$destructive_time <- 
  as.factor(soil_data$destructive_time)
soil_data$moisture_tx <- as.factor(soil_data$moisture_tx)
soil_data$temp_tx <- as.factor(soil_data$temp_tx)
soil_data$block_effect <- factor(soil_data$block_effect, 
                                        levels = c("low", "high"))

head(soil_data)
##   Sample_ID destructive_time moisture_tx temp_tx block_effect   pH pH_weight
## 1   ExRes 1               T2        High      12          low 4.21        NA
## 2  ExRes 10               T2        High      20          low 4.25        NA
## 3  ExRes 11               T1     Ambient      20          low 4.01        NA
## 4  ExRes 12               T2        High      12          low 4.22        NA
## 5  ExRes 13               T1        High      12          low 4.15        NA
## 6  ExRes 14               T2        High      12          low 4.38        NA
##   tray_weight wet_weight_tin dry_weight_tin wet_weight dry_weight pct_moisture
## 1        4.47          14.73           5.56      10.26       1.09      841.284
## 2        4.47          14.84           5.37      10.37       0.90     1052.222
## 3        4.42          13.61           5.56       9.19       1.14      706.140
## 4        4.45          14.78           5.46      10.33       1.01      922.772
## 5        4.38          14.60           5.22      10.22       0.84     1116.667
## 6        4.40          14.85           5.21      10.45       0.81     1190.123
##   pct_N pct_C pct_H pct_S C_N_ratio C_H_ratio CHNS_weight Enzyme_weight
## 1  1.30 44.45 4.342 0.034   34.1279   10.2372      21.365       1.07000
## 2  1.28 43.92 4.013 0.052   34.2056   10.9447      20.069       1.04000
## 3  0.87 44.06 4.424 0.046   50.8775    9.9589      20.337       1.02000
## 4  1.41 44.43 4.715 0.041   31.6111    9.4229      20.201       1.04000
## 5  1.14 42.27 3.844 0.052   37.1063   10.9956      20.525       1.01642
## 6  1.19 43.69 4.036 0.047   36.8071   10.8251      20.279       1.04000
##     Phenox    Perox
## 1 184.6084 211.7352
## 2 138.9358 158.2207
## 3 198.9783 158.9480
## 4 137.8097 161.8806
## 5 120.9178 123.3108
## 6 157.9216 174.1976


2.3 Mesocosm Experiment Empirical Analysis

To compare soil communities under varying temperature and soil moisture conditions, I first analyzed empirical data generated during the mesocosm experiment. One sample (#5) was excluded from all analyses due to an extremely high abundance of both micro- and meso-fauna, including disk-shaped astigmatic mites that were uncommon in all other samples. Heterotrophic respiration was tested for normality and homogeneity of variance using a Shapiro-Wilk test with Q-Q plot and Levene’s test with residuals vs. fit plot, respectively. Mean heterotrophic respiration was compared across each combination of soil moisture, temperature, and destructive sampling conditions using a three-way full-factorial ANOVA with a block effect to account for differences in total abundance by original sampling location with high biomass values of both microfauna and mesofauna observed in a single block that contained one sample replicate from each treatment and Tukey’s HSD post-hoc test.

abundance_data_original <- abundance_data

resp.data <- resp.data %>% filter(!Sample_ID == "ExRes 5")
abundance_data <- abundance_data %>% filter(!Sample_ID == "ExRes 5")
biomass_data <- biomass_data %>% filter(!Sample_ID == "ExRes 5")
soil_data <- soil_data %>% filter(!Sample_ID == "ExRes 5")

abundance_data_original %>% filter(Sample_ID == "ExRes 5")
##   Sample_ID destructive_time moisture_tx temp_tx block_effect
## 1   ExRes 5               T1     Ambient      20         high
##   total_micro_ab_standardized total_meso_ab_standardized total_ab_standardized
## 1                    722612.4                   886075.9               1608688


Soil properties and enzyme concentrations were tested for normality and homogeneity of variance using a Shapiro-Wilk test and Levene’s test, respectively. I constructed linear models from soil properties and enzyme activity using reverse order selection to remove insignificant interaction terms (see Appendix F). Soil properties and enzyme activities were then compared across combinations of soil moisture, temperature, and destructive sampling conditions using a three-way ANOVA with a block effect and Tukey’s HSD post-hoc test.

Microfauna, mesofauna, and total faunal abundance (standardized abundance by dry weight) were tested for normality and homogeneity of variance using a Shapiro-Wilk test with Q-Q plot and Levene’s test with residuals vs. fit plot, respectively. I used Pearson’s correlation test to examine correlations between soil microfauna, mesofauna, and total faunal abundances. I constructed linear models from total abundance, soil microfauna abundance, and soil mesofauna abundance using reverse order selection to remove insignificant interaction terms (see Appendix F). I then statistically analysed differences in total microfauna, total mesofauna and total faunal abundance between treatments at T1 and T2 using a three-way full-factorial ANOVA with a block effect to account for any field-based differences in abundance. I similarly used a full-factorial ANOVA with a block effect and Tukey’s HSD post-hoc test to test for differences in biomass and average weekly soil heterotrophic respiration between treatments. To assess resistance of the system I compared the mean total and trophic group abundance and enzyme concentrations within each treatment group relative to T1. The resilience of the system was assessed by determining whether changes in total and trophic group abundance and enzyme concentrations observed at T1 were maintained at T2.

To examine whether the overall soil fauna (microfauna and mesofauna) groups significantly changed following experimental treatments (T1) and remained different following the recovery period (T2), I performed a multivariate PerMANOVA (permutational ANOVA) based on Bray Curtis dissimilarity of soil fauna trophic groups using the vegdist function to create the dissimilarity matrix, the adonis2 function for the PerMANOVA, and visually display the data using non-metric multidimensional scaling (NMDS) in the R package vegan (Oksanen et al., 2020).

ab_NMDS <- merge(x = sample_metadata, y = temp_dry, by = "Sample_ID")
ab_NMDS$microfauna <- temp_wet$total_micro_ab_standardized
ab_NMDS <- ab_NMDS %>% dplyr::select(-c(moisture_tx,
                                        temp_tx, block_effect, 
                                        extraction_type, dry_weight, others, 
                                        total_meso_ab_standardized))

head(ab_NMDS)
##   Sample_ID destructive_time collembola juv_oribatids oribatids  prostigs
## 1   ExRes 1               T2   1861.042     152605.46  68858.56 12096.774
## 2  ExRes 10               T2      0.000      59251.56  12474.01  7796.258
## 3  ExRes 11               T1   4149.378     112033.20  47717.84  9336.100
## 4  ExRes 12               T2   1116.071      55803.57  27901.79  7812.500
## 5  ExRes 13               T1      0.000      33682.63  23577.84  3368.263
## 6  ExRes 14               T2  12195.122      42682.93  27439.02  4573.171
##   astigmata zerconidae mesostigs microfauna
## 1 20471.464   930.5211  2791.563   61567.16
## 2  3118.503     0.0000  1559.252   16891.89
## 3 10373.444  2074.6888  2074.689  184459.46
## 4     0.000     0.0000     0.000   14516.13
## 5     0.000     0.0000     0.000   11227.54
## 6     0.000  3048.7805     0.000  106060.61


2.4 Energetic Food Web Modelling and Statistical Analysis

To compare ecosystem function under varying temperature and soil moisture conditions, I modelled C and N fluxes and mineralization (see Figure 1.1) using food webs (see Figure 2.1) constructed from node biomasses generated during the mesocosm experiment. Energetic food web models (sensu Moore and de Ruiter, 2012) use three matrices of data to calculate an estimate flux of C and N through the food web: 1) information about death rates and feeding efficiencies for each node based on established values from the literature (see [Appendix A]), 2) a matrix of feeding relationships (links; see Appendix B), and 3) biomass values for each food web member (nodes; see Appendix C). Population turnover rates (death rates) (d) and trophic (production) efficiencies (Ep) were scaled to account for temperature-mediated changes in metabolic rate (Brown et al., 2004) in the 20 °C mesocosms (see [Appendix A]).

ExRes_imat <- as.data.frame(read.csv("Data/ExRes_imat_v3.csv"))
# rows denote consumers, cols denote resources
# 1 denotes the presence of a trophic interaction, 0 denotes the absence 
ExRes_prop_control <- 
  as.data.frame(read.csv("Data/ExRes_control_params_v2.csv")) 
# control model parameters 
# includes death rate, assimilation efficiency, production efficiency, C:N 
# for each node at 12 deg C (ambient temperature tx)
ExRes_prop_warming <- 
  as.data.frame(read.csv("Data/ExRes_warming_params_v2.csv")) 
# warming model parameters
# includes death rate, assimilation efficiency, production efficiency, C:N 
# for each node at 12 deg C (ambient temperature tx)

# Step 3: Set up 'prop' tabel to draw model parameters from
prop <- as.data.frame(ExRes_prop_control$ID)
colnames(prop) <- "Node_ID"
prop <- prop %>%
  mutate(CN = ExRes_prop_control$CN) %>%
  mutate(a = ExRes_prop_control$a) %>%
  mutate(d_12C = ExRes_prop_control$d) %>%
  mutate(d_20C = ExRes_prop_warming$d) %>%
  mutate(p_12C = ExRes_prop_control$p) %>%
  mutate(p_20C = ExRes_prop_warming$p)

head(prop)
##         Node_ID CN  a d_12C    d_20C p_12C  p_20C
## 1     mesostigs  8 60  1.84 2.444240    35 30.926
## 2    zerconidae  8 90  1.84 2.444240    35 30.926
## 3 prostig_astig  8 50  1.84 2.444240    35 30.926
## 4 juv_oribatids  8 50  1.20 1.594069    35 30.926
## 5     oribatids  8 50  1.20 1.594069    35 30.926
## 6    collembola  8 50  1.84 2.444240    35 30.926


The basal food web nodes included basal resources consisting of (1) labile and (2) recalcitrant detritus estimated based on previously measured soil organic C quality measurements and litter input rates (Webster et al., 2013; Palozzi and Lindo, 2017). It is important to note that in the model the biomass of the basal resource was always in excess. The microbial groups included (3) bacteria, (4) fungi, and (5) protists that were previously assessed at this site using phospholipid fatty acid (PLFA) analysis (Lyons and Lindo, 2020). I quantified the biomass of the remaining soil food web nodes as described above for (6) bacterivorous nematodes, (7) fungivorous nematodes, (8) omnivorous nematodes, (9) predatory nematodes, (10) collembola, (11) adult oribatid mites, (12) juvenile oribatid mites, (13) non-predatory prostigmatid and astigmatid mites, (14) nematode-feeding mites (Mesostigmata: Zerconiidae), and (15) arthropod feeding mites (remaining Mesostigmata) (Figure 2.1). Biomass estimates based on empirical data were generated for 15 soil food web nodes to form the basis of the energetic food web model (see Figure 2.1 for placement of each trophic node in the food web). All biomass values are g C / m2 / year for all nodes.

Total C and N flux values were estimated for the entire food web of each mesocosm (T0, T1 and T2) using the R package soilfoodwebs (Buchkowski et al., 2023). I also estimated total C and N fluxes in the fungal and bacterial energy channels corresponding to each mesocosm (see Figure 2.1). The soilfoodwebs package is an ecostoichiometric model that calculates fluxes of C and N through the food web assuming equilibrium (Buchkowski and Lindo, 2021). Flux values of N are calculated using data on the C:N ratio of each organism ([Appendix A]). Total flux is the amount of C and N transferred via consumption across food web members and is also partitioned into the amount C and N mineralized (for C this is respiration) vs. C and N retained in the food web as biomass.

model_biomasses <- 
  as.data.frame(t(biomass_temp2[, -(seq(from=0, to=1, by=1))])) 
# transpose data
colnames(model_biomasses) <- biomass_temp2$Sample_ID

# Step 4: Calculate Flux
# 4.1: Set up data frame with cols for each model
ExRes_biomasses <- as.data.frame(model_biomasses) %>%
  rownames_to_column(var = "taxon")

colnames(ExRes_biomasses) <- gsub(" ", ".", colnames(ExRes_biomasses))

# 4.2: Aggregate T1 sample names
names <- sample_metadata$Sample_ID

# 4.3: Check formatting of each df
rownames(ExRes_imat) = ExRes_imat$X
ExRes_imat$X = NULL
ExRes_imat = as.matrix(ExRes_imat)

# 4.4: Run models
# ExRes 3
ExRes_3_prop <- ExRes_prop_control %>% 
  mutate("B" = ExRes_biomasses$ExRes.3)
ExRes_3_prop <- ExRes_3_prop[, c("X", "ID", "d", "a", "p", "B", "CN", 
                                 "DetritusRecycling", "isDetritus", "isPlant", 
                                 "canIMM")]
ExRes_3 <- list(imat = ExRes_imat, prop = ExRes_3_prop)

# Rescale a and p to be [0,1] instead of [0,100]
ExRes_3$prop$a = ExRes_3$prop$a/100
ExRes_3$prop$p = ExRes_3$prop$p/100
#pdf("PFC.pdf", width = 8, height = 6, bg= "white", colormodel = "cmyk") 
# This will put the plot in the working directory
ExRes_3_model <- comana(ExRes_3, mkplot=F, whattoplot = "web", 
                        BOX.SIZE = 0.05,
                        BOX.PROP = 0.3, # Box proportion (height: width)
                        arrowlog = F, # Keep it on the normal scale
                        arrowsizerange = c(0.1, 30)) 
# What range of line sizes do you want: c(min, max)

# ExRes 5
ExRes_5_prop <- ExRes_prop_warming %>% mutate(B = ExRes_biomasses$ExRes.5)
ExRes_5_prop <- ExRes_5_prop[, c("X", "ID", "d", "a", "p", "B", "CN", 
                                 "DetritusRecycling", "isDetritus", "isPlant", 
                                 "canIMM")]
ExRes_5 <- list(imat = ExRes_imat, prop = ExRes_5_prop)

# Rescale a and p to be [0,1] instead of [0,100]
ExRes_5$prop$a = ExRes_5$prop$a/100
ExRes_5$prop$p = ExRes_5$prop$p/100
#pdf("PFC.pdf", width = 8, height = 6, bg= "white", colormodel = "cmyk") 
# This will put the plot in the working directory
ExRes_5_model <- comana(ExRes_5, mkplot=F, whattoplot = "web", 
                        BOX.SIZE = 0.05,
                        BOX.PROP = 0.3, # Box proportion (height: width)
                        arrowlog = F, # Keep it on the normal scale
                        arrowsizerange = c(0.1, 30)) 
# What range of line sizes do you want: c(min, max)

# ExRes 7
ExRes_7_prop <- ExRes_prop_warming %>% mutate(B = ExRes_biomasses$ExRes.7)
ExRes_7_prop <- ExRes_7_prop[, c("X", "ID", "d", "a", "p", "B", "CN", 
                                 "DetritusRecycling", "isDetritus", "isPlant", 
                                 "canIMM")]
ExRes_7 <- list(imat = ExRes_imat, prop = ExRes_7_prop)

# Rescale a and p to be [0,1] instead of [0,100]
ExRes_7$prop$a = ExRes_7$prop$a/100
ExRes_7$prop$p = ExRes_7$prop$p/100
#pdf("PFC.pdf", width = 8, height = 6, bg= "white", colormodel = "cmyk") 
# This will put the plot in the working directory
ExRes_7_model <- comana(ExRes_7, mkplot=F, whattoplot = "web", 
                        BOX.SIZE = 0.05,
                        BOX.PROP = 0.3, # Box proportion (height: width)
                        arrowlog = F, # Keep it on the normal scale
                        arrowsizerange = c(0.1, 30)) 
# What range of line sizes do you want: c(min, max)

# ExRes 8
ExRes_8_prop <- ExRes_prop_warming %>% mutate(B = ExRes_biomasses$ExRes.8)
ExRes_8_prop <- ExRes_8_prop[, c("X", "ID", "d", "a", "p", "B", "CN", 
                                 "DetritusRecycling", "isDetritus", "isPlant", 
                                 "canIMM")]
ExRes_8 <- list(imat = ExRes_imat, prop = ExRes_8_prop)

# Rescale a and p to be [0,1] instead of [0,100]
ExRes_8$prop$a = ExRes_8$prop$a/100
ExRes_8$prop$p = ExRes_8$prop$p/100
#pdf("PFC.pdf", width = 8, height = 6, bg= "white", colormodel = "cmyk") 
# This will put the plot in the working directory
ExRes_8_model <- comana(ExRes_8, mkplot=F, whattoplot = "web", 
                        BOX.SIZE = 0.05,
                        BOX.PROP = 0.3, # Box proportion (height: width)
                        arrowlog = F, # Keep it on the normal scale
                        arrowsizerange = c(0.1, 30)) 
# What range of line sizes do you want: c(min, max)

# ExRes 11
ExRes_11_prop <- ExRes_prop_warming %>% mutate(B = ExRes_biomasses$ExRes.11)
ExRes_11_prop <- ExRes_11_prop[, c("X", "ID", "d", "a", "p", "B", "CN", 
                                   "DetritusRecycling", "isDetritus", 
                                   "isPlant", "canIMM")]
ExRes_11 <- list(imat = ExRes_imat, prop = ExRes_11_prop)

# Rescale a and p to be [0,1] instead of [0,100]
ExRes_11$prop$a = ExRes_11$prop$a/100
ExRes_11$prop$p = ExRes_11$prop$p/100
#pdf("PFC.pdf", width = 8, height = 6, bg= "white", colormodel = "cmyk") 
# This will put the plot in the working directory
ExRes_11_model <- comana(ExRes_11, mkplot=F, whattoplot = "web", 
                         BOX.SIZE = 0.05,
                         BOX.PROP = 0.3, # Box proportion (height: width)
                         arrowlog = F, # Keep it on the normal scale
                         arrowsizerange = c(0.1, 30)) 
# What range of line sizes do you want: c(min, max)

# ExRes 13
ExRes_13_prop <- ExRes_prop_control %>% mutate(B = ExRes_biomasses$ExRes.13)
ExRes_13_prop <- ExRes_13_prop[, c("X", "ID", "d", "a", "p", "B", "CN", 
                                   "DetritusRecycling", "isDetritus", 
                                   "isPlant", "canIMM")]
ExRes_13 <- list(imat = ExRes_imat, prop = ExRes_13_prop)

# Rescale a and p to be [0,1] instead of [0,100]
ExRes_13$prop$a = ExRes_13$prop$a/100
ExRes_13$prop$p = ExRes_13$prop$p/100
#pdf("PFC.pdf", width = 8, height = 6, bg= "white", colormodel = "cmyk") 
# This will put the plot in the working directory
ExRes_13_model <- comana(ExRes_13, mkplot=F, whattoplot = "web", 
                         BOX.SIZE = 0.05,
                         BOX.PROP = 0.3, # Box proportion (height: width)
                         arrowlog = F, # Keep it on the normal scale
                         arrowsizerange = c(0.1, 30)) 
# What range of line sizes do you want: c(min, max)

# ExRes 16
ExRes_16_prop <- ExRes_prop_warming %>% mutate(B = ExRes_biomasses$ExRes.16)
ExRes_16_prop <- ExRes_16_prop[, c("X", "ID", "d", "a", "p", "B", "CN", 
                                   "DetritusRecycling", "isDetritus", 
                                   "isPlant", "canIMM")]
ExRes_16 <- list(imat = ExRes_imat, prop = ExRes_16_prop)

# Rescale a and p to be [0,1] instead of [0,100]
ExRes_16$prop$a = ExRes_16$prop$a/100
ExRes_16$prop$p = ExRes_16$prop$p/100
#pdf("PFC.pdf", width = 8, height = 6, bg= "white", colormodel = "cmyk") 
# This will put the plot in the working directory
ExRes_16_model <- comana(ExRes_16, mkplot=F, whattoplot = "web", 
                         BOX.SIZE = 0.05,
                         BOX.PROP = 0.3, # Box proportion (height: width)
                         arrowlog = F, # Keep it on the normal scale
                         arrowsizerange = c(0.1, 30)) 
# What range of line sizes do you want: c(min, max)

# ExRes 17
ExRes_17_prop <- ExRes_prop_control %>% mutate(B = ExRes_biomasses$ExRes.17)
ExRes_17_prop <- ExRes_17_prop[, c("X", "ID", "d", "a", "p", "B", "CN", 
                                   "DetritusRecycling", "isDetritus", 
                                   "isPlant", "canIMM")]
ExRes_17 <- list(imat = ExRes_imat, prop = ExRes_17_prop)

# Rescale a and p to be [0,1] instead of [0,100]
ExRes_17$prop$a = ExRes_17$prop$a/100
ExRes_17$prop$p = ExRes_17$prop$p/100
#pdf("PFC.pdf", width = 8, height = 6, bg= "white", colormodel = "cmyk") 
# This will put the plot in the working directory
ExRes_17_model <- comana(ExRes_17, mkplot=F, whattoplot = "web", 
                         BOX.SIZE = 0.05,
                         BOX.PROP = 0.3, # Box proportion (height: width)
                         arrowlog = F, # Keep it on the normal scale
                         arrowsizerange = c(0.1, 30)) 
# What range of line sizes do you want: c(min, max)

# ExRes 18
ExRes_18_prop <- ExRes_prop_warming %>% mutate(B = ExRes_biomasses$ExRes.18)
ExRes_18_prop <- ExRes_18_prop[, c("X", "ID", "d", "a", "p", "B", "CN", 
                                   "DetritusRecycling", "isDetritus", 
                                   "isPlant", "canIMM")]
ExRes_18 <- list(imat = ExRes_imat, prop = ExRes_18_prop)

# Rescale a and p to be [0,1] instead of [0,100]
ExRes_18$prop$a = ExRes_18$prop$a/100
ExRes_18$prop$p = ExRes_18$prop$p/100
#pdf("PFC.pdf", width = 8, height = 6, bg= "white", colormodel = "cmyk") 
# This will put the plot in the working directory
ExRes_18_model <- comana(ExRes_18, mkplot=F, whattoplot = "web", 
                         BOX.SIZE = 0.05,
                         BOX.PROP = 0.3, # Box proportion (height: width)
                         arrowlog = F, # Keep it on the normal scale
                         arrowsizerange = c(0.1, 30)) 
# What range of line sizes do you want: c(min, max)

# ExRes 19
ExRes_19_prop <- ExRes_prop_warming %>% mutate(B = ExRes_biomasses$ExRes.19)
ExRes_19_prop <- ExRes_19_prop[, c("X", "ID", "d", "a", "p", "B", "CN", 
                                   "DetritusRecycling", "isDetritus", 
                                   "isPlant", "canIMM")]
ExRes_19 <- list(imat = ExRes_imat, prop = ExRes_19_prop)

# Rescale a and p to be [0,1] instead of [0,100]
ExRes_19$prop$a = ExRes_19$prop$a/100
ExRes_19$prop$p = ExRes_19$prop$p/100
#pdf("PFC.pdf", width = 8, height = 6, bg= "white", colormodel = "cmyk") 
# This will put the plot in the working directory
ExRes_19_model <- comana(ExRes_19, mkplot=F, whattoplot = "web", 
                         BOX.SIZE = 0.05,
                         BOX.PROP = 0.3, # Box proportion (height: width)
                         arrowlog = F, # Keep it on the normal scale
                         arrowsizerange = c(0.1, 30)) 
# What range of line sizes do you want: c(min, max)

# ExRes 20
ExRes_20_prop <- ExRes_prop_warming %>% mutate(B = ExRes_biomasses$ExRes.20)
ExRes_20_prop <- ExRes_20_prop[, c("X", "ID", "d", "a", "p", "B", "CN", 
                                   "DetritusRecycling", "isDetritus", 
                                   "isPlant", "canIMM")]
ExRes_20 <- list(imat = ExRes_imat, prop = ExRes_20_prop)

# Rescale a and p to be [0,1] instead of [0,100]
ExRes_20$prop$a = ExRes_20$prop$a/100
ExRes_20$prop$p = ExRes_20$prop$p/100
#pdf("PFC.pdf", width = 8, height = 6, bg= "white", colormodel = "cmyk") 
# This will put the plot in the working directory
ExRes_20_model <- comana(ExRes_20, mkplot=F, whattoplot = "web", 
                         BOX.SIZE = 0.05,
                         BOX.PROP = 0.3, # Box proportion (height: width)
                         arrowlog = F, # Keep it on the normal scale
                         arrowsizerange = c(0.1, 30)) 
# What range of line sizes do you want: c(min, max)

# ExRes 21
ExRes_21_prop <- ExRes_prop_control %>% mutate(B = ExRes_biomasses$ExRes.21)
ExRes_21_prop <- ExRes_21_prop[, c("X", "ID", "d", "a", "p", "B", "CN", 
                                   "DetritusRecycling", "isDetritus", 
                                   "isPlant", "canIMM")]
ExRes_21 <- list(imat = ExRes_imat, prop = ExRes_21_prop)

# Rescale a and p to be [0,1] instead of [0,100]
ExRes_21$prop$a = ExRes_21$prop$a/100
ExRes_21$prop$p = ExRes_21$prop$p/100
#pdf("PFC.pdf", width = 8, height = 6, bg= "white", colormodel = "cmyk") 
# This will put the plot in the working directory
ExRes_21_model <- comana(ExRes_21, mkplot=F, whattoplot = "web", 
                         BOX.SIZE = 0.05,
                         BOX.PROP = 0.3, # Box proportion (height: width)
                         arrowlog = F, # Keep it on the normal scale
                         arrowsizerange = c(0.1, 30)) 
# What range of line sizes do you want: c(min, max)

# ExRes 24
ExRes_24_prop <- ExRes_prop_control %>% mutate(B = ExRes_biomasses$ExRes.24)
ExRes_24_prop <- ExRes_24_prop[, c("X", "ID", "d", "a", "p", "B", "CN", 
                                   "DetritusRecycling", "isDetritus", 
                                   "isPlant", "canIMM")]
ExRes_24 <- list(imat = ExRes_imat, prop = ExRes_24_prop)

# Rescale a and p to be [0,1] instead of [0,100]
ExRes_24$prop$a = ExRes_24$prop$a/100
ExRes_24$prop$p = ExRes_24$prop$p/100
#pdf("PFC.pdf", width = 8, height = 6, bg= "white", colormodel = "cmyk") 
# This will put the plot in the working directory
ExRes_24_model <- comana(ExRes_24, mkplot=F, whattoplot = "web", 
                         BOX.SIZE = 0.05,
                         BOX.PROP = 0.3, # Box proportion (height: width)
                         arrowlog = F, # Keep it on the normal scale
                         arrowsizerange = c(0.1, 30)) 
# What range of line sizes do you want: c(min, max)

# ExRes 25
ExRes_25_prop <- ExRes_prop_control %>% mutate(B = ExRes_biomasses$ExRes.25)
ExRes_25_prop <- ExRes_25_prop[, c("X", "ID", "d", "a", "p", "B", "CN", 
                                   "DetritusRecycling", "isDetritus", 
                                   "isPlant", "canIMM")]
ExRes_25 <- list(imat = ExRes_imat, prop = ExRes_25_prop)

# Rescale a and p to be [0,1] instead of [0,100]
ExRes_25$prop$a = ExRes_25$prop$a/100
ExRes_25$prop$p = ExRes_25$prop$p/100
#pdf("PFC.pdf", width = 8, height = 6, bg= "white", colormodel = "cmyk") 
# This will put the plot in the working directory
ExRes_25_model <- comana(ExRes_25, mkplot=F, whattoplot = "web", 
                         BOX.SIZE = 0.05,
                         BOX.PROP = 0.3, # Box proportion (height: width)
                         arrowlog = F, # Keep it on the normal scale
                         arrowsizerange = c(0.1, 30)) 
# What range of line sizes do you want: c(min, max)

# ExRes 29
ExRes_29_prop <- ExRes_prop_control %>% mutate(B = ExRes_biomasses$ExRes.29)
ExRes_29_prop <- ExRes_29_prop[, c("X", "ID", "d", "a", "p", "B", "CN", 
                                   "DetritusRecycling", "isDetritus", 
                                   "isPlant", "canIMM")]
ExRes_29 <- list(imat = ExRes_imat, prop = ExRes_29_prop)

# Rescale a and p to be [0,1] instead of [0,100]
ExRes_29$prop$a = ExRes_29$prop$a/100
ExRes_29$prop$p = ExRes_29$prop$p/100
#pdf("PFC.pdf", width = 8, height = 6, bg= "white", colormodel = "cmyk") 
# This will put the plot in the working directory
ExRes_29_model <- comana(ExRes_29, mkplot=F, whattoplot = "web", 
                         BOX.SIZE = 0.05,
                         BOX.PROP = 0.3, # Box proportion (height: width)
                         arrowlog = F, # Keep it on the normal scale
                         arrowsizerange = c(0.1, 30)) 
# What range of line sizes do you want: c(min, max)

# ExRes 31
ExRes_31_prop <- ExRes_prop_warming %>% mutate(B = ExRes_biomasses$ExRes.31)
ExRes_31_prop <- ExRes_31_prop[, c("X", "ID", "d", "a", "p", "B", "CN", 
                                   "DetritusRecycling", "isDetritus", 
                                   "isPlant", "canIMM")]
ExRes_31 <- list(imat = ExRes_imat, prop = ExRes_31_prop)

# Rescale a and p to be [0,1] instead of [0,100]
ExRes_31$prop$a = ExRes_31$prop$a/100
ExRes_31$prop$p = ExRes_31$prop$p/100
#pdf("PFC.pdf", width = 8, height = 6, bg= "white", colormodel = "cmyk") 
# This will put the plot in the working directory
ExRes_31_model <- comana(ExRes_31, mkplot=F, whattoplot = "web", 
                         BOX.SIZE = 0.05,
                         BOX.PROP = 0.3, # Box proportion (height: width)
                         arrowlog = F, # Keep it on the normal scale
                         arrowsizerange = c(0.1, 30)) 
# What range of line sizes do you want: c(min, max)

# ExRes 33
ExRes_33_prop <- ExRes_prop_control %>% mutate(B = ExRes_biomasses$ExRes.33)
ExRes_33_prop <- ExRes_33_prop[, c("X", "ID", "d", "a", "p", "B", "CN", 
                                   "DetritusRecycling", "isDetritus", 
                                   "isPlant", "canIMM")]
ExRes_33 <- list(imat = ExRes_imat, prop = ExRes_33_prop)

# Rescale a and p to be [0,1] instead of [0,100]
ExRes_33$prop$a = ExRes_33$prop$a/100
ExRes_33$prop$p = ExRes_33$prop$p/100
#pdf("PFC.pdf", width = 8, height = 6, bg= "white", colormodel = "cmyk") 
# This will put the plot in the working directory
ExRes_33_model <- comana(ExRes_33, mkplot=F, whattoplot = "web", 
                         BOX.SIZE = 0.05,
                         BOX.PROP = 0.3, # Box proportion (height: width)
                         arrowlog = F, # Keep it on the normal scale
                         arrowsizerange = c(0.1, 30)) 
# What range of line sizes do you want: c(min, max)

# ExRes 36
ExRes_36_prop <- ExRes_prop_warming %>% mutate(B = ExRes_biomasses$ExRes.36)
ExRes_36_prop <- ExRes_36_prop[, c("X", "ID", "d", "a", "p", "B", "CN", 
                                   "DetritusRecycling", "isDetritus", 
                                   "isPlant", "canIMM")]
ExRes_36 <- list(imat = ExRes_imat, prop = ExRes_36_prop)

# Rescale a and p to be [0,1] instead of [0,100]
ExRes_36$prop$a = ExRes_36$prop$a/100
ExRes_36$prop$p = ExRes_36$prop$p/100
#pdf("PFC.pdf", width = 8, height = 6, bg= "white", colormodel = "cmyk") 
# This will put the plot in the working directory
ExRes_36_model <- comana(ExRes_36, mkplot=F, whattoplot = "web", 
                         BOX.SIZE = 0.05,
                         BOX.PROP = 0.3, # Box proportion (height: width)
                         arrowlog = F, # Keep it on the normal scale
                         arrowsizerange = c(0.1, 30)) 
# What range of line sizes do you want: c(min, max)

# ExRes 37
ExRes_37_prop <- ExRes_prop_control %>% mutate(B = ExRes_biomasses$ExRes.37)
ExRes_37_prop <- ExRes_37_prop[, c("X", "ID", "d", "a", "p", "B", "CN", 
                                   "DetritusRecycling", "isDetritus", 
                                   "isPlant", "canIMM")]
ExRes_37 <- list(imat = ExRes_imat, prop = ExRes_37_prop)

# Rescale a and p to be [0,1] instead of [0,100]
ExRes_37$prop$a = ExRes_37$prop$a/100
ExRes_37$prop$p = ExRes_37$prop$p/100
#pdf("PFC.pdf", width = 8, height = 6, bg= "white", colormodel = "cmyk") 
# This will put the plot in the working directory
ExRes_37_model <- comana(ExRes_37, mkplot=F, whattoplot = "web", 
                         BOX.SIZE = 0.05,
                         BOX.PROP = 0.3, # Box proportion (height: width)
                         arrowlog = F, # Keep it on the normal scale
                         arrowsizerange = c(0.1, 30)) 
# What range of line sizes do you want: c(min, max)

# ExRes 43
ExRes_43_prop <- ExRes_prop_control %>% mutate(B = ExRes_biomasses$ExRes.43)
ExRes_43_prop <- ExRes_43_prop[, c("X", "ID", "d", "a", "p", "B", "CN", 
                                   "DetritusRecycling", "isDetritus", 
                                   "isPlant", "canIMM")]
ExRes_43 <- list(imat = ExRes_imat, prop = ExRes_43_prop)

# Rescale a and p to be [0,1] instead of [0,100]
ExRes_43$prop$a = ExRes_43$prop$a/100
ExRes_43$prop$p = ExRes_43$prop$p/100
#pdf("PFC.pdf", width = 8, height = 6, bg= "white", colormodel = "cmyk") 
# This will put the plot in the working directory
ExRes_43_model <- comana(ExRes_43, mkplot=F, whattoplot = "web", 
                         BOX.SIZE = 0.05,
                         BOX.PROP = 0.3, # Box proportion (height: width)
                         arrowlog = F, # Keep it on the normal scale
                         arrowsizerange = c(0.1, 30)) 
# What range of line sizes do you want: c(min, max)

# ExRes 1
ExRes_1_prop <- ExRes_prop_control %>% mutate(B = ExRes_biomasses$ExRes.1)
ExRes_1_prop <- ExRes_1_prop[, c("X", "ID", "d", "a", "p", "B", "CN", 
                                 "DetritusRecycling", "isDetritus", 
                                 "isPlant", "canIMM")]
ExRes_1 <- list(imat = ExRes_imat, prop = ExRes_1_prop)

# Rescale a and p to be [0,1] instead of [0,100]
ExRes_1$prop$a = ExRes_1$prop$a/100
ExRes_1$prop$p = ExRes_1$prop$p/100
#pdf("PFC.pdf", width = 8, height = 6, bg= "white", colormodel = "cmyk") 
# This will put the plot in the working directory
ExRes_1_model <- comana(ExRes_1, mkplot=F, whattoplot = "web", 
                        BOX.SIZE = 0.05,
                        BOX.PROP = 0.3, # Box proportion (height: width)
                        arrowlog = F, # Keep it on the normal scale
                        arrowsizerange = c(0.1, 30)) 
# What range of line sizes do you want: c(min, max)

# ExRes 2
ExRes_2_prop <- ExRes_prop_control %>% mutate(B = ExRes_biomasses$ExRes.2)
ExRes_2_prop <- ExRes_2_prop[, c("X", "ID", "d", "a", "p", "B", "CN", 
                                 "DetritusRecycling", "isDetritus", 
                                 "isPlant", "canIMM")]
ExRes_2 <- list(imat = ExRes_imat, prop = ExRes_2_prop)

# Rescale a and p to be [0,1] instead of [0,100]
ExRes_2$prop$a = ExRes_2$prop$a/100
ExRes_2$prop$p = ExRes_2$prop$p/100
#pdf("PFC.pdf", width = 8, height = 6, bg= "white", colormodel = "cmyk") 
# This will put the plot in the working directory
ExRes_2_model <- comana(ExRes_2, mkplot=F, whattoplot = "web", 
                        BOX.SIZE = 0.05,
                        BOX.PROP = 0.3, # Box proportion (height: width)
                        arrowlog = F, # Keep it on the normal scale
                        arrowsizerange = c(0.1, 30)) 
# What range of line sizes do you want: c(min, max)

# ExRes 4
ExRes_4_prop <- ExRes_prop_control %>% mutate(B = ExRes_biomasses$ExRes.4)
ExRes_4_prop <- ExRes_4_prop[, c("X", "ID", "d", "a", "p", "B", "CN", 
                                 "DetritusRecycling", "isDetritus", 
                                 "isPlant", "canIMM")]
ExRes_4 <- list(imat = ExRes_imat, prop = ExRes_4_prop)

# Rescale a and p to be [0,1] instead of [0,100]
ExRes_4$prop$a = ExRes_4$prop$a/100
ExRes_4$prop$p = ExRes_4$prop$p/100
#pdf("PFC.pdf", width = 8, height = 6, bg= "white", colormodel = "cmyk") 
# This will put the plot in the working directory
ExRes_4_model <- comana(ExRes_4, mkplot=F, whattoplot = "web", 
                        BOX.SIZE = 0.05,
                        BOX.PROP = 0.3, # Box proportion (height: width)
                        arrowlog = F, # Keep it on the normal scale
                        arrowsizerange = c(0.1, 30)) 
# What range of line sizes do you want: c(min, max)

# ExRes 6 
ExRes_6_prop <- ExRes_prop_control %>% mutate(B = ExRes_biomasses$ExRes.6)
ExRes_6_prop <- ExRes_6_prop[, c("X", "ID", "d", "a", "p", "B", "CN", 
                                 "DetritusRecycling", "isDetritus", 
                                 "isPlant", "canIMM")]
ExRes_6 <- list(imat = ExRes_imat, prop = ExRes_6_prop)

ExRes_6$prop$a = ExRes_6$prop$a/100
ExRes_6$prop$p = ExRes_6$prop$p/100
#pdf("PFC.pdf", width = 8, height = 6, bg= "white", colormodel = "cmyk") 
# This will put the plot in the working directory
ExRes_6_model <- comana(ExRes_6, mkplot=F, whattoplot = "web", 
                        BOX.SIZE = 0.05,
                        BOX.PROP = 0.3, # Box proportion (height: width)
                        arrowlog = F, # Keep it on the normal scale
                        arrowsizerange = c(0.1, 30)) 
# What range of line sizes do you want: c(min, max)

# ExRes 9 
ExRes_9_prop <- ExRes_prop_control %>% mutate(B = ExRes_biomasses$ExRes.9)
ExRes_9_prop <- ExRes_9_prop[, c("X", "ID", "d", "a", "p", "B", "CN", 
                                 "DetritusRecycling", "isDetritus", 
                                 "isPlant", "canIMM")]
ExRes_9 <- list(imat = ExRes_imat, prop = ExRes_9_prop)

ExRes_9$prop$a = ExRes_9$prop$a/100
ExRes_9$prop$p = ExRes_9$prop$p/100
#pdf("PFC.pdf", width = 8, height = 6, bg= "white", colormodel = "cmyk") 
# This will put the plot in the working directory
ExRes_9_model <- comana(ExRes_9, mkplot=F, whattoplot = "web", 
                        BOX.SIZE = 0.05,
                        BOX.PROP = 0.3, # Box proportion (height: width)
                        arrowlog = F, # Keep it on the normal scale
                        arrowsizerange = c(0.1, 30)) 
# What range of line sizes do you want: c(min, max)

# ExRes 10
ExRes_10_prop <- ExRes_prop_control %>% mutate(B = ExRes_biomasses$ExRes.10)
ExRes_10_prop <- ExRes_10_prop[, c("X", "ID", "d", "a", "p", "B", "CN", 
                                   "DetritusRecycling", "isDetritus", 
                                   "isPlant", "canIMM")]
ExRes_10 <- list(imat = ExRes_imat, prop = ExRes_10_prop)

ExRes_10$prop$a = ExRes_10$prop$a/100
ExRes_10$prop$p = ExRes_10$prop$p/100
#pdf("PFC.pdf", width = 8, height = 6, bg= "white", colormodel = "cmyk") 
# This will put the plot in the working directory
ExRes_10_model <- comana(ExRes_10, mkplot=F, whattoplot = "web", 
                         BOX.SIZE = 0.05,
                         BOX.PROP = 0.3, # Box proportion (height: width)
                         arrowlog = F, # Keep it on the normal scale
                         arrowsizerange = c(0.1, 30)) 
# What range of line sizes do you want: c(min, max)

# ExRes 12
ExRes_12_prop <- ExRes_prop_control %>% mutate(B = ExRes_biomasses$ExRes.12)
ExRes_12_prop <- ExRes_12_prop[, c("X", "ID", "d", "a", "p", "B", "CN", 
                                   "DetritusRecycling", "isDetritus", 
                                   "isPlant", "canIMM")]
ExRes_12 <- list(imat = ExRes_imat, prop = ExRes_12_prop)

# Rescale a and p to be [0,1] instead of [0,100]
ExRes_12$prop$a = ExRes_12$prop$a/100
ExRes_12$prop$p = ExRes_12$prop$p/100
#pdf("PFC.pdf", width = 8, height = 6, bg= "white", colormodel = "cmyk") 
# This will put the plot in the working directory
ExRes_12_model <- comana(ExRes_12, mkplot=F, whattoplot = "web", 
                         BOX.SIZE = 0.05,
                         BOX.PROP = 0.3, # Box proportion (height: width)
                         arrowlog = F, # Keep it on the normal scale
                         arrowsizerange = c(0.1, 30)) 
# What range of line sizes do you want: c(min, max)

# ExRes 14
ExRes_14_prop <- ExRes_prop_control %>% mutate(B = ExRes_biomasses$ExRes.14)
ExRes_14_prop <- ExRes_14_prop[, c("X", "ID", "d", "a", "p", "B", "CN", 
                                   "DetritusRecycling", "isDetritus", 
                                   "isPlant", "canIMM")]
ExRes_14 <- list(imat = ExRes_imat, prop = ExRes_14_prop)

# Rescale a and p to be [0,1] instead of [0,100]
ExRes_14$prop$a = ExRes_14$prop$a/100
ExRes_14$prop$p = ExRes_14$prop$p/100
#pdf("PFC.pdf", width = 8, height = 6, bg= "white", colormodel = "cmyk") 
# This will put the plot in the working directory
ExRes_14_model <- comana(ExRes_14, mkplot=F, whattoplot = "web", 
                         BOX.SIZE = 0.05,
                         BOX.PROP = 0.3, # Box proportion (height: width)
                         arrowlog = F, # Keep it on the normal scale
                         arrowsizerange = c(0.1, 30)) 
# What range of line sizes do you want: c(min, max)

# ExRes 15
ExRes_15_prop <- ExRes_prop_control %>% mutate(B = ExRes_biomasses$ExRes.15)
ExRes_15_prop <- ExRes_15_prop[, c("X", "ID", "d", "a", "p", "B", "CN", 
                                   "DetritusRecycling", "isDetritus", 
                                   "isPlant", "canIMM")]
ExRes_15 <- list(imat = ExRes_imat, prop = ExRes_15_prop)

# Rescale a and p to be [0,1] instead of [0,100]
ExRes_15$prop$a = ExRes_15$prop$a/100
ExRes_15$prop$p = ExRes_15$prop$p/100
#pdf("PFC.pdf", width = 8, height = 6, bg= "white", colormodel = "cmyk") 
# This will put the plot in the working directory
ExRes_15_model <- comana(ExRes_15, mkplot=F, whattoplot = "web", 
                         BOX.SIZE = 0.05,
                         BOX.PROP = 0.3, # Box proportion (height: width)
                         arrowlog = F, # Keep it on the normal scale
                         arrowsizerange = c(0.1, 30)) 
# What range of line sizes do you want: c(min, max)

# ExRes 26
ExRes_26_prop <- ExRes_prop_control %>% mutate(B = ExRes_biomasses$ExRes.26)
ExRes_26_prop <- ExRes_26_prop[, c("X", "ID", "d", "a", "p", "B", "CN", 
                                   "DetritusRecycling", "isDetritus", 
                                   "isPlant", "canIMM")]
ExRes_26 <- list(imat = ExRes_imat, prop = ExRes_26_prop)

# Rescale a and p to be [0,1] instead of [0,100]
ExRes_26$prop$a = ExRes_26$prop$a/100
ExRes_26$prop$p = ExRes_26$prop$p/100
#pdf("PFC.pdf", width = 8, height = 6, bg= "white", colormodel = "cmyk") 
# This will put the plot in the working directory
ExRes_26_model <- comana(ExRes_26, mkplot=F, whattoplot = "web", 
                         BOX.SIZE = 0.05,
                         BOX.PROP = 0.3, # Box proportion (height: width)
                         arrowlog = F, # Keep it on the normal scale
                         arrowsizerange = c(0.1, 30)) 
# What range of line sizes do you want: c(min, max)

# ExRes 27
ExRes_27_prop <- ExRes_prop_control %>% mutate(B = ExRes_biomasses$ExRes.27)
ExRes_27_prop <- ExRes_27_prop[, c("X", "ID", "d", "a", "p", "B", "CN", 
                                   "DetritusRecycling", "isDetritus", 
                                   "isPlant", "canIMM")]
ExRes_27 <- list(imat = ExRes_imat, prop = ExRes_27_prop)

# Rescale a and p to be [0,1] instead of [0,100]
ExRes_27$prop$a = ExRes_27$prop$a/100
ExRes_27$prop$p = ExRes_27$prop$p/100
#pdf("PFC.pdf", width = 8, height = 6, bg= "white", colormodel = "cmyk") 
# This will put the plot in the working directory
ExRes_27_model <- comana(ExRes_27, mkplot=F, whattoplot = "web", 
                         BOX.SIZE = 0.05,
                         BOX.PROP = 0.3, # Box proportion (height: width)
                         arrowlog = F, # Keep it on the normal scale
                         arrowsizerange = c(0.1, 30)) 
# What range of line sizes do you want: c(min, max)

# ExRes 28
ExRes_28_prop <- ExRes_prop_control %>% mutate(B = ExRes_biomasses$ExRes.28)
ExRes_28_prop <- ExRes_28_prop[, c("X", "ID", "d", "a", "p", "B", "CN", 
                                   "DetritusRecycling", "isDetritus", 
                                   "isPlant", "canIMM")]
ExRes_28 <- list(imat = ExRes_imat, prop = ExRes_28_prop)

# Rescale a and p to be [0,1] instead of [0,100]
ExRes_28$prop$a = ExRes_28$prop$a/100
ExRes_28$prop$p = ExRes_28$prop$p/100
#pdf("PFC.pdf", width = 8, height = 6, bg= "white", colormodel = "cmyk") 
# This will put the plot in the working directory
ExRes_28_model <- comana(ExRes_28, mkplot=F, whattoplot = "web", 
                         BOX.SIZE = 0.05,
                         BOX.PROP = 0.3, # Box proportion (height: width)
                         arrowlog = F, # Keep it on the normal scale
                         arrowsizerange = c(0.1, 30)) 
# What range of line sizes do you want: c(min, max)

# ExRes 30
ExRes_30_prop <- ExRes_prop_control %>% mutate(B = ExRes_biomasses$ExRes.30)
ExRes_30_prop <- ExRes_30_prop[, c("X", "ID", "d", "a", "p", "B", "CN", 
                                   "DetritusRecycling", "isDetritus", 
                                   "isPlant", "canIMM")]
ExRes_30 <- list(imat = ExRes_imat, prop = ExRes_30_prop)

# Rescale a and p to be [0,1] instead of [0,100]
ExRes_30$prop$a = ExRes_30$prop$a/100
ExRes_30$prop$p = ExRes_30$prop$p/100
#pdf("PFC.pdf", width = 8, height = 6, bg= "white", colormodel = "cmyk") 
# This will put the plot in the working directory
ExRes_30_model <- comana(ExRes_30, mkplot=F, whattoplot = "web", 
                         BOX.SIZE = 0.05,
                         BOX.PROP = 0.3, # Box proportion (height: width)
                         arrowlog = F, # Keep it on the normal scale
                         arrowsizerange = c(0.1, 30)) 
# What range of line sizes do you want: c(min, max)

# ExRes 32
ExRes_32_prop <- ExRes_prop_control %>% mutate(B = ExRes_biomasses$ExRes.32)
ExRes_32_prop <- ExRes_32_prop[, c("X", "ID", "d", "a", "p", "B", "CN", 
                                   "DetritusRecycling", "isDetritus", 
                                   "isPlant", "canIMM")]
ExRes_32 <- list(imat = ExRes_imat, prop = ExRes_32_prop)

# Rescale a and p to be [0,1] instead of [0,100]
ExRes_32$prop$a = ExRes_32$prop$a/100
ExRes_32$prop$p = ExRes_32$prop$p/100
#pdf("PFC.pdf", width = 8, height = 6, bg= "white", colormodel = "cmyk") 
# This will put the plot in the working directory
ExRes_32_model <- comana(ExRes_32, mkplot=F, whattoplot = "web", 
                         BOX.SIZE = 0.05,
                         BOX.PROP = 0.3, # Box proportion (height: width)
                         arrowlog = F, # Keep it on the normal scale
                         arrowsizerange = c(0.1, 30)) 
# What range of line sizes do you want: c(min, max)

# ExRes 34
ExRes_34_prop <- ExRes_prop_control %>% mutate(B = ExRes_biomasses$ExRes.34)
ExRes_34_prop <- ExRes_34_prop[, c("X", "ID", "d", "a", "p", "B", "CN", 
                                   "DetritusRecycling", "isDetritus", 
                                   "isPlant", "canIMM")]
ExRes_34 <- list(imat = ExRes_imat, prop = ExRes_34_prop)

# Rescale a and p to be [0,1] instead of [0,100]
ExRes_34$prop$a = ExRes_34$prop$a/100
ExRes_34$prop$p = ExRes_34$prop$p/100
#pdf("PFC.pdf", width = 8, height = 6, bg= "white", colormodel = "cmyk") 
# This will put the plot in the working directory
ExRes_34_model <- comana(ExRes_34, mkplot=F, whattoplot = "web", 
                         BOX.SIZE = 0.05,
                         BOX.PROP = 0.3, # Box proportion (height: width)
                         arrowlog = F, # Keep it on the normal scale
                         arrowsizerange = c(0.1, 30)) 
# What range of line sizes do you want: c(min, max)

# ExRes 35
ExRes_35_prop <- ExRes_prop_control %>% mutate(B = ExRes_biomasses$ExRes.35)
ExRes_35_prop <- ExRes_35_prop[, c("X", "ID", "d", "a", "p", "B", "CN", 
                                   "DetritusRecycling", "isDetritus", 
                                   "isPlant", "canIMM")]
ExRes_35 <- list(imat = ExRes_imat, prop = ExRes_35_prop)

# Rescale a and p to be [0,1] instead of [0,100]
ExRes_35$prop$a = ExRes_35$prop$a/100
ExRes_35$prop$p = ExRes_35$prop$p/100
#pdf("PFC.pdf", width = 8, height = 6, bg= "white", colormodel = "cmyk") 
# This will put the plot in the working directory
ExRes_35_model <- comana(ExRes_35, mkplot=F, whattoplot = "web", 
                         BOX.SIZE = 0.05,
                         BOX.PROP = 0.3, # Box proportion (height: width)
                         arrowlog = F, # Keep it on the normal scale
                         arrowsizerange = c(0.1, 30)) 
# What range of line sizes do you want: c(min, max)

# ExRes 38
ExRes_38_prop <- ExRes_prop_control %>% mutate(B = ExRes_biomasses$ExRes.38)
ExRes_38_prop <- ExRes_38_prop[, c("X", "ID", "d", "a", "p", "B", "CN", 
                                   "DetritusRecycling", "isDetritus", 
                                   "isPlant", "canIMM")]
ExRes_38 <- list(imat = ExRes_imat, prop = ExRes_38_prop)

# Rescale a and p to be [0,1] instead of [0,100]
ExRes_38$prop$a = ExRes_38$prop$a/100
ExRes_38$prop$p = ExRes_38$prop$p/100
#pdf("PFC.pdf", width = 8, height = 6, bg= "white", colormodel = "cmyk") 
# This will put the plot in the working directory
ExRes_38_model <- comana(ExRes_38, mkplot=F, whattoplot = "web", 
                         BOX.SIZE = 0.05,
                         BOX.PROP = 0.3, # Box proportion (height: width)
                         arrowlog = F, # Keep it on the normal scale
                         arrowsizerange = c(0.1, 30)) 
# What range of line sizes do you want: c(min, max)

# ExRes 40
ExRes_40_prop <- ExRes_prop_control %>% mutate(B = ExRes_biomasses$ExRes.40)
ExRes_40_prop <- ExRes_40_prop[, c("X", "ID", "d", "a", "p", "B", "CN", 
                                   "DetritusRecycling", "isDetritus", 
                                   "isPlant", "canIMM")]
ExRes_40 <- list(imat = ExRes_imat, prop = ExRes_40_prop)

# Rescale a and p to be [0,1] instead of [0,100]
ExRes_40$prop$a = ExRes_40$prop$a/100
ExRes_40$prop$p = ExRes_40$prop$p/100
#pdf("PFC.pdf", width = 8, height = 6, bg= "white", colormodel = "cmyk") 
# This will put the plot in the working directory
ExRes_40_model <- comana(ExRes_40, mkplot=F, whattoplot = "web", 
                         BOX.SIZE = 0.05,
                         BOX.PROP = 0.3, # Box proportion (height: width)
                         arrowlog = F, # Keep it on the normal scale
                         arrowsizerange = c(0.1, 30)) 
# What range of line sizes do you want: c(min, max)

# ExRes 41
ExRes_41_prop <- ExRes_prop_control %>% mutate(B = ExRes_biomasses$ExRes.41)
ExRes_41_prop <- ExRes_41_prop[, c("X", "ID", "d", "a", "p", "B", "CN", 
                                   "DetritusRecycling", "isDetritus", 
                                   "isPlant", "canIMM")]
ExRes_41 <- list(imat = ExRes_imat, prop = ExRes_41_prop)

# Rescale a and p to be [0,1] instead of [0,100]
ExRes_41$prop$a = ExRes_41$prop$a/100
ExRes_41$prop$p = ExRes_41$prop$p/100
#pdf("PFC.pdf", width = 8, height = 6, bg= "white", colormodel = "cmyk") 
# This will put the plot in the working directory
ExRes_41_model <- comana(ExRes_41, mkplot=F, whattoplot = "web", 
                         BOX.SIZE = 0.05,
                         BOX.PROP = 0.3, # Box proportion (height: width)
                         arrowlog = F, # Keep it on the normal scale
                         arrowsizerange = c(0.1, 30)) 
# What range of line sizes do you want: c(min, max)

# ExRes 42
ExRes_42_prop <- ExRes_prop_control %>% mutate(B = ExRes_biomasses$ExRes.42)
ExRes_42_prop <- ExRes_42_prop[, c("X", "ID", "d", "a", "p", "B", "CN", 
                                   "DetritusRecycling", "isDetritus", 
                                   "isPlant", "canIMM")]
ExRes_42 <- list(imat = ExRes_imat, prop = ExRes_42_prop)

# Rescale a and p to be [0,1] instead of [0,100]
ExRes_42$prop$a = ExRes_42$prop$a/100
ExRes_42$prop$p = ExRes_42$prop$p/100
#pdf("PFC.pdf", width = 8, height = 6, bg= "white", colormodel = "cmyk") 
# This will put the plot in the working directory
ExRes_42_model <- comana(ExRes_42, mkplot=F, whattoplot = "web", 
                         BOX.SIZE = 0.05,
                         BOX.PROP = 0.3, # Box proportion (height: width)
                         arrowlog = F, # Keep it on the normal scale
                         arrowsizerange = c(0.1, 30)) 
# What range of line sizes do you want: c(min, max)

# ExRes 22
ExRes_22_prop <- ExRes_prop_control %>% 
  mutate("B" = ExRes_biomasses$ExRes.22)
ExRes_22_prop <- ExRes_22_prop[, c("X", "ID", "d", "a", "p", "B", "CN", 
                                   "DetritusRecycling", "isDetritus", "isPlant", 
                                   "canIMM")]
ExRes_22 <- list(imat = ExRes_imat, prop = ExRes_22_prop)

# Rescale a and p to be [0,1] instead of [0,100]
ExRes_22$prop$a = ExRes_22$prop$a/100
ExRes_22$prop$p = ExRes_22$prop$p/100
#pdf("PFC.pdf", width = 8, height = 6, bg= "white", colormodel = "cmyk") 
# This will put the plot in the working directory
ExRes_22_model <- comana(ExRes_22, mkplot=F, whattoplot = "web", 
                         BOX.SIZE = 0.05,
                         BOX.PROP = 0.3, # Box proportion (height: width)
                         arrowlog = F, # Keep it on the normal scale
                         arrowsizerange = c(0.1, 30)) 
# What range of line sizes do you want: c(min, max)

# ExRes 23
ExRes_23_prop <- ExRes_prop_control %>% 
  mutate("B" = ExRes_biomasses$ExRes.23)
ExRes_23_prop <- ExRes_23_prop[, c("X", "ID", "d", "a", "p", "B", "CN", 
                                   "DetritusRecycling", "isDetritus", "isPlant", 
                                   "canIMM")]
ExRes_23 <- list(imat = ExRes_imat, prop = ExRes_23_prop)

# Rescale a and p to be [0,1] instead of [0,100]
ExRes_23$prop$a = ExRes_23$prop$a/100
ExRes_23$prop$p = ExRes_23$prop$p/100
#pdf("PFC.pdf", width = 8, height = 6, bg= "white", colormodel = "cmyk") 
# This will put the plot in the working directory
ExRes_23_model <- comana(ExRes_23, mkplot=F, whattoplot = "web", 
                         BOX.SIZE = 0.05,
                         BOX.PROP = 0.3, # Box proportion (height: width)
                         arrowlog = F, # Keep it on the normal scale
                         arrowsizerange = c(0.1, 30)) 
# What range of line sizes do you want: c(min, max)

# ExRes 39
ExRes_39_prop <- ExRes_prop_control %>% 
  mutate("B" = ExRes_biomasses$ExRes.39)
ExRes_39_prop <- ExRes_39_prop[, c("X", "ID", "d", "a", "p", "B", "CN", 
                                   "DetritusRecycling", "isDetritus", "isPlant", 
                                   "canIMM")]
ExRes_39 <- list(imat = ExRes_imat, prop = ExRes_39_prop)

# Rescale a and p to be [0,1] instead of [0,100]
ExRes_39$prop$a = ExRes_39$prop$a/100
ExRes_39$prop$p = ExRes_39$prop$p/100
#pdf("PFC.pdf", width = 8, height = 6, bg= "white", colormodel = "cmyk") 
# This will put the plot in the working directory
ExRes_39_model <- comana(ExRes_39, mkplot=F, whattoplot = "web", 
                         BOX.SIZE = 0.05,
                         BOX.PROP = 0.3, # Box proportion (height: width)
                         arrowlog = F, # Keep it on the normal scale
                         arrowsizerange = c(0.1, 30)) 
# What range of line sizes do you want: c(min, max)

# ExRes 44
ExRes_44_prop <- ExRes_prop_control %>% 
  mutate("B" = ExRes_biomasses$ExRes.44)
ExRes_44_prop <- ExRes_44_prop[, c("X", "ID", "d", "a", "p", "B", "CN", 
                                   "DetritusRecycling", "isDetritus", "isPlant", 
                                   "canIMM")]
ExRes_44 <- list(imat = ExRes_imat, prop = ExRes_44_prop)

# Rescale a and p to be [0,1] instead of [0,100]
ExRes_44$prop$a = ExRes_44$prop$a/100
ExRes_44$prop$p = ExRes_44$prop$p/100
#pdf("PFC.pdf", width = 8, height = 6, bg= "white", colormodel = "cmyk") 
# This will put the plot in the working directory
ExRes_44_model <- comana(ExRes_44, mkplot=F, whattoplot = "web", 
                         BOX.SIZE = 0.05,
                         BOX.PROP = 0.3, # Box proportion (height: width)
                         arrowlog = F, # Keep it on the normal scale
                         arrowsizerange = c(0.1, 30)) 
# What range of line sizes do you want: c(min, max)

# ExRes 45
ExRes_45_prop <- ExRes_prop_control %>% 
  mutate("B" = ExRes_biomasses$ExRes.45)
ExRes_45_prop <- ExRes_45_prop[, c("X", "ID", "d", "a", "p", "B", "CN", 
                                   "DetritusRecycling", "isDetritus", "isPlant", 
                                   "canIMM")]
ExRes_45 <- list(imat = ExRes_imat, prop = ExRes_45_prop)

# Rescale a and p to be [0,1] instead of [0,100]
ExRes_45$prop$a = ExRes_45$prop$a/100
ExRes_45$prop$p = ExRes_45$prop$p/100
#pdf("PFC.pdf", width = 8, height = 6, bg= "white", colormodel = "cmyk") 
# This will put the plot in the working directory
ExRes_45_model <- comana(ExRes_45, mkplot=F, whattoplot = "web", 
                         BOX.SIZE = 0.05,
                         BOX.PROP = 0.3, # Box proportion (height: width)
                         arrowlog = F, # Keep it on the normal scale
                         arrowsizerange = c(0.1, 30)) 

# Step 5: Aggregate Data
# 5.1: Set up df and initialize vectors for loop outputs
names <- c("ExRes_3_model", "ExRes_5_model", "ExRes_7_model", "ExRes_8_model",
           "ExRes_11_model", "ExRes_13_model", "ExRes_16_model", 
           "ExRes_17_model", "ExRes_18_model", "ExRes_19_model", 
           "ExRes_20_model", "ExRes_21_model", "ExRes_24_model", 
           "ExRes_25_model", "ExRes_29_model", "ExRes_31_model", 
           "ExRes_33_model", "ExRes_36_model", "ExRes_37_model",
           "ExRes_43_model",
           "ExRes_1_model", "ExRes_2_model", "ExRes_4_model", "ExRes_6_model",
           "ExRes_9_model", "ExRes_10_model", "ExRes_12_model", 
           "ExRes_14_model", "ExRes_15_model", "ExRes_26_model",
           "ExRes_27_model", "ExRes_28_model", "ExRes_30_model",
           "ExRes_32_model", "ExRes_34_model", "ExRes_35_model", 
           "ExRes_38_model", "ExRes_40_model", "ExRes_41_model",
           "ExRes_42_model", "ExRes_22_model", "ExRes_23_model", 
           "ExRes_39_model", "ExRes_44_model", "ExRes_45_model"
) # subset T1 & T2 models

node_consumption_temp <- list() # initialize
node_Cmin_temp <- list()
node_Nmin_temp <- list()
total_consumption <- list()
total_Cmin <- list()
total_Nmin <- list()

# 5.2: Loop through each model to aggregate total consumption, total C min, 
# and total N min
for (i in names){ # loop to get consumption data, indexed from list as df[1]
  input <- paste(i)
  output <- get(input)
  consumption_temp <- output[1]
  consumption <- as.data.frame(consumption_temp)
  total_consumption_temp <- sum(consumption)
  Cmin_temp <- output[2]
  Cmin <- as.data.frame(Cmin_temp)
  total_Cmin_temp <- sum(Cmin)
  Nmin_temp <- output[3]
  Nmin <- as.data.frame(Nmin_temp)
  total_Nmin_temp <- sum(Nmin)
  node_consumption_temp[[i]] = consumption
  node_Cmin_temp[[i]] = as.data.frame(Cmin)
  node_Nmin_temp[[i]] = Nmin
  total_consumption[i] = as.data.frame(total_consumption_temp)
  total_Cmin[i] = as.data.frame(total_Cmin_temp)
  total_Nmin[i] = as.data.frame(total_Nmin_temp)
}

# 5.3: Tidy Data
total_consumption <- unlist(total_consumption)
total_Cmin <- unlist(total_Cmin)
total_Nmin <- unlist(total_Nmin)

Sample_ID <- c("ExRes 3", "ExRes 5", "ExRes 7", "ExRes 8",
               "ExRes 11", "ExRes 13", "ExRes 16", 
               "ExRes 17", "ExRes 18", "ExRes 19", 
               "ExRes 20", "ExRes 21", "ExRes 24", 
               "ExRes 25", "ExRes 29", "ExRes 31", 
               "ExRes 33", "ExRes 36", "ExRes 37",
               "ExRes 43",
               "ExRes 1", "ExRes 2", "ExRes 4", "ExRes 6", "ExRes 9",
               "ExRes 10", "ExRes 12", "ExRes 14", "ExRes 15", "ExRes 26",
               "ExRes 27", "ExRes 28", "ExRes 30", "ExRes 32", "ExRes 34",
               "ExRes 35", "ExRes 38", "ExRes 40", "ExRes 41", "ExRes 42",
               "ExRes 22", "ExRes 23", "ExRes 39", "ExRes 44", "ExRes 45"
) # subset T1 & T2 models

model_outputs_temp <- as.data.frame(cbind(Sample_ID, total_consumption, 
                                          total_Cmin, total_Nmin))

# Step 6: Merge with Sample Metadata  
flux_data <- merge(x = sample_metadata, y = model_outputs_temp, 
                       by = "Sample_ID") %>%
  filter(!Sample_ID == "ExRes 5")

flux_data$total_consumption <- as.numeric(flux_data$total_consumption)
flux_data$total_Cmin <- as.numeric(flux_data$total_Cmin)
flux_data$total_Nmin <- as.numeric(flux_data$total_Nmin)
flux_data$destructive_time <- as.factor(flux_data$destructive_time)
flux_data$moisture_tx <- as.factor(flux_data$moisture_tx)
flux_data$temp_tx <- as.factor(flux_data$temp_tx)

head(flux_data)
##   Sample_ID destructive_time moisture_tx temp_tx block_effect total_consumption
## 1   ExRes 1               T2        High      12          low          1175.028
## 2  ExRes 10               T2        High      20          low          1252.338
## 3  ExRes 11               T1     Ambient      20          low          1712.893
## 4  ExRes 12               T2        High      12          low          1426.833
## 5  ExRes 13               T1        High      12          low          1268.745
## 6  ExRes 14               T2        High      12          low          1132.720
##   total_Cmin total_Nmin
## 1   479.9091  -4.458801
## 2   512.1711  -5.084955
## 3   713.9978  -2.942567
## 4   583.5129  -5.781814
## 5   518.9287  -5.173846
## 6   463.1431  -4.549418


Total biomass, microfauna biomass, mesofauna biomass, total flux, total C mineralization, and N mineralization were tested for normality and homogeneity of variance using a Shapiro-Wilk test and Levene’s test, respectively. I constructed linear models from total biomass, microfauna biomass, mesofauna biomass, total flux, total C mineralization, and total N mineralization using reverse order selection to remove insignificant interaction terms (see Appendix F). I then statistically analyzed the biomasses of total microfauna, total mesofauna and total faunal between each combination of soil moisture, temperature, and destructive sampling conditions using a three-way full-factorial ANOVA with a block effect to account for any field-based differences in biomass and Tukey’s HSD post-hoc test. I similarly analyzed the output C and N flux and mineralization values of the whole soil food web model using a 3-way factorial ANOVA and Tukey’s HSD post-hoc test to examine differences between soil moisture, temperature, and destructive sampling treatment conditions. Finally, I used Pearson’s correlation test to test for correlations between soil microfauna, mesofauna, and total faunal biomasses.

Figure 2.1

The conceptualized peatland soil food web containing 15 trophic nodes (groups).
Arrows represent the flow of energy (carbon) and nutrients corresponding to trophic interactions from resources to consumers. Nodes, shown as boxes, represent distinct phylogenetic groups of soil fauna, microflora and detritus. Dashed lines represent weaker trophic interactions. Grey arrows are bacterial energy channel; black arrows are fungal energy channel.

Arrows represent the flow of energy (carbon) and nutrients corresponding to trophic interactions from resources to consumers. Nodes, shown as boxes, represent distinct phylogenetic groups of soil fauna, microflora and detritus. Dashed lines represent weaker trophic interactions. Grey arrows are bacterial energy channel; black arrows are fungal energy channel.


Chapter 3: Results

3.1 Pre-experimental Group (T0)

# Function to find decimal places
get_round_digit <- function(x) {
  if (x == 0) return(0)
  # Calculate the power of 10 of the first significant figure
  # then negate it to match R's rounding logic
  -floor(log10(abs(x)))
}

resp_T0 <- resp.data %>% filter(destructive_time == "T0")

soil_T0 <- soil_data %>% filter(destructive_time == "T0")

abundance_T0 <- abundance_data %>% filter(destructive_time == "T0")

mean_cum_resp_T0 <-
  format(round(mean(resp_T0$cum_resp), 
                 digits = get_round_digit(
                   signif(sd(resp_T0$cum_resp)/
                   sqrt(length(resp_T0$cum_resp)), digits = 1)
                 )), nsmall = 1)
se_cum_resp_T0 <- 
  signif(sd(resp_T0$cum_resp)/
                   sqrt(length(resp_T0$cum_resp)), digits = 1)

mean_soil_moisture_T0 <- 
  round(mean(soil_T0$pct_moisture), 
                 digits = get_round_digit(
                   signif(sd(soil_T0$pct_moisture)/
                    sqrt(length(soil_T0$pct_moisture)), digits = 1)
                 ))
se_soil_moisture_T0 <-
  signif(sd(soil_T0$pct_moisture)/
                    sqrt(length(soil_T0$pct_moisture)), digits = 1)

mean_pH_T0 <-
  round(mean(soil_T0$pH), 
                  digits = get_round_digit(
                    signif(sd(soil_T0$pH)/
                    sqrt(length(soil_T0$pH)), digits = 1)
                  ))
se_pH_T0 <-
  signif(sd(soil_T0$pH)/
                    sqrt(length(soil_T0$pH)), digits = 1)

mean_CN_T0 <- 
  round(mean(soil_T0$C_N_ratio), 
                 digits = get_round_digit(
                   signif(sd(soil_T0$C_N_ratio)/
                    sqrt(length(soil_T0$C_N_ratio)), digits = 1)
                 ))
se_CN_T0 <- 
  signif(sd(soil_T0$C_N_ratio)/
                    sqrt(length(soil_T0$C_N_ratio)), digits = 1)

mean_phenox_T0 <- 
  round(mean(soil_T0$Phenox), 
                 digits = get_round_digit(
                   signif(sd(soil_T0$Phenox)/
                    sqrt(length(soil_T0$Phenox)), digits = 1)
                 ))
se_phenox_T0 <- 
  signif(sd(soil_T0$Phenox)/
           sqrt(length(soil_T0$Phenox)), digits = 1)

mean_perox_T0 <- 
  round(mean(soil_T0$Perox), 
                 digits = get_round_digit(
                   signif(sd(soil_T0$Perox)/
                    sqrt(length(soil_T0$Perox)), digits = 1)
                 ))
se_perox_T0 <- 
  signif(sd(soil_T0$Perox)/
           sqrt(length(soil_T0$Perox)), digits = 1)

mean_total_abundance_T0 <- 
  comma(round(mean(abundance_T0$total_ab_standardized), 
           digits = get_round_digit(
              signif(sd(abundance_T0$total_ab_standardized)/
                    sqrt(length(abundance_T0$total_ab_standardized)), 
                  digits = 1) 
           )))
se_total_abundance_T0 <-
  comma(signif(sd(abundance_T0$total_ab_standardized)/
              sqrt(length(abundance_T0$total_ab_standardized)), 
            digits = 1))
  
mean_mico_abundance_T0 <-
  comma(round(mean(abundance_T0$total_micro_ab_standardized), 
           digits = get_round_digit(
             signif(sd(abundance_T0$total_micro_ab_standardized)/
                    sqrt(length(abundance_T0$total_micro_ab_standardized)), 
                  digits = 1)
           )))
se_micro_abundance_T0 <-
  comma(signif(sd(abundance_T0$total_micro_ab_standardized)/
           sqrt(length(abundance_T0$total_micro_ab_standardized)), 
         digits = 1))

mean_meso_abundance_T0 <- 
  comma(round(mean(abundance_T0$total_meso_ab_standardized), 
           digits = get_round_digit(
             signif(sd(abundance_T0$total_meso_ab_standardized)/
                    sqrt(length(abundance_T0$total_meso_ab_standardized)), 
                  digits = 1)
           )))
se_meso_abundance_T0 <-
  comma(signif(sd(abundance_T0$total_meso_ab_standardized)/
           sqrt(length(abundance_T0$total_meso_ab_standardized)), 
         digits = 1))


Five experimental mesocosms were destructively sampled following a three-week recovery period but prior to deployment of the experimental treatments (T0). The following conditions were recorded for these five control mesocosms and were assumed to be representative of field values. The mean heterotrophic respiration (± SE) prior to implementing experimental soil moisture and temperature conditions at T0 was 7.0 ± 0.1 ln(g of C per m2 per year), which equates to ~1,200 ± 200 g of C per m2 per year. The mean soil moisture (± SE) was 800 ± 50% based on a dry weight gravimetric measurement, while the average soil pH (± SE) was 4.08 ± 0.05. Mean C:N ratio (± SE) was 37 ± 2, while mean microbial enzymatic activity (± SE) was 160 ± 20 μmol substrate per g soil per hour for phenol oxidase and 154 ± 8 μmol substrate per g soil per hour for peroxidase concentration. The mean total microfauna, mesofauna, and total fauna abundances (± SE) were: 170,000 (± 40,000), 360,000 (± 40,000), and 540,000 (± 50,000) individuals per m2, respectively.

Supplemental Table 3.1

Summary table of mean (± SE) heterotrophic respiration, soil moisture, pH, C:N ratio, phenol oxidase concentration, peroxidase concentration, total microfauna abundance, total mesofauna abundance, and total fauna abundance prior to deployment of the experimental treatments (T0). Units for each parameter are displayed in the table.

T0_df1 <- as.data.frame(matrix(data = c(
  "Heterotrophic Respiration", 
  paste0(mean_cum_resp_T0, " &plusmn; ", se_cum_resp_T0),
  "ln(g of C / m^2^ / year)",
  
  "Soil Moisture",
  paste0(mean_soil_moisture_T0, " &plusmn; ", se_soil_moisture_T0),
  "%",
  
  "pH",
  paste0(mean_pH_T0, " &plusmn; ", se_pH_T0),
  "Unitless",
  
  "C:N Ratio",  
  paste0(mean_CN_T0, " &plusmn; ", se_CN_T0),
  "Unitless",
  
  "Phenol Oxidase Concentration",
  paste0(mean_phenox_T0, " &plusmn; ", se_phenox_T0),
  "&mu;mol substrate / g soil / hour",
  
  "Peroxidase Concentration",
  paste0(mean_perox_T0, " &plusmn; ", se_perox_T0),
  " &mu;mol substrate / g soil / hour",
  
  "Total Microfauna Abundance",
  paste0(mean_mico_abundance_T0, " &plusmn; ", se_micro_abundance_T0),
  "individuals per m^2^",
  
  "Total Mesofauna Abundance",
  paste0(mean_meso_abundance_T0, " &plusmn; ", se_meso_abundance_T0),
  "individuals per m^2^",
  
  "Total Fauna Abundance",
  paste0(mean_total_abundance_T0, " &plusmn; ", se_total_abundance_T0),
           "individuals per m^2^"
  ), ncol = 3, byrow = T))

colnames(T0_df1) <- c("Measurement", "Mean &plusmn; SE", "Unit")

T0_df1 %>%
  kable(escape = FALSE, align = "c", linesep = "") %>%
  kable_styling(full_width = TRUE, position = "center") %>%
  row_spec(0, bold = TRUE) %>%
  row_spec(1:nrow(T0_df1), extra_css = "line-height: 1;")
Measurement Mean ± SE Unit
Heterotrophic Respiration 7.0 ± 0.1 ln(g of C / m2 / year)
Soil Moisture 800 ± 50 %
pH 4.08 ± 0.05 Unitless
C:N Ratio 37 ± 2 Unitless
Phenol Oxidase Concentration 160 ± 20 μmol substrate / g soil / hour
Peroxidase Concentration 154 ± 8 μmol substrate / g soil / hour
Total Microfauna Abundance 170,000 ± 40,000 individuals per m2
Total Mesofauna Abundance 360,000 ± 40,000 individuals per m2
Total Fauna Abundance 540,000 ± 50,000 individuals per m2


biomass_T0 <- biomass_data %>% filter(destructive_time == "T0")

flux_T0 <- flux_data %>% filter(destructive_time == "T0")

mean_micro_biomass_T0 <-
  round(mean(biomass_T0$micro_biomass), 
                 digits = get_round_digit(
                   signif(sd(biomass_T0$micro_biomass)/
                   sqrt(length(biomass_T0$micro_biomass)), digits = 1)
                 ))
se_micro_biomass_T0 <- 
  signif(sd(biomass_T0$micro_biomass)/
                   sqrt(length(biomass_T0$micro_biomass)), digits = 1)

mean_meso_biomass_T0 <-
  round(mean(biomass_T0$meso_biomass), 
                 digits = get_round_digit(
                   signif(sd(biomass_T0$meso_biomass)/
                   sqrt(length(biomass_T0$meso_biomass)), digits = 1)
                 ))
se_meso_bioamss_T0 <-
  signif(sd(biomass_T0$meso_biomass)/
                   sqrt(length(biomass_T0$meso_biomass)), digits = 1)

mean_total_biomass_T0 <- 
  round(mean(biomass_T0$total_biomass), 
                 digits = get_round_digit(
                   signif(sd(biomass_T0$total_biomass)/
                   sqrt(length(biomass_T0$total_biomass)), digits = 1)
                 ))
se_total_biomass_T0 <- 
  signif(sd(biomass_T0$total_biomass)/
                   sqrt(length(biomass_T0$total_biomass)), digits = 1)

mean_total_consumption_T0 <- 
  comma(round(mean(flux_T0$total_consumption), 
                 digits = get_round_digit(
                   signif(sd(flux_T0$total_consumption)/
                   sqrt(length(flux_T0$total_consumption)), digits = 1)
                 )))
se_total_consumption_T0 <- 
  signif(sd(flux_T0$total_consumption)/
                   sqrt(length(flux_T0$total_consumption)), digits = 1)

mean_total_Cmin_T0 <-
  round(mean(flux_T0$total_Cmin), 
                 digits = get_round_digit(
                   signif(sd(flux_T0$total_Cmin)/
                   sqrt(length(flux_T0$total_Cmin)), digits = 1)
                 ))
se_total_Cmin_T0 <-
  signif(sd(flux_T0$total_Cmin)/
                   sqrt(length(flux_T0$total_Cmin)), digits = 1)

mean_total_Nmin_T0 <-
  format(round(mean(flux_T0$total_Nmin), 
                 digits = get_round_digit(
                   signif(sd(flux_T0$total_Nmin)/
                   sqrt(length(flux_T0$total_Nmin)), digits = 1)
                 )), nsmall = 1)
se_total_Nmin_T0 <-
  signif(sd(flux_T0$total_Nmin)/
                   sqrt(length(flux_T0$total_Nmin)), digits = 1)


Converting faunal abundance to biomass estimates, I calculated mean microfauna, mesofauna and total fauna biomass (± SE) as 0.009 (± 0.002), 0.73 (± 0.08), and 0.74 (± 0.08) g of C per m2, respectively. Mean total consumptive flux (± SE) based on the energetic model was 1,340 ± 30 g of C per m2 per year, while the mean total C mineralization (± SE) was 550 ± 10 g of C per m2 per year, and the mean total N mineralization (± SE) was -5.0 ± 0.1 g of N per m2 per year. Mean values are presented in Appendix D.

Supplemental Table 3.2

Summary table of mean (± SE) microfauna biomass, mesofauna biomass, total biomass, total consumption, total C mineralization, and total N mineralization prior to deployment of the experimental treatments (T0). Units for each parameter are displayed in the table.

T0_df2 <- as.data.frame(matrix(data = c(
  "Microfauna Biomass", 
  paste0(mean_micro_biomass_T0, " &plusmn; ", se_micro_biomass_T0),
  "g of C / m^2^",
  
  "Mesofauna Biomass", 
  paste0(mean_meso_biomass_T0, " &plusmn; ", se_meso_bioamss_T0),
  "g of C / m^2^",
  
  "Total Biomass",
  paste0(mean_total_biomass_T0, " &plusmn; ", se_total_biomass_T0),
  "g of C / m^2^",
  
  "Total Consumption",
  paste0(mean_total_consumption_T0, " &plusmn; ", se_total_consumption_T0),
  "g of C / m^2^ / year",
  
  "Total C Mineralization",
  paste0(mean_total_Cmin_T0, " &plusmn; ", se_total_Cmin_T0),
  "g of C / m^2^ / year",
  
  "Total N Mineralization",
  paste0(mean_total_Nmin_T0, " &plusmn; ", se_total_Nmin_T0),
  "g of C / m^2^ / year"
), ncol = 3, byrow = T))

colnames(T0_df2) <- c("Measurement", "Mean &plusmn; SE", "Unit")

T0_df2 %>%
  kable(escape = FALSE, align = "c", linesep = "") %>%
  kable_styling(full_width = TRUE, position = "center") %>%
  row_spec(0, bold = TRUE) %>%
  row_spec(1:nrow(T0_df2), extra_css = "line-height: 1;")
Measurement Mean ± SE Unit
Microfauna Biomass 0.009 ± 0.002 g of C / m2
Mesofauna Biomass 0.73 ± 0.08 g of C / m2
Total Biomass 0.74 ± 0.08 g of C / m2
Total Consumption 1,340 ± 30 g of C / m2 / year
Total C Mineralization 550 ± 10 g of C / m2 / year
Total N Mineralization -5.0 ± 0.1 g of C / m2 / year



3.2 Soil Heterotrophic Respiration

Figure 3.1

resp_T1uT2 <- resp.data %>% filter(!destructive_time=="T0")

resp_T1uT2$destructive_time <- 
  as.factor(resp_T1uT2$destructive_time)
resp_T1uT2$block_effect <- 
  as.factor(resp_T1uT2$block_effect)
resp_T1uT2$temp_tx <- 
  as.factor(resp_T1uT2$temp_tx)
resp_T1uT2$moisture_tx <- 
  as.factor(resp_T1uT2$moisture_tx)

resp_T1uT2$tx <- interaction(resp_T1uT2$temp_tx, resp_T1uT2$moisture_tx) 

resp_T1uT2 <- resp_T1uT2 %>%
  mutate(tx = fct_recode(tx,
    "12 \u00B0C Field-Moist" = "12.Ambient",
    "20 \u00B0C Field-Moist" = "20.Ambient",
    "12 \u00B0C Saturated"   = "12.High",
    "20 \u00B0C Saturated"   = "20.High"
  ))

resp_plot <- ggplot(resp_T1uT2, 
       aes(x=tx, 
           y=cum_resp, fill = as.factor(destructive_time))) + 
  geom_boxplot(outlier.shape=NA) + #avoid plotting outliers twice
  geom_jitter(aes(pch = as.factor(destructive_time)), 
              position=position_jitter(width=.1, height=0), size = 3) +
  theme(panel.grid.major = element_blank(), 
        panel.grid.minor = element_blank(),
        panel.background = element_blank(), 
        axis.line = element_line(colour = "black")) +
  scale_fill_brewer(palette = "Greys") +
  xlab("Environmental Treatment Condition") + 
  ylab(expression("Heterotrophic Respiration(ln(g C / m"^2*" / year)")) +
  labs(fill = "Sampling Time", pch = "Sampling Time")

resp_plot
<em>Boxplots
of mean heterotrophic soil respiration (ln transformed). Measurements
were taken during the three-week experimental climate disturbance
scenarios (T<sub>1</sub>) under each combination of temperature (12 °C,
20 °C) and soil moisture (field-moist, saturated) treatments, and during
the following three-week recovery period (T<sub>2</sub>) when mesocosms
were returned to in field conditions (12 °C, field-moist).</em>”
width=“100%” />
<p class= Boxplots of mean heterotrophic soil respiration (ln transformed). Measurements were taken during the three-week experimental climate disturbance scenarios (T1) under each combination of temperature (12 °C, 20 °C) and soil moisture (field-moist, saturated) treatments, and during the following three-week recovery period (T2) when mesocosms were returned to in field conditions (12 °C, field-moist).


resp_T1uT2 <- resp.data %>% filter(!destructive_time=="T0")

resp_T1uT2$destructive_time <- 
  as.factor(resp_T1uT2$destructive_time)
resp_T1uT2$block_effect <- 
  as.factor(resp_T1uT2$block_effect)
resp_T1uT2$temp_tx <- 
  as.factor(resp_T1uT2$temp_tx)
resp_T1uT2$moisture_tx <- 
  as.factor(resp_T1uT2$moisture_tx)

resp_lm <- lm(cum_resp ~ block_effect + 
                (temp_tx * moisture_tx * destructive_time), 
              data = resp_T1uT2)

resp_lm2_temp <- lm(cum_resp ~
                    moisture_tx * temp_tx * destructive_time + 
                    moisture_tx * temp_tx +
                    moisture_tx * destructive_time + 
                    temp_tx * destructive_time +
                    moisture_tx +
                    temp_tx +
                    destructive_time +
                    block_effect,
                  data = resp_T1uT2)

resp_lm2 <- lm(cum_resp ~
                moisture_tx +
                temp_tx +
                destructive_time +
                block_effect,
            data = resp_T1uT2)

resp_shapiro_W <- round(shapiro_test(residuals(resp_lm2))$statistic, 3)
resp_shapiro_p <- round(shapiro_test(residuals(resp_lm2))$p.value, 3)

resp_levene_F <- 
  round(levene_test(cum_resp ~ (moisture_tx * temp_tx * destructive_time), 
              data = resp_T1uT2)$statistic, 3)
resp_levene_df1 <- 
  levene_test(cum_resp ~ (moisture_tx * temp_tx * destructive_time), 
              data = resp_T1uT2)$df1

resp_levene_df2 <- 
  levene_test(cum_resp ~ (moisture_tx * temp_tx * destructive_time), 
              data = resp_T1uT2)$df2
resp_levene_p <- 
  round(levene_test(cum_resp ~ (moisture_tx * temp_tx * destructive_time), 
              data = resp_T1uT2)$p, 3)

resp_aov <- 
  Anova(resp_lm, type = 'III')

resp_aov2 <- 
  Anova(resp_lm2, type = 'III')

resp_aov_residuals_df <- resp_aov2["Residuals", "Df"]

resp_aov_soil_moisture_F <-
  format(round(resp_aov2["moisture_tx", "F value"], 3), 
                       nsmall = 3)
resp_aov_soil_moisture_df <- 
  resp_aov2["moisture_tx", "Df"]
resp_aov_soil_moisture_p <- 
  as.numeric(format(round(resp_aov2["moisture_tx", "Pr(>F)"], 3), 
                       nsmall = 3))


resp_aov_temp_F <-
  format(round(resp_aov2["temp_tx", "F value"], 3), 
                       nsmall = 3)
resp_aov_temp_df <- 
  resp_aov2["temp_tx", "Df"]
resp_aov_temp_p <- 
  as.numeric(format(round(resp_aov2["temp_tx", "Pr(>F)"], 3), 
                       nsmall = 3))

resp_aov_destructive_F <-
  as.numeric(format(round(resp_aov2["destructive_time", "F value"], 3), 
                       nsmall = 3))
resp_aov_destructive_df <- 
  resp_aov2["destructive_time", "Df"]
resp_aov_destructive_p <- 
  as.numeric(format(round(resp_aov2["destructive_time", "Pr(>F)"], 3), 
                       nsmall = 3))

resp_aov_block_effect_F <-
  format(round(resp_aov2["block_effect", "F value"], 3), 
                       nsmall = 3)
resp_aov_block_effect_df <- 
  resp_aov2["block_effect", "Df"]
resp_aov_block_effect_p <- 
  as.numeric(format(round(resp_aov2["block_effect", "Pr(>F)"], 3), 
                       nsmall = 3))


Heterotrophic respiration was transformed on natural log, (ln) scale to conform to the assumption of normality. Log-transformed soil heterotrophic respiration satisfied the assumptions of normality and homodescacity, as per a Shapiro-Wilk (W = 0.983, p = 0.794) and Levene’s test (F7,31 = 0.519, p = 0.813). Log-transformed heterotrophic respiration, estimated for each mesocosm (Figure 3.1), was not significantly affected by soil moisture (F1,34 = 1.777, p = 0.191), nor temperature (F1,34 = 2.848, p = 0.101); heterotrophic respiration tended to be greater in mesocosms assigned to 20 °C vs. 12 °C. Neither destructive sampling time (F1,34 = 0.004, p = 0.950) nor block effects (F1,34 = 0.216, p = 0.645) used to account for differences in field sampling location significantly affected log-transformed respiration. There were no significant interaction effects between soil moisture, temperature, and destructive sampling time (Appendix E). Mean soil heterotrophic respiration (± SE) under each treatment is presented in Appendix D. Estimates of effect size based on a linear model are given in Appendix F.

Supplemental Table 3.3

Shapiro-Wilk and Levene’s Tests constructed to test whether log-transformed heterotrophic soil respiration met the assumptions of normality and homodescacity, respectively.

sub_digits <- function(x) {
  subs <- c("₀","₁","₂","₃","₄","₅","₆","₇","₈","₉")
  digits <- strsplit(as.character(x), "")[[1]]
  paste0(subs[as.integer(digits) + 1], collapse = "")
}

resp_assumptions <- as.data.frame(matrix(data = c(
  "Shapiro-Wilk Test", 
  paste0("W = ", resp_shapiro_W),
  paste0("p ", ifelse(resp_shapiro_p < 0.001,
                        "&lt; 0.001",
                        paste0("= ", format(
                          round(resp_shapiro_p, 3), 
                          nsmall = 3)))),
  "Levene's Test",
  paste0("F", sub_digits(resp_levene_df1), "\u02CC", 
         sub_digits(resp_levene_df2), " = ", resp_levene_F),
  paste0("p ", ifelse(resp_levene_p < 0.001,
                        "&lt; 0.001",
                        paste0("= ", format(
                          round(resp_levene_p, 3), 
                          nsmall = 3))))
), ncol = 3, byrow = T))

colnames(resp_assumptions) <- c("Test", "Statistic", "P-Value")

resp_assumptions %>%
  kable(escape = FALSE, align = "c", linesep = "") %>%
  kable_styling(full_width = TRUE, position = "center") %>%
  row_spec(0, bold = TRUE) %>%
  row_spec(1:nrow(resp_assumptions), extra_css = "line-height: 1;")
Test Statistic P-Value
Shapiro-Wilk Test W = 0.983 p = 0.794
Levene’s Test F₇ˌ₃₁ = 0.519 p = 0.813


Supplemental Table 3.4

ANOVA results for log-transformed heterotrophic soil respiration across experimental treatments temperature (12 °C, 20 °C), soil moisture (field-moist, saturated) and destructively sampling (T1: after three-weeks, T2: following three-week recovery period) treatments.

resp_aov_tbl <- as.data.frame(matrix(data = c(

  "Soil Moisture Treatment",
  paste0("F", sub_digits(resp_aov_soil_moisture_df),
         "\u02CC", sub_digits(resp_aov_residuals_df),
         " = ", resp_aov_soil_moisture_F),
  paste0("p ", ifelse(resp_aov_soil_moisture_p < 0.001,
                        "&lt; 0.001",
                        paste0("= ", format(
                          round(resp_aov_soil_moisture_p, 3), 
                          nsmall = 3)))),

  "Temperature Treatment",
  paste0("F", sub_digits(resp_aov_temp_df),
         "\u02CC", sub_digits(resp_aov_residuals_df),
         " = ", resp_aov_temp_F),
  paste0("p ", ifelse(resp_aov_temp_p < 0.001,
                        "&lt; 0.001",
                        paste0("= ", format(
                          round(resp_aov_temp_p, 3), 
                          nsmall = 3)))),

  "Destructive Sampling Treatment",
  paste0("F", sub_digits(resp_aov_destructive_df),
         "\u02CC", sub_digits(resp_aov_residuals_df),
         " = ", resp_aov_destructive_F),
  paste0("p ", ifelse(resp_aov_destructive_p < 0.001,
                        "&lt; 0.001",
                        paste0("= ", format(
                          round(resp_aov_destructive_p, 3), 
                          nsmall = 3)))),

  "Block Effect",
  paste0("F", sub_digits(resp_aov_block_effect_df),
         "\u02CC", sub_digits(resp_aov_residuals_df),
         " = ", resp_aov_block_effect_F),
  paste0("p ", ifelse(resp_aov_block_effect_p < 0.001,
                        "&lt; 0.001",
                        paste0("= ", format(
                          round(resp_aov_block_effect_p, 3), 
                          nsmall = 3))))

), ncol = 3, byrow = TRUE))

colnames(resp_aov_tbl) <- c("Parameter", "Statistic", "P-Value")

resp_aov_tbl %>%
  kable(escape = FALSE, align = "c", linesep = "") %>%
  kable_styling(full_width = TRUE, position = "center") %>%
  row_spec(0, bold = TRUE) %>%
  row_spec(1:nrow(resp_aov_tbl), extra_css = "line-height: 1;")
Parameter Statistic P-Value
Soil Moisture Treatment F₁ˌ₃₄ = 1.777 p = 0.191
Temperature Treatment F₁ˌ₃₄ = 2.848 p = 0.101
Destructive Sampling Treatment F₁ˌ₃₄ = 0.004 p = 0.950
Block Effect F₁ˌ₃₄ = 0.216 p = 0.645



3.3 Physical Soil Properties

Figure 3.2

soil_T1uT2 <- soil_data %>% filter(!destructive_time == "T0") 

soil_T1uT2$pH[soil_T1uT2$Sample_ID == "ExRes 17"] <- NA # positive outlier
soil_T1uT2$pct_moisture[soil_T1uT2$Sample_ID == "ExRes 17"] <- NA # positive outlier
soil_T1uT2$pH[soil_T1uT2$Sample_ID == "ExRes 25"] <- NA # negative outlier
soil_T1uT2$pct_moisture[soil_T1uT2$Sample_ID == "ExRes 25"] <- NA # negative outlier

soil_T1uT2$tx <- interaction(soil_T1uT2$temp_tx, soil_T1uT2$moisture_tx) 

soil_T1uT2 <- soil_T1uT2 %>%
  mutate(tx = fct_recode(tx,
    "12 \u00B0C Field-Moist" = "12.Ambient",
    "20 \u00B0C Field-Moist" = "20.Ambient",
    "12 \u00B0C Saturated"   = "12.High",
    "20 \u00B0C Saturated"   = "20.High"
  ))

soil_moisture_plot <- 
  ggplot(soil_T1uT2, 
         aes(x=tx, 
             y=pct_moisture, fill = as.factor(destructive_time))) + 
  geom_boxplot(outlier.shape=NA) + #avoid plotting outliers twice
  geom_jitter(aes(pch = as.factor(destructive_time)), 
              position=position_jitter(width=.1, height=0), size = 3) +
  theme(panel.grid.major = element_blank(), 
        panel.grid.minor = element_blank(),
        panel.background = element_blank(), 
        axis.line = element_line(colour = "black")) +
  scale_fill_brewer(palette = "Greys") +
  xlab("Environmental Treatment Condition") + 
  ylab(expression("Soil Moisture (%)")) +
  labs(fill = "Sampling Time", pch = "Sampling Time")

pH_plot <- ggplot(soil_T1uT2, aes(x=tx, 
                                          y=pH, 
                                          fill = as.factor(destructive_time))) + 
  geom_boxplot(outlier.shape=NA) + #avoid plotting outliers twice
  geom_jitter(aes(pch = as.factor(destructive_time)), 
              position=position_jitter(width=.1, height=0), size = 3) +
  theme(panel.grid.major = element_blank(), 
        panel.grid.minor = element_blank(),
        panel.background = element_blank(), 
        axis.line = element_line(colour = "black")) +
  scale_fill_brewer(palette = "Greys") +
  xlab("Environmental Treatment Condition") + 
  ylab(expression("Soil pH")) +
  labs(fill = "Sampling Time", pch = "Sampling Time")


CN_plot <- 
  ggplot(soil_T1uT2, 
         aes(x=tx, 
             y=C_N_ratio, fill = as.factor(destructive_time))) + 
  geom_boxplot(outlier.shape=NA) + #avoid plotting outliers twice
  geom_jitter(aes(pch = as.factor(destructive_time)), 
              position=position_jitter(width=.1, height=0), size = 3) +
  theme(panel.grid.major = element_blank(), 
        panel.grid.minor = element_blank(),
        panel.background = element_blank(), 
        axis.line = element_line(colour = "black")) + 
  scale_fill_brewer(palette = "Greys") +
  xlab("Environmental Treatment Condition") + 
  ylab(expression("Soil C:N Ratio")) +
  labs(fill = "Sampling Time", pch = "Sampling Time")

place_tag <- function(g, label = "A", x_left = 0.58, y_top = Inf,
                      size = 4, face = "bold", left_margin = 28) {
  g +
    annotate("text",
             x = x_left, y = y_top, label = label,
             hjust = 0, vjust = 1, fontface = face, size = size) +
    coord_cartesian(clip = "off") +
    theme(plot.margin = margin(5, 6, 5, left_margin))
}

g1 <- place_tag(soil_moisture_plot, "A", x_left = 0.58)
g2 <- place_tag(pH_plot,            "B", x_left = 0.58)
g3 <- place_tag(CN_plot,            "C", x_left = 0.58)

(g1 / g2 / g3) +
  plot_layout(ncol = 1, guides = "collect") &
  theme(legend.position = "bottom")
<em>Soil
moisture (A), pH (B), and C:N ratio (C). Mesocosms were measured across
experimental treatments of temperature (12 °C, 20 °C) and soil moisture
(field-moist, saturated) destructively sampled after three-weeks
(T<sub>1</sub>) or following three-week recovery period (T<sub>2</sub>).
Letters denote significant differences between groups, as per Tukey’s
HSD test.</em>” width=“100%” />
<p class= Soil moisture (A), pH (B), and C:N ratio (C). Mesocosms were measured across experimental treatments of temperature (12 °C, 20 °C) and soil moisture (field-moist, saturated) destructively sampled after three-weeks (T1) or following three-week recovery period (T2). Letters denote significant differences between groups, as per Tukey’s HSD test.


soil_T1uT2$pH[soil_T1uT2$Sample_ID == "ExRes 17"] <- NA # positive outlier
soil_T1uT2$pct_moisture[soil_T1uT2$Sample_ID == "ExRes 17"] <- NA # positive outlier
soil_T1uT2$pH[soil_T1uT2$Sample_ID == "ExRes 25"] <- NA # negative outlier
soil_T1uT2$pct_moisture[soil_T1uT2$Sample_ID == "ExRes 25"] <- NA # negative outlier

soil_moisture_lm <- lm(log(pct_moisture) ~ (moisture_tx * temp_tx * destructive_time) + block_effect, 
                       data = soil_T1uT2)

soil_moisture_lm2_temp <- lm(log(pct_moisture) ~
                              moisture_tx * temp_tx * destructive_time + 
                              moisture_tx * temp_tx +
                              moisture_tx * destructive_time + 
                              temp_tx * destructive_time +
                              moisture_tx +
                              temp_tx +
                              destructive_time +
                              block_effect,
                          data = soil_T1uT2)

soil_moisture_lm2 <- lm(log(pct_moisture) ~
                          moisture_tx +
                          temp_tx +
                          destructive_time +
                          block_effect,
                     data = soil_T1uT2)


pH_lm <- lm(log(pH) ~ (moisture_tx * temp_tx * destructive_time) + block_effect, 
            data = soil_T1uT2)

pH_lm2_temp <- lm(log(pH) ~ moisture_tx * temp_tx * destructive_time + 
                  moisture_tx * temp_tx +
                  moisture_tx * destructive_time + 
                  temp_tx * destructive_time +
                  moisture_tx +
                  temp_tx +
                  destructive_time +
                  block_effect,
                data = soil_T1uT2)

pH_lm2 <- lm(log(pH) ~ moisture_tx +
                  temp_tx +
                  destructive_time +
                  block_effect,
            data = soil_T1uT2)

CN_lm <- lm(C_N_ratio ~ (moisture_tx * temp_tx * destructive_time) + block_effect, 
            data = soil_T1uT2)

CN_lm2_temp <- lm(C_N_ratio ~
                    moisture_tx * temp_tx * destructive_time + 
                    moisture_tx * temp_tx +
                    moisture_tx * destructive_time + 
                    temp_tx * destructive_time +
                    moisture_tx +
                    temp_tx +
                    destructive_time +
                    block_effect,
               data = soil_T1uT2)

CN_lm2 <- lm(C_N_ratio ~
              moisture_tx +
              temp_tx +
              destructive_time +
              block_effect,
          data = soil_T1uT2)

soil_moisture_shapiro_W <- 
  round(shapiro_test(residuals(soil_moisture_lm2))$statistic, 3)
soil_moisture_shapiro_p <- 
  round(shapiro_test(residuals(soil_moisture_lm2))$p.value, 3)

soil_moisture_levene_df1 <- 
  levene_test(log(pct_moisture) ~ (moisture_tx * temp_tx * destructive_time), 
              data = soil_T1uT2)$df1
soil_moisture_levene_df2 <- 
  levene_test(log(pct_moisture) ~ (moisture_tx * temp_tx * destructive_time), 
              data = soil_T1uT2)$df2
soil_moisture_levene_F <- 
  round(levene_test(log(pct_moisture) ~ (moisture_tx * temp_tx * destructive_time), 
              data = soil_T1uT2)$statistic, 3)
soil_moisture_levene_p <-
  round(levene_test(log(pct_moisture) ~ (moisture_tx * temp_tx * destructive_time), 
              data = soil_T1uT2)$p, 3)

pH_shapiro_W <- round(shapiro_test(residuals(pH_lm2))$statistic, 3)
pH_shapiro_p <- round(shapiro_test(residuals(pH_lm2))$p.value, 3)

pH_levene_df1 <- 
  levene_test(log(pH) ~ (moisture_tx * temp_tx * destructive_time), 
              data = soil_T1uT2)$df1
pH_levene_df2 <- 
  levene_test(log(pH) ~ (moisture_tx * temp_tx * destructive_time), 
              data = soil_T1uT2)$df2
pH_levene_F <-
  round(levene_test(log(pH) ~ (moisture_tx * temp_tx * destructive_time), 
              data = soil_T1uT2)$statistic, 3)
pH_levene_p <-
  round(levene_test(log(pH) ~ (moisture_tx * temp_tx * destructive_time), 
              data = soil_T1uT2)$p, 3)

CN_shapiro_W <- round(shapiro_test(residuals(CN_lm2))$statistic, 3)
CN_shapiro_p <- round(shapiro_test(residuals(CN_lm2))$p.value, 3)

CN_levene_df1 <- 
  levene_test(C_N_ratio ~ (moisture_tx * temp_tx * destructive_time), 
              data = soil_T1uT2)$df1
CN_levene_df2 <-
  levene_test(C_N_ratio ~ (moisture_tx * temp_tx * destructive_time), 
              data = soil_T1uT2)$df2
CN_levene_F <-
  round(levene_test(C_N_ratio ~ (moisture_tx * temp_tx * destructive_time), 
              data = soil_T1uT2)$statistic, 3)
CN_levene_p <- 
  round(levene_test(C_N_ratio ~ (moisture_tx * temp_tx * destructive_time), 
              data = soil_T1uT2)$p, 3)


Soil moisture and pH were transformed on natural log, (ln) scale to conform to the assumption of normality. Soil moisture and pH were measured across 37 experimental mesocosms; in addition to sample ExRes 5, one large positive outlier (point estimates: 7.10 ln(%), 1.55 ln(pH)) and one large negative outlier (point estimates: 6.34 ln(%), 1.28 ln(pH)) were removed to help conform to the assumptions of normality. Soil C:N ratio was compared across 36 mesocosms, as three samples could not be processed due to the mass and packing of the sample and size limitations of the CNSH autosampler. Log-transformed soil moisture (Shapiro-Wilk’s test: W = 0.951, p = 0.102; Levene’s test: F7,29 = 0.096), log-transformed pH (Shapiro-Wilk’s test: W = 0.976, p = 0.596; Levene’s test: F7,29 = 0.929, p = 0.499), and C:N ratio (Shapiro-Wilk’s test: W = 0.985, p = 0.897; Levene’s test: F7,28 = 1.087, p = 0.398) each satisfied the assumptions of normality and homogeneity of variance.

Supplemental Table 3.5

Shapiro-Wilk and Levene’s Tests constructed to test whether log-transformed soil moisture, log-transformed pH, and C:N ratio conform to the assumptions of normality and homodescacity.

soil_df1 <- as.data.frame(matrix(data = c(
  "Soil Moisture",
  "Shapiro-Wilk Test", 
  paste0("W= ", soil_moisture_shapiro_W),
  paste0("p ", ifelse(soil_moisture_shapiro_p < 0.001,
                        "&lt; 0.001",
                        paste0("= ", format(
                          round(soil_moisture_shapiro_p, 3), 
                          nsmall = 3)))),
  "Soil Moisture",
  "Levene's Test",
  paste0("F", sub_digits(soil_moisture_levene_df1), "\u02CC", 
         sub_digits(soil_moisture_levene_df2), " = ", soil_moisture_levene_F),
  paste0("p ", ifelse(soil_moisture_levene_p < 0.001,
                        "&lt; 0.001",
                        paste0("= ", format(
                          round(soil_moisture_levene_p, 3), 
                          nsmall = 3)))),
  "Soil pH",
  "Shapiro-Wilk Test", 
  paste0("W= ", pH_shapiro_W),
  paste0("p ", ifelse(pH_shapiro_p < 0.001,
                        "&lt; 0.001",
                        paste0("= ", format(
                          round(pH_shapiro_p, 3), 
                          nsmall = 3)))),
  "Soil pH",
  "Levene's Test",
  paste0("F", sub_digits(pH_levene_df1), "\u02CC", 
         sub_digits(pH_levene_df2), " = ", pH_levene_F),
  paste0("p ", ifelse(pH_levene_p < 0.001,
                        "&lt; 0.001",
                        paste0("= ", format(
                          round(pH_levene_p, 3), 
                          nsmall = 3)))),
  "Soil C:N Ratio",
  "Shapiro-Wilk Test", 
  paste0("W= ", CN_shapiro_W),
  paste0("p ", ifelse(CN_shapiro_p < 0.001,
                        "&lt; 0.001",
                        paste0("= ", format(
                          round(CN_shapiro_p, 3), 
                          nsmall = 3)))),
  "Soil C:N Ratio",
  "Levene's Test",
  paste0("F", sub_digits(CN_levene_df1), "\u02CC", 
         sub_digits(CN_levene_df2), " = ", CN_levene_F),
  paste0("p ", ifelse(CN_levene_p < 0.001,
                        "&lt; 0.001",
                        paste0("= ", format(
                          round(CN_levene_p, 3), 
                          nsmall = 3))))
), ncol = 4, byrow = T))

colnames(soil_df1) <- c("Measurement", "Test", "Statistic", "P-Value")

soil_df1 %>%
  kable(escape = FALSE, align = "c", linesep = "") %>%
  kable_styling(full_width = TRUE, position = "center") %>%
  row_spec(0, bold = TRUE) %>%
  row_spec(1:nrow(soil_df1), extra_css = "line-height: 1;")
Measurement Test Statistic P-Value
Soil Moisture Shapiro-Wilk Test W= 0.951 p = 0.102
Soil Moisture Levene’s Test F₇ˌ₂₉ = 0.096 p = 0.998
Soil pH Shapiro-Wilk Test W= 0.976 p = 0.596
Soil pH Levene’s Test F₇ˌ₂₉ = 0.929 p = 0.499
Soil C:N Ratio Shapiro-Wilk Test W= 0.985 p = 0.897
Soil C:N Ratio Levene’s Test F₇ˌ₂₈ = 1.087 p = 0.398


soil_moisture_aov2 <- Anova(soil_moisture_lm2, type = 'III')

soil_moisture_aov_residuals_df <- soil_moisture_aov2["Residuals", "Df"]

soil_moisture_aov_soil_moisture_F <-
  format(round(soil_moisture_aov2["moisture_tx", "F value"], 3), 
                       nsmall = 3)
soil_moisture_aov_soil_moisture_df <- 
  soil_moisture_aov2["moisture_tx", "Df"]
soil_moisture_aov_soil_moisture_p <- 
  as.numeric(format(round(soil_moisture_aov2["moisture_tx", "Pr(>F)"], 4), 
                       nsmall = 4))

soil_moisture_aov_temp_F <-
  format(round(soil_moisture_aov2["temp_tx", "F value"], 3), 
                       nsmall = 3)
soil_moisture_aov_temp_df <- 
  soil_moisture_aov2["temp_tx", "Df"]
soil_moisture_aov_temp_p <- 
  as.numeric(format(round(soil_moisture_aov2["temp_tx", "Pr(>F)"], 3), 
                       nsmall = 3))

soil_moisture_aov_destructive_F <-
  as.numeric(format(round(
    soil_moisture_aov2["destructive_time", "F value"], 3), 
                       nsmall = 3))
soil_moisture_aov_destructive_df <- 
  resp_aov2["destructive_time", "Df"]
soil_moisture_aov_destructive_p <- 
  as.numeric(format(round(
    soil_moisture_aov2["destructive_time", "Pr(>F)"], 3), 
                       nsmall = 3))

soil_moisture_aov_block_effect_F <-
  format(round(soil_moisture_aov2["block_effect", "F value"], 3), 
                       nsmall = 3)
soil_moisture_aov_block_effect_df <- 
  soil_moisture_aov2["block_effect", "Df"]
soil_moisture_aov_block_effect_p <- 
  as.numeric(format(round(soil_moisture_aov2["block_effect", "Pr(>F)"], 3), 
                       nsmall = 3))


Mean soil moisture (Figure 3.2A) was significantly related to the induced soil moisture treatments and significantly greater in saturated vs. field-moist treatments (F1,32 = 18.991, p < 0.001) and was significantly greater in 20 °C vs. 12 °C treatments (F1,32 = 3.623, p = 0.066). Soil moisture was not affected by destructive sampling time (F1,32 = 1.924, p = 0.175) nor block effects (F1,32 = 0.385, p = 0.540). There were no significant interaction effects between soil moisture, temperature, and destructive sampling time (Appendix E). Mean soil moisture is presented in Appendix D. Estimates of effect size based on a linear model are given in Appendix F.

Supplemental Table 3.6

ANOVA results for log-transformed soil moisture across experimental treatments temperature (12 °C, 20 °C), soil moisture (field-moist, saturated) and destructively sampling (T1: after three-weeks, T2: following three-week recovery period) treatments.

soil_moisture_aov_tbl <- as.data.frame(matrix(data = c(
  "Soil Moisture Treatment",
  paste0("F", sub_digits(soil_moisture_aov_soil_moisture_df),
         "\u02CC", sub_digits(soil_moisture_aov_residuals_df),
         " = ", soil_moisture_aov_soil_moisture_F),
  paste0("p ", ifelse(soil_moisture_aov_soil_moisture_p < 0.001,
                        "&lt; 0.001",
                        paste0("= ", format(
                          round(soil_moisture_aov_soil_moisture_p, 3), 
                          nsmall = 3)))),

  "Temperature Treatment",
  paste0("F", sub_digits(soil_moisture_aov_temp_df),
         "\u02CC", sub_digits(soil_moisture_aov_residuals_df),
         " = ", soil_moisture_aov_temp_F),
  paste0("p ", ifelse(soil_moisture_aov_temp_p < 0.001,
                        "&lt; 0.001",
                        paste0("= ", format(
                          round(soil_moisture_aov_temp_p, 3), nsmall = 3)))),

  "Destructive Sampling Treatment",
  paste0("F", sub_digits(soil_moisture_aov_destructive_df),
         "\u02CC", sub_digits(soil_moisture_aov_residuals_df),
         " = ", soil_moisture_aov_destructive_F),
  paste0("p ", ifelse(soil_moisture_aov_destructive_p < 0.001,
                        "&lt; 0.001",
                        paste0("= ", format(
                          round(soil_moisture_aov_destructive_p, 3), 
                          nsmall = 3)))),

  "Block Effect",
  paste0("F", sub_digits(soil_moisture_aov_block_effect_df),
         "\u02CC", sub_digits(soil_moisture_aov_residuals_df),
         " = ", soil_moisture_aov_block_effect_F),
  paste0("p ", ifelse(soil_moisture_aov_block_effect_p < 0.001,
                        "&lt; 0.001",
                        paste0("= ", format(
                          round(soil_moisture_aov_block_effect_p, 3), 
                          nsmall = 3))))
), ncol = 3, byrow = T))

colnames(soil_moisture_aov_tbl) <- c("Parameter", "Statistic", "P-Value")

soil_moisture_aov_tbl %>%
  kable(escape = FALSE, align = "c", linesep = "") %>%
  kable_styling(full_width = TRUE, position = "center") %>%
  row_spec(0, bold = TRUE) %>%
  row_spec(1:nrow(soil_moisture_aov_tbl), extra_css = "line-height: 1;")
Parameter Statistic P-Value
Soil Moisture Treatment F₁ˌ₃₂ = 18.991 p < 0.001
Temperature Treatment F₁ˌ₃₂ = 3.623 p = 0.066
Destructive Sampling Treatment F₁ˌ₃₂ = 1.924 p = 0.175
Block Effect F₁ˌ₃₂ = 0.385 p = 0.540


pH_aov2 <- Anova(pH_lm2, type = 'III')

pH_aov_residuals_df <- pH_aov2["Residuals", "Df"]

pH_aov_soil_moisture_F <-
  format(round(pH_aov2["moisture_tx", "F value"], 3), 
                       nsmall = 3)
pH_aov_soil_moisture_df <- 
  pH_aov2["moisture_tx", "Df"]
pH_aov_soil_moisture_p <- 
  as.numeric(format(round(pH_aov2["moisture_tx", "Pr(>F)"], 4), 
                       nsmall = 4))

pH_aov_temp_F <-
  format(round(pH_aov2["temp_tx", "F value"], 3), 
                       nsmall = 3)
pH_aov_temp_df <- 
  pH_aov2["temp_tx", "Df"]
pH_aov_temp_p <- 
  as.numeric(format(round(pH_aov2["temp_tx", "Pr(>F)"], 3), 
                       nsmall = 3))

pH_aov_destructive_F <-
  as.numeric(format(round(
    pH_aov2["destructive_time", "F value"], 3), 
                       nsmall = 3))
pH_aov_destructive_df <- 
  resp_aov2["destructive_time", "Df"]
pH_aov_destructive_p <- 
  as.numeric(format(round(
    pH_aov2["destructive_time", "Pr(>F)"], 3), 
                       nsmall = 3))

pH_aov_block_effect_F <-
  format(round(pH_aov2["block_effect", "F value"], 3), 
                       nsmall = 3)
pH_aov_block_effect_df <- 
  pH_aov2["block_effect", "Df"]
pH_aov_block_effect_p <- 
  as.numeric(format(round(pH_aov2["block_effect", "Pr(>F)"], 3), 
                       nsmall = 3))


Mean soil pH (Figure 3.2B) was not significantly influenced by soil moisture (F1,32 = 2.097, p = 0.157) nor temperature (F1,32 = 1.630, p = 0.211) treatments. Destructive sampling time exhibited a significant effect on pH (F1,32 = 12.166, p = 0.001) and pH tended to be greater in mesocosms sampled at T2 vs. T1, but block effects did not explain differences in pH between treatments (F1,32 = 0.028, p = 0.868). There were no significant interaction effects between soil moisture, temperature, and destructive sampling time (Appendix E). Mean soil pH is presented in Appendix D. Estimates of effect size based on a linear model are given in Appendix F.

Supplemental Table 3.7

ANOVA results for log-transformed soil pH across experimental treatments temperature (12 °C, 20 °C), soil moisture (field-moist, saturated) and destructively sampling (T1: after three-weeks, T2: following three-week recovery period) treatments.

pH_aov_tbl <- as.data.frame(matrix(data = c(
  "Soil Moisture Treatment",
  paste0("F", sub_digits(pH_aov_soil_moisture_df),
         "\u02CC", sub_digits(pH_aov_residuals_df),
         " = ", pH_aov_soil_moisture_F),
  paste0("p ", ifelse(pH_aov_soil_moisture_p < 0.001,
                        "&lt; 0.001",
                        paste0("= ", format(
                          round(pH_aov_soil_moisture_p, 3), 
                          nsmall = 3)))),

  "Temperature Treatment",
  paste0("F", sub_digits(pH_aov_temp_df),
         "\u02CC", sub_digits(pH_aov_residuals_df),
         " = ", pH_aov_temp_F),
  paste0("p ", ifelse(pH_aov_temp_p < 0.001,
                        "&lt; 0.001",
                        paste0("= ", format(
                          round(pH_aov_temp_p, 3), nsmall = 3)))),

  "Destructive Sampling Treatment",
  paste0("F", sub_digits(pH_aov_destructive_df),
         "\u02CC", sub_digits(pH_aov_residuals_df),
         " = ", pH_aov_destructive_F),
  paste0("p ", ifelse(pH_aov_destructive_p < 0.001,
                        "&lt; 0.001",
                        paste0("= ", format(
                          round(pH_aov_destructive_p, 3), 
                          nsmall = 3)))),

  "Block Effect",
  paste0("F", sub_digits(pH_aov_block_effect_df),
         "\u02CC", sub_digits(pH_aov_residuals_df),
         " = ", pH_aov_block_effect_F),
  paste0("p ", ifelse(pH_aov_block_effect_p < 0.001,
                        "&lt; 0.001",
                        paste0("= ", format(
                          round(pH_aov_block_effect_p, 3), 
                          nsmall = 3))))
), ncol = 3, byrow = T))

colnames(pH_aov_tbl) <- c("Parameter", "Statistic", "P-Value")

pH_aov_tbl %>%
  kable(escape = FALSE, align = "c", linesep = "") %>%
  kable_styling(full_width = TRUE, position = "center") %>%
  row_spec(0, bold = TRUE) %>%
  row_spec(1:nrow(pH_aov_tbl), extra_css = "line-height: 1;")
Parameter Statistic P-Value
Soil Moisture Treatment F₁ˌ₃₂ = 2.097 p = 0.157
Temperature Treatment F₁ˌ₃₂ = 1.630 p = 0.211
Destructive Sampling Treatment F₁ˌ₃₂ = 12.166 p = 0.001
Block Effect F₁ˌ₃₂ = 0.028 p = 0.868


CN_aov2 <- Anova(CN_lm2, type = 'III')

CN_aov_residuals_df <- CN_aov2["Residuals", "Df"]

CN_aov_soil_moisture_F <-
  format(round(CN_aov2["moisture_tx", "F value"], 3), 
                       nsmall = 3)
CN_aov_soil_moisture_df <- 
  CN_aov2["moisture_tx", "Df"]
CN_aov_soil_moisture_p <- 
  as.numeric(format(round(CN_aov2["moisture_tx", "Pr(>F)"], 4), 
                       nsmall = 4))

CN_aov_temp_F <-
  format(round(CN_aov2["temp_tx", "F value"], 3), 
                       nsmall = 3)
CN_aov_temp_df <- 
  CN_aov2["temp_tx", "Df"]
CN_aov_temp_p <- 
  as.numeric(format(round(CN_aov2["temp_tx", "Pr(>F)"], 3), 
                       nsmall = 3))

CN_aov_destructive_F <-
  as.numeric(format(round(
    CN_aov2["destructive_time", "F value"], 3), 
                       nsmall = 3))
CN_aov_destructive_df <- 
  resp_aov2["destructive_time", "Df"]
CN_aov_destructive_p <- 
  as.numeric(format(round(
    CN_aov2["destructive_time", "Pr(>F)"], 3), 
                       nsmall = 3))

CN_aov_block_effect_F <-
  format(round(CN_aov2["block_effect", "F value"], 3), 
                       nsmall = 3)
CN_aov_block_effect_df <- 
  CN_aov2["block_effect", "Df"]
CN_aov_block_effect_p <- 
  as.numeric(format(round(CN_aov2["block_effect", "Pr(>F)"], 3), 
                       nsmall = 3))


Soil C:N (Figure 3.2C) did not show any clear trends across treatments. Neither soil moisture (F1,31 = 0.398, p = 0.533), temperature (F1,31 = 1.522, p = 0.227), nor destructive sampling time (F1,31 = 0.502, p = 0.484) had a significant effect on soil C:N ratio. There was no significant difference in C:N ratio between treatments corresponding to block effects (F1,31 = 1.038, p = 0.316) and there were no significant interaction effects between soil moisture, temperature, and destructive sampling time (Appendix E). Mean C:N (± SE) under each treatment is presented in Appendix D. Estimates of effect size based on a linear model are given in Appendix F.

Supplemental Table 3.8

ANOVA results for soil C:N ratio across experimental treatments temperature (12 °C, 20 °C), soil moisture (field-moist, saturated) and destructively sampling (T1: after three-weeks, T2: following three-week recovery period) treatments.

CN_aov_tbl <- as.data.frame(matrix(data = c(
  "Soil Moisture Treatment",
  paste0("F", sub_digits(CN_aov_soil_moisture_df),
         "\u02CC", sub_digits(CN_aov_residuals_df),
         " = ", CN_aov_soil_moisture_F),
  paste0("p ", ifelse(CN_aov_soil_moisture_p < 0.001,
                        "&lt; 0.001",
                        paste0("= ", format(
                          round(CN_aov_soil_moisture_p, 3), 
                          nsmall = 3)))),

  "Temperature Treatment",
  paste0("F", sub_digits(CN_aov_temp_df),
         "\u02CC", sub_digits(CN_aov_residuals_df),
         " = ", CN_aov_temp_F),
  paste0("p ", ifelse(CN_aov_temp_p < 0.001,
                        "&lt; 0.001",
                        paste0("= ", format(
                          round(CN_aov_temp_p, 3), nsmall = 3)))),

  "Destructive Sampling Treatment",
  paste0("F", sub_digits(CN_aov_destructive_df),
         "\u02CC", sub_digits(CN_aov_residuals_df),
         " = ", CN_aov_destructive_F),
  paste0("p ", ifelse(CN_aov_destructive_p < 0.001,
                        "&lt; 0.001",
                        paste0("= ", format(
                          round(CN_aov_destructive_p, 3), 
                          nsmall = 3)))),

  "Block Effect",
  paste0("F", sub_digits(CN_aov_block_effect_df),
         "\u02CC", sub_digits(CN_aov_residuals_df),
         " = ", CN_aov_block_effect_F),
  paste0("p ", ifelse(CN_aov_block_effect_p < 0.001,
                        "&lt; 0.001",
                        paste0("= ", format(
                          round(CN_aov_block_effect_p, 3), 
                          nsmall = 3))))
), ncol = 3, byrow = T))

colnames(CN_aov_tbl) <- c("Parameter", "Statistic", "P-Value")

CN_aov_tbl %>%
  kable(escape = FALSE, align = "c", linesep = "") %>%
  kable_styling(full_width = TRUE, position = "center") %>%
  row_spec(0, bold = TRUE) %>%
  row_spec(1:nrow(CN_aov_tbl), extra_css = "line-height: 1;")
Parameter Statistic P-Value
Soil Moisture Treatment F₁ˌ₃₁ = 0.398 p = 0.533
Temperature Treatment F₁ˌ₃₁ = 1.522 p = 0.227
Destructive Sampling Treatment F₁ˌ₃₁ = 0.502 p = 0.484
Block Effect F₁ˌ₃₁ = 1.038 p = 0.316



3.4 Enzyme Activity

Figure 3.3

Boxplots of mean phenol oxidase (A) and peroxidase (B) concentration.

ylab_phenox <- "<span style='font-size:10pt'>Phenol Oxidase Concentration (µmol substrate / g soil / hour)</span>"
ylab_perox  <- "<span style='font-size:10pt'>Peroxidase Concentration (µmol substrate /<br>g soil / hour)</span>"

left_pad <- theme(plot.margin = margin(5, 6, 5, 70))

phenox_plot <-
  ggplot(soil_T1uT2, aes(x = tx, y = Phenox, fill = as.factor(destructive_time))) +
  geom_boxplot(outlier.shape = NA) +
  geom_jitter(aes(pch = as.factor(destructive_time)),
              position = position_jitter(width=.1, height=0),
              size=3) +
  theme(panel.grid.major = element_blank(),
        panel.grid.minor = element_blank(),
        panel.background = element_blank(),
        axis.line = element_line(colour="black"),
        axis.title.y = element_textbox_simple(orientation="left-rotated", 
                                              halign = 0.5,
                                              margin = margin(b = 15))) +
  scale_fill_brewer(palette = "Greys") +
  xlab("Environmental Treatment Condition") +
  ylab(ylab_phenox) +
  labs(fill = "Sampling Time", pch = "Sampling Time") +
  left_pad

perox_plot <-
  ggplot(soil_T1uT2, aes(x = tx, y = Perox, fill = as.factor(destructive_time))) +
  geom_boxplot(outlier.shape = NA) +
  geom_jitter(aes(pch = as.factor(destructive_time)),
              position = position_jitter(width=.1, height=0),
              size=3) +
  theme(panel.grid.major = element_blank(),
        panel.grid.minor = element_blank(),
        panel.background = element_blank(),
        axis.line = element_line(colour="black"),
        axis.title.y = element_textbox_simple(orientation="left-rotated",
                                              halign = 0.5,
                                              margin = margin(b = 15))) +
  scale_fill_brewer(palette = "Greys") +
  xlab("Environmental Treatment Condition") +
  ylab(ylab_perox) +
  labs(fill = "Sampling Time", pch = "Sampling Time") +
  left_pad

e1 <- place_tag(phenox_plot, "A", x_left = 0.58)
e2 <- place_tag(perox_plot, "B", x_left = 0.58)

(e1 / e2) +
  plot_layout(ncol = 1, guides = "collect") &
  theme(legend.position = "bottom")
Measurements were taken across experimental treatments of temperature (12 °C, 20 °C) and soil moisture (field-moist, saturated) destructively sampled after three-weeks (T~1~) or following three-week recovery period (T~2~). Letters denote significant differences between groups, as per Tukey’s HSD test.

Measurements were taken across experimental treatments of temperature (12 °C, 20 °C) and soil moisture (field-moist, saturated) destructively sampled after three-weeks (T1) or following three-week recovery period (T2). Letters denote significant differences between groups, as per Tukey’s HSD test.


phenox_lm <- lm(Phenox ~ (moisture_tx * temp_tx * destructive_time) + block_effect, 
                data = soil_T1uT2)

phenox_lm2_temp <- lm(Phenox ~
                      moisture_tx * temp_tx * destructive_time + 
                      moisture_tx * temp_tx +
                      moisture_tx * destructive_time + 
                      temp_tx * destructive_time +
                      moisture_tx +
                      temp_tx +
                      destructive_time +
                      block_effect,
                    data = soil_T1uT2)

phenox_lm2 <- lm(Phenox ~
                  temp_tx * destructive_time +
                  moisture_tx +
                  temp_tx +
                  destructive_time +
                  block_effect,
              data = soil_T1uT2)

perox_lm <- lm(Perox ~ (moisture_tx * temp_tx * destructive_time) + block_effect, 
               data = soil_T1uT2)

perox_lm2_temp <- lm(Perox ~
                        moisture_tx * temp_tx * destructive_time + 
                        moisture_tx * temp_tx +
                        moisture_tx * destructive_time + 
                        temp_tx * destructive_time +
                        moisture_tx +
                        temp_tx +
                        destructive_time +
                        block_effect,
                      data = soil_T1uT2)

perox_lm2 <- lm(Perox ~
                  temp_tx * destructive_time +
                  moisture_tx +
                  temp_tx +
                  destructive_time +
                  block_effect,
             data = soil_T1uT2)


Mean phenol oxidase activity was measured across 38 mesocosms. One anomalous negative reading indicating an issue with instrumental background noise was excluded from both phenol oxidase and peroxidase comparisons. Peroxidase activity was compared across 37 mesocosms, as one large positive outlier (point estimate = 323 μmol substrate per g soil per hour) was additionally omitted. Mean phenol oxidase (Shapiro-Wilk: W = 0.959, p = 0.182; Levene: F₇ˌ₃₀ = 2.099, p = 0.075) and peroxidase (Shapiro-Wilk: W = 0.946, p = 0.074; Levene: F₇ˌ₂₉ = 0.584, p = 0.763) activity satisfied the assumptions of normality and homogeneity of variance, as per a Shapiro-Wilk test and Levene’s test, respectively.

Supplemental Table 3.9

Shapiro-Wilk and Levene’s Tests constructed to test whether phenol oxidase and peroxidase activity conform to the assumptions of normality and homodescacity.

enzymes_df1 <- as.data.frame(matrix(data = c(
  "Phenol Oxidase Concentration",
  "Shapiro-Wilk Test", 
  paste0("W = ", 
         format(round(shapiro_test(residuals(phenox_lm2))$statistic, 3), 
         nsmall = 3)),
  paste0("p = ", 
         format(round(shapiro_test(residuals(phenox_lm2))$p.value, 3),
         nsmasll = 3)),
  "Phenol Oxidase Concentration",
  "Levene's Test",
  paste0("F", sub_digits(
    levene_test(Phenox ~ (moisture_tx * temp_tx * destructive_time), 
              data = soil_T1uT2)$df1), "\u02CC",
  sub_digits(
    levene_test(Phenox ~ (moisture_tx * temp_tx * destructive_time), 
              data = soil_T1uT2)$df2), " = ",
  format(round(levene_test(Phenox ~ 
                             (moisture_tx * temp_tx * destructive_time), 
              data = soil_T1uT2)$statistic, 3), nsmall = 3)),
  paste0("p = ", format(round(levene_test(Phenox ~ 
                             (moisture_tx * temp_tx * destructive_time), 
              data = soil_T1uT2)$p, 3), nsmall = 3)),
  "Peroxidase Concentration",
  "Shapiro-Wilk Test", 
  paste0("W = ", 
         format(round(shapiro_test(residuals(perox_lm2))$statistic, 3), 
         nsmall = 3)),
  paste0("p = ", 
         format(round(shapiro_test(residuals(perox_lm2))$p.value, 3),
         nsmasll = 3)),
  "Peroxidase Concentration",
  "Levene's Test",
  paste0("F", sub_digits(
    levene_test(Perox ~ (moisture_tx * temp_tx * destructive_time), 
              data = soil_T1uT2)$df1), "\u02CC",
  sub_digits(
    levene_test(Perox ~ (moisture_tx * temp_tx * destructive_time), 
              data = soil_T1uT2)$df2), " = ",
  format(round(levene_test(Perox ~ 
                             (moisture_tx * temp_tx * destructive_time), 
              data = soil_T1uT2)$statistic, 3), nsmall = 3)),
  paste0("p = ", format(round(levene_test(Perox ~ 
                             (moisture_tx * temp_tx * destructive_time), 
              data = soil_T1uT2)$p, 3), nsmall = 3))
  ), ncol = 4, byrow = T))

colnames(enzymes_df1) <- c("Parameter", "Test", "Statistic", "P-Value")

knitr::kable(enzymes_df1, linesep = "\\hline")
Parameter Test Statistic P-Value
Phenol Oxidase Concentration Shapiro-Wilk Test W = 0.959 p = 0.182
Phenol Oxidase Concentration Levene’s Test F₇ˌ₃₀ = 2.099 p = 0.075
Peroxidase Concentration Shapiro-Wilk Test W = 0.946 p = 0.074
Peroxidase Concentration Levene’s Test F₇ˌ₂₉ = 0.584 p = 0.763


phenox_aov2 <- Anova(phenox_lm2, type = 'III')


Mean phenol oxidase activity (Figure 3.3A) was not significantly affected by soil moisture treatments (F₁ˌ₃₂ = 0.760, p = 0.390), but was strongly driven by temperature conditions (F₁ˌ₃₂ = 16.455, p = 0.000). Mean phenol oxidase activity increased in mesocosms assigned to 20 °C vs. 12 °C conditions. Destructive sampling treatments also significantly affected phenol oxidase activity (F₁ˌ₃₂ = 5.398, p = 0.027) and was greater at T2 vs. T1. This was driven by a significant temperature by destructive sampling time interaction (F₁ˌ₃₂ = 9.001, p = 0.005), which suggests that phenol oxidase activity decreased in mesocosms assigned to 20 °C from T1 to T2 following a three-week return to initial 12 °C conditions. Block effects constructed corresponding to differences in total abundance by original sampling location (F₁ˌ₃₂ = 1.159, p = 0.290) did not have a significant effect on phenol oxidase activity. There were no other significant interaction effects between soil moisture, temperature, and destructive sampling time (Appendix E). Overall, mean phenol oxidase activity (± SE) was greatest (199 ± 24 μmol substrate per g soil per hour) in mesocosms assigned to 20 °C field-moist conditions, sampled at T1 and was least (90 ± 19 μmol substrate per g soil per hour) in those assigned to 12 °C saturated conditions, sampled at T1 (see Appendix D). Estimates of effect size based on a linear model are given in Appendix F.

Supplemental Table 3.10

Phenol oxidase activity ANOVA results.

phenox_aov_tbl <- as.data.frame(matrix(data = c(
  "Intercept",
  paste0("F", sub_digits(phenox_aov2["(Intercept)", "Df"]), 
         "\u02CC", sub_digits(phenox_aov2["Residuals", "Df"]), 
         " = ", format(round(phenox_aov2["(Intercept)", "F value"], 3), 
                       nsmall = 3)),
  paste0("p = ", format(round(phenox_aov2["(Intercept)", "Pr(>F)"], 3), 
                       nsmall = 3)),
  "Soil Moisture Treatment",
  paste0("F", sub_digits(phenox_aov2["moisture_tx", "Df"]), 
         "\u02CC", sub_digits(phenox_aov2["Residuals", "Df"]), 
         " = ", format(round(phenox_aov2["moisture_tx", "F value"], 3), 
                       nsmall = 3)),
  paste0("p = ", format(round(phenox_aov2["moisture_tx", "Pr(>F)"], 3), 
                       nsmall = 3)),
  "Temperature Treatment",
  paste0("F", sub_digits(phenox_aov2["temp_tx", "Df"]), 
         "\u02CC", sub_digits(phenox_aov2["Residuals", "Df"]), 
         " = ", format(round(phenox_aov2["temp_tx", "F value"], 3), 
                       nsmall = 3)),
  paste0("p = ", format(round(phenox_aov2["temp_tx", "Pr(>F)"], 3), 
                       nsmall = 3)),
  "Destructive Sampling Treatment",
  paste0("F", sub_digits(phenox_aov2["destructive_time", "Df"]), 
         "\u02CC", sub_digits(phenox_aov2["Residuals", "Df"]), 
         " = ", format(round(phenox_aov2["destructive_time", "F value"], 
                             3), 
                       nsmall = 3)),
  paste0("p = ", format(round(phenox_aov2["destructive_time", "Pr(>F)"], 
                              3), 
                       nsmall = 3)),
  "Block Effect",
  paste0("F", sub_digits(phenox_aov2["block_effect", "Df"]), 
         "\u02CC", sub_digits(phenox_aov2["Residuals", "Df"]), 
         " = ", format(round(phenox_aov2["block_effect", "F value"], 3), 
                       nsmall = 3)),
  paste0("p = ", format(round(phenox_aov2["block_effect", "Pr(>F)"], 3), 
                       nsmall = 3)),
  "Temperature x Destructive Sampling Interaction",
  paste0("F", sub_digits(phenox_aov2["temp_tx:destructive_time", "Df"]), 
         "\u02CC", sub_digits(phenox_aov2["Residuals", "Df"]), 
         " = ", format(round(phenox_aov2["temp_tx:destructive_time", 
                                         "F value"], 
                             3), 
                       nsmall = 3)),
  paste0("p = ", format(round(phenox_aov2["temp_tx:destructive_time", 
                                          "Pr(>F)"], 
                              3), 
                       nsmall = 3))
), ncol = 3, byrow = T))

colnames(phenox_aov_tbl) <- c("Parameter", "Statistic", "P-Value")

knitr::kable(phenox_aov_tbl)
## Warning: 'xfun::attr()' is deprecated.
## Use 'xfun::attr2()' instead.
## See help("Deprecated")

## Warning: 'xfun::attr()' is deprecated.
## Use 'xfun::attr2()' instead.
## See help("Deprecated")
Parameter Statistic P-Value
Intercept F₁ˌ₃₂ = 55.547 p = 0.000
Soil Moisture Treatment F₁ˌ₃₂ = 0.760 p = 0.390
Temperature Treatment F₁ˌ₃₂ = 16.455 p = 0.000
Destructive Sampling Treatment F₁ˌ₃₂ = 5.398 p = 0.027
Block Effect F₁ˌ₃₂ = 1.159 p = 0.290
Temperature x Destructive Sampling Interaction F₁ˌ₃₂ = 9.001 p = 0.005


perox_aov2 <- Anova(perox_lm2, type = 'III')


Mean peroxidase activity (Figure 3.3B) was not influenced by soil moisture (F₁ˌ₃₁ = 0.009, p = 0.925), but was significantly affected by temperature (F₁ˌ₃₁ = 6.954, p = 0.013) and increased at 20 °C vs 12 °C. Mean peroxidase activity was also significantly affected by destructive sampling treatments (F₁ˌ₃₁ = 20.949, p = 0.000) and was greater in mesocosms sampled at T2 vs. T1. This was driven by a significant temperature by destructive sampling time interaction (F₁ˌ₃₁ = 5.235, p = 0.029), which suggests that peroxidase activity also decreased in mesocosms assigned to 20 °C from T1 to T2 following a three-week return to initial 12 °C conditions. Block effects also significantly influenced mean peroxidase activity (F₁ˌ₃₁ = 6.091, p = 0.019); peroxidase activity tended to decrease in blocks characterized by especially high soil fauna abundances. There were no other significant interaction effects between soil moisture, temperature, and destructive sampling time (Appendix E). Mean peroxidase concentration (± SE) under each treatment is presented in Appendix D. Estimates of effect size based on a linear model are given in Appendix F.

Supplemental Table 3.11

Peroxidase activity ANOVA results.

perox_aov_tbl <- as.data.frame(matrix(data = c(
  "Intercept",
  paste0("F", sub_digits(perox_aov2["(Intercept)", "Df"]), 
         "\u02CC", sub_digits(perox_aov2["Residuals", "Df"]), 
         " = ", format(round(perox_aov2["(Intercept)", "F value"], 3), 
                       nsmall = 3)),
  paste0("p = ", format(round(perox_aov2["(Intercept)", "Pr(>F)"], 3), 
                       nsmall = 3)),
  "Soil Moisture Treatment",
  paste0("F", sub_digits(perox_aov2["moisture_tx", "Df"]), 
         "\u02CC", sub_digits(perox_aov2["Residuals", "Df"]), 
         " = ", format(round(perox_aov2["moisture_tx", "F value"], 3), 
                       nsmall = 3)),
  paste0("p = ", format(round(perox_aov2["moisture_tx", "Pr(>F)"], 3), 
                       nsmall = 3)),
  "Temperature Treatment",
  paste0("F", sub_digits(perox_aov2["temp_tx", "Df"]), 
         "\u02CC", sub_digits(perox_aov2["Residuals", "Df"]), 
         " = ", format(round(perox_aov2["temp_tx", "F value"], 3), 
                       nsmall = 3)),
  paste0("p = ", format(round(perox_aov2["temp_tx", "Pr(>F)"], 3), 
                       nsmall = 3)),
  "Destructive Sampling Treatment",
  paste0("F", sub_digits(perox_aov2["destructive_time", "Df"]), 
         "\u02CC", sub_digits(perox_aov2["Residuals", "Df"]), 
         " = ", format(round(perox_aov2["destructive_time", "F value"], 
                             3), 
                       nsmall = 3)),
  paste0("p = ", format(round(perox_aov2["destructive_time", "Pr(>F)"], 
                              3), 
                       nsmall = 3)),
  "Block Effect",
  paste0("F", sub_digits(perox_aov2["block_effect", "Df"]), 
         "\u02CC", sub_digits(perox_aov2["Residuals", "Df"]), 
         " = ", format(round(perox_aov2["block_effect", "F value"], 3), 
                       nsmall = 3)),
  paste0("p = ", format(round(perox_aov2["block_effect", "Pr(>F)"], 3), 
                       nsmall = 3)),
  "Temperature x Destructive Sampling Interaction",
  paste0("F", sub_digits(perox_aov2["temp_tx:destructive_time", "Df"]), 
         "\u02CC", sub_digits(perox_aov2["Residuals", "Df"]), 
         " = ", format(round(perox_aov2["temp_tx:destructive_time", 
                                         "F value"], 
                             3), 
                       nsmall = 3)),
  paste0("p = ", format(round(perox_aov2["temp_tx:destructive_time", 
                                          "Pr(>F)"], 
                              3), 
                       nsmall = 3))
), ncol = 3, byrow = T))

colnames(perox_aov_tbl) <- c("Parameter", "Statistic", "P-Value")

knitr::kable(perox_aov_tbl)
## Warning: 'xfun::attr()' is deprecated.
## Use 'xfun::attr2()' instead.
## See help("Deprecated")

## Warning: 'xfun::attr()' is deprecated.
## Use 'xfun::attr2()' instead.
## See help("Deprecated")
Parameter Statistic P-Value
Intercept F₁ˌ₃₁ = 42.085 p = 0.000
Soil Moisture Treatment F₁ˌ₃₁ = 0.009 p = 0.925
Temperature Treatment F₁ˌ₃₁ = 6.954 p = 0.013
Destructive Sampling Treatment F₁ˌ₃₁ = 20.949 p = 0.000
Block Effect F₁ˌ₃₁ = 6.091 p = 0.019
Temperature x Destructive Sampling Interaction F₁ˌ₃₁ = 5.235 p = 0.029


3.5 Soil Fauna Abundance and Biomass

Figure 3.4

Boxplots of mean fauna abundance (A) and biomass (B).

abundance_T1uT2 <- abundance_data %>% filter(!destructive_time == "T0") 
biomass_T1uT2 <- biomass_data %>% filter(!destructive_time == "T0")

abundance_T1uT2$tx <- interaction(abundance_T1uT2$temp_tx, 
                                  abundance_T1uT2$moisture_tx) 

abundance_T1uT2 <- abundance_T1uT2 %>%
  mutate(tx = fct_recode(tx,
    "12\u00B0 Field-Moist" = "12.Ambient",
    "20\u00B0 Field-Moist" = "20.Ambient",
    "12\u00B0 Saturated"   = "12.High",
    "20\u00B0 Saturated"   = "20.High"
  ))

biomass_T1uT2$tx <- interaction(biomass_T1uT2$temp_tx, 
                                  biomass_T1uT2$moisture_tx) 

biomass_T1uT2 <- biomass_T1uT2 %>%
  mutate(tx = fct_recode(tx,
    "12\u00B0 Field-Moist" = "12.Ambient",
    "20\u00B0 Field-Moist" = "20.Ambient",
    "12\u00B0 Saturated"   = "12.High",
    "20\u00B0 Saturated"   = "20.High"
  ))

ylab_abundance <- "<span style='font-size:10pt'>Total fauna abundance<br>(# × 100,000 / m<sup>2</sup>)</span>"
ylab_biomass  <- "<span style='font-size:10pt'>Total fauna biomass<br>(# × 100,000 / m<sup>2</sup>)</span>"

left_pad <- theme(plot.margin = margin(5, 6, 5, 70))

abundance_plot <- 
  ggplot(abundance_T1uT2, 
         aes(x=tx, 
             y=total_ab_standardized, fill = as.factor(destructive_time))) + 
  geom_boxplot(outlier.shape=NA) + #avoid plotting outliers twice
  geom_jitter(aes(pch = as.factor(destructive_time)), 
              position=position_jitter(width=.1, height=0), size = 3) +
  theme(panel.grid.major = element_blank(), 
        panel.grid.minor = element_blank(),
        panel.background = element_blank(), 
        axis.line = element_line(colour = "black"),
        axis.title.y = element_textbox_simple(orientation="left-rotated",
                                              halign = 0.5,
                                              margin = margin(b = 15))) +
  scale_fill_brewer(palette = "Greys") +
  xlab("Environmental Treatment Condition") + 
  ylab(ylab_abundance) +
  labs(fill = "Sampling Time", pch = "Sampling Time")

biomass_plot <- ggplot(biomass_T1uT2, aes(x=tx, 
                                          y=total_biomass, 
                                          fill = as.factor(destructive_time))) + 
  geom_boxplot(outlier.shape=NA) + #avoid plotting outliers twice
  geom_jitter(aes(pch = as.factor(destructive_time)), 
              position=position_jitter(width=.1, height=0), size = 3) +
  theme(panel.grid.major = element_blank(), 
        panel.grid.minor = element_blank(),
        panel.background = element_blank(), 
        axis.line = element_line(colour = "black"),
        axis.title.y = element_textbox_simple(orientation="left-rotated",
                                              halign = 0.5,
                                              margin = margin(b = 15))) +
  scale_fill_brewer(palette = "Greys") +
  xlab("Environmental Treatment Condition") + 
  ylab(ylab_biomass) +
  labs(fill = "Sampling Time", pch = "Sampling Time")

g1 <- place_tag(abundance_plot, "A", x_left = 0.58)
g2 <- place_tag(biomass_plot,            "B", x_left = 0.58)

(g1 / g2) +
  plot_layout(ncol = 1, guides = "collect") &
  theme(legend.position = "bottom")
Mesocosms were assessed across experimental treatments of temperature (12 °C, 20 °C) and soil moisture (field-moist, saturated) destructively sampled after three-weeks (T~1~) or following three-week recovery period (T~2~).

Mesocosms were assessed across experimental treatments of temperature (12 °C, 20 °C) and soil moisture (field-moist, saturated) destructively sampled after three-weeks (T1) or following three-week recovery period (T2).


total_ab_lm <- lm(total_ab_standardized ~
                          moisture_tx * temp_tx * destructive_time + 
                          moisture_tx * temp_tx +
                          moisture_tx * destructive_time + 
                          temp_tx * destructive_time +
                          moisture_tx +
                          temp_tx +
                          destructive_time +
                          block_effect,
                     data = abundance_T1uT2)

total_ab_lm2 <- lm(total_ab_standardized ~
                    moisture_tx +
                    temp_tx +
                    destructive_time +
                    block_effect,
                data = abundance_T1uT2)

micro_ab_lm <- lm(total_micro_ab_standardized ~
                          moisture_tx * temp_tx * destructive_time + 
                          moisture_tx * temp_tx +
                          moisture_tx * destructive_time + 
                          temp_tx * destructive_time +
                          moisture_tx +
                          temp_tx +
                          destructive_time +
                          block_effect,
                     data = abundance_T1uT2)

micro_ab_lm2 <- lm(total_micro_ab_standardized ~
                    moisture_tx +
                    temp_tx +
                    destructive_time +
                    block_effect,
                data = abundance_T1uT2)

meso_ab_lm <- lm(log(total_meso_ab_standardized) ~
                        moisture_tx * temp_tx * destructive_time + 
                        moisture_tx * temp_tx +
                        moisture_tx * destructive_time + 
                        temp_tx * destructive_time +
                        moisture_tx +
                        temp_tx +
                        destructive_time +
                        block_effect,
                    data = abundance_T1uT2)

meso_ab_lm2 <- lm(log(total_meso_ab_standardized) ~
                    temp_tx * destructive_time +
                    moisture_tx +
                    temp_tx +
                    destructive_time +
                    block_effect,
               data = abundance_T1uT2)

total_biom_lm <- lm(total_biomass ~
                            moisture_tx * temp_tx * destructive_time + 
                            moisture_tx * temp_tx +
                            moisture_tx * destructive_time + 
                            temp_tx * destructive_time +
                            moisture_tx +
                            temp_tx +
                            destructive_time +
                            block_effect,
                       data = biomass_T1uT2)

total_biom_lm2 <- lm(total_biomass ~
                      moisture_tx * destructive_time + 
                      moisture_tx +
                      temp_tx +
                      destructive_time +
                      block_effect,
                  data = biomass_T1uT2)

micro_biom_lm <- lm(micro_biomass ~
                          moisture_tx * temp_tx * destructive_time + 
                          moisture_tx * temp_tx +
                          moisture_tx * destructive_time + 
                          temp_tx * destructive_time +
                          moisture_tx +
                          temp_tx +
                          destructive_time +
                          block_effect,
                       data = biomass_T1uT2)

micro_biom_lm2 <- lm(micro_biomass ~
                      moisture_tx +
                      temp_tx +
                      destructive_time +
                      block_effect,
                  data = biomass_T1uT2)

meso_biom_lm <- lm(meso_biomass ~
                          moisture_tx * temp_tx * destructive_time + 
                          moisture_tx * temp_tx +
                          moisture_tx * destructive_time + 
                          temp_tx * destructive_time +
                          moisture_tx +
                          temp_tx +
                          destructive_time +
                          block_effect,
                      data = biomass_T1uT2)

meso_biom_lm2 <- lm(meso_biomass ~
                      moisture_tx * destructive_time + 
                      moisture_tx +
                      temp_tx +
                      destructive_time +
                      block_effect,
                 data = biomass_T1uT2)


Mean total soil fauna abundance (Shapiro-Wilk’s test: W = 0.980, p = 0.701; Levene’s test: F₇ˌ₃₁ = 0.435, p = 0.872) and total soil microfauna abundance (Shapiro-Wilk’s test: W = 0.980, p = 0.704; Levene’s test: F₇ˌ₃₁ = 0.955, p = 0.480) each satisfied the assumptions of normality and homogeneity of variance, as per a Shapiro-Wilk’s test and Levene’s test. Total soil mesofauna abundance was transformed on natural log, (ln) scale to conform to the assumption of normality (Shapiro-Wilk’s test: W = 0.976, p = 0.564; Levene’s test: F7,31 = 0.389, p = 0.901). Total biomass (Shapiro-Wilk’s test: W = 0.953, p = 0.107; Levene’s test: F7,31 = 0.317, p = 0.940), total soil microfauna biomass (Shapiro-Wilk’s test: W = 0.980, p = 0.704; Levene’s test: F7,31 = 0.955, p = 0.480), and total soil mesofauna biomass (Shapiro-Wilk’s test: W = 0.953, p = 0.105; Levene’s test: F7,31 = 0.313, p = 0.943) each met the assumptions of normality and homogeneity of variance.

Supplemental Table 3.12

Shapiro-Wilk and Levene’s Tests constructed to test whether mean total soil fauna abundance, total soil microfauna abundance, log-tranformed total soil mesofauna abundance, total biomass, total soil microfauna biomass, and total soil mesofauna biomass conform to the assumptions of normality and homodescacity.

ab_biom_df1 <- as.data.frame(matrix(data = c(
  "Total Fauna Abundance",
  "Shapiro-Wilk Test", 
  paste0("W = ", 
         format(round(shapiro_test(residuals(total_ab_lm2))$statistic, 3), 
         nsmall = 3)),
  paste0("p = ", 
         format(round(shapiro_test(residuals(total_ab_lm2))$p.value, 3),
         nsmasll = 3)),
  "Total Fauna Abundance",
  "Levene's Test",
  paste0("F", sub_digits(
    levene_test(total_ab_standardized ~ 
                  (moisture_tx * temp_tx * destructive_time), 
              data = abundance_T1uT2)$df1), "\u02CC",
  sub_digits(
    levene_test(total_ab_standardized ~ 
                  (moisture_tx * temp_tx * destructive_time), 
              data = abundance_T1uT2)$df2), " = ",
  format(round(levene_test(total_ab_standardized ~ 
                             (moisture_tx * temp_tx * destructive_time), 
              data = abundance_T1uT2)$statistic, 3), nsmall = 3)),
  paste0("p = ", format(round(levene_test(total_ab_standardized ~ 
                             (moisture_tx * temp_tx * destructive_time), 
              data = abundance_T1uT2)$p, 3), nsmall = 3)),
  "Total Microfauna Abundance",
  "Shapiro-Wilk Test", 
  paste0("W = ", 
         format(round(shapiro_test(residuals(micro_ab_lm2))$statistic, 3), 
         nsmall = 3)),
  paste0("p = ", 
         format(round(shapiro_test(residuals(micro_ab_lm2))$p.value, 3),
         nsmasll = 3)),
  "Total Microfauna Abundance",
  "Levene's Test",
  paste0("F", sub_digits(
    levene_test(total_micro_ab_standardized ~ 
                  (moisture_tx * temp_tx * destructive_time), 
              data = abundance_T1uT2)$df1), "\u02CC",
  sub_digits(
    levene_test(total_micro_ab_standardized ~ 
                  (moisture_tx * temp_tx * destructive_time), 
              data = abundance_T1uT2)$df2), " = ",
  format(round(levene_test(total_micro_ab_standardized ~ 
                             (moisture_tx * temp_tx * destructive_time), 
              data = abundance_T1uT2)$statistic, 3), nsmall = 3)),
  paste0("p = ", format(round(levene_test(total_micro_ab_standardized ~ 
                             (moisture_tx * temp_tx * destructive_time), 
              data = abundance_T1uT2)$p, 3), nsmall = 3)),
  "Total Mesofauna Abundance",
  "Shapiro-Wilk Test", 
  paste0("W = ", 
         format(round(shapiro_test(residuals(meso_ab_lm2))$statistic, 3), 
         nsmall = 3)),
  paste0("p = ", 
         format(round(shapiro_test(residuals(meso_ab_lm2))$p.value, 3),
         nsmasll = 3)),
  "Total Mesofauna Abundance",
  "Levene's Test",
  paste0("F", sub_digits(
    levene_test(log(total_meso_ab_standardized) ~ 
                  (moisture_tx * temp_tx * destructive_time), 
              data = abundance_T1uT2)$df1), "\u02CC",
  sub_digits(
    levene_test(log(total_meso_ab_standardized) ~ 
                  (moisture_tx * temp_tx * destructive_time), 
              data = abundance_T1uT2)$df2), " = ",
  format(round(levene_test(log(total_meso_ab_standardized) ~ 
                             (moisture_tx * temp_tx * destructive_time), 
              data = abundance_T1uT2)$statistic, 3), nsmall = 3)),
  paste0("p = ", format(round(levene_test(log(total_meso_ab_standardized) ~ 
                             (moisture_tx * temp_tx * destructive_time), 
              data = abundance_T1uT2)$p, 3), nsmall = 3)),
  "Total Fauna Biomass",
  "Shapiro-Wilk Test", 
  paste0("W = ", 
         format(round(shapiro_test(residuals(total_biom_lm2))$statistic, 3), 
         nsmall = 3)),
  paste0("p = ", 
         format(round(shapiro_test(residuals(total_biom_lm2))$p.value, 3),
         nsmasll = 3)),
  "Total Fauna Biomass",
  "Levene's Test",
  paste0("F", sub_digits(
    levene_test(total_biomass ~ 
                  (moisture_tx * temp_tx * destructive_time), 
              data = biomass_T1uT2)$df1), "\u02CC",
  sub_digits(
    levene_test(total_biomass ~ 
                  (moisture_tx * temp_tx * destructive_time), 
              data = biomass_T1uT2)$df2), " = ",
  format(round(levene_test(total_biomass ~ 
                             (moisture_tx * temp_tx * destructive_time), 
              data = biomass_T1uT2)$statistic, 3), nsmall = 3)),
  paste0("p = ", format(round(levene_test(total_biomass ~ 
                             (moisture_tx * temp_tx * destructive_time), 
              data = biomass_T1uT2)$p, 3), nsmall = 3)),
  "Total Microfauna Biomass",
  "Shapiro-Wilk Test", 
  paste0("W = ", 
         format(round(shapiro_test(residuals(micro_biom_lm2))$statistic, 3), 
         nsmall = 3)),
  paste0("p = ", 
         format(round(shapiro_test(residuals(micro_biom_lm2))$p.value, 3),
         nsmasll = 3)),
  "Total Microfauna Biomass",
  "Levene's Test",
  paste0("F", sub_digits(
    levene_test(micro_biomass ~ 
                  (moisture_tx * temp_tx * destructive_time), 
              data = biomass_T1uT2)$df1), "\u02CC",
  sub_digits(
    levene_test(micro_biomass ~ 
                  (moisture_tx * temp_tx * destructive_time), 
              data = biomass_T1uT2)$df2), " = ",
  format(round(levene_test(micro_biomass ~ 
                             (moisture_tx * temp_tx * destructive_time), 
              data = biomass_T1uT2)$statistic, 3), nsmall = 3)),
  paste0("p = ", format(round(levene_test(micro_biomass ~ 
                             (moisture_tx * temp_tx * destructive_time), 
              data = biomass_T1uT2)$p, 3), nsmall = 3)),
  "Total Mesofauna Biomass",
  "Shapiro-Wilk Test", 
  paste0("W = ", 
         format(round(shapiro_test(residuals(meso_biom_lm2))$statistic, 3), 
         nsmall = 3)),
  paste0("p = ", 
         format(round(shapiro_test(residuals(meso_biom_lm2))$p.value, 3),
         nsmasll = 3)),
  "Total Mesofauna Abundance",
  "Levene's Test",
  paste0("F", sub_digits(
    levene_test(meso_biomass ~ 
                  (moisture_tx * temp_tx * destructive_time), 
              data = biomass_T1uT2)$df1), "\u02CC",
  sub_digits(
    levene_test(meso_biomass ~ 
                  (moisture_tx * temp_tx * destructive_time), 
              data = biomass_T1uT2)$df2), " = ",
  format(round(levene_test(meso_biomass ~ 
                             (moisture_tx * temp_tx * destructive_time), 
              data = biomass_T1uT2)$statistic, 3), nsmall = 3)),
  paste0("p = ", format(round(levene_test(meso_biomass ~ 
                             (moisture_tx * temp_tx * destructive_time), 
              data = biomass_T1uT2)$p, 3), nsmall = 3))
  ), ncol = 4, byrow = T))

colnames(ab_biom_df1) <- 
  c("Parameter", "Test", "Statistic", "P-Value")

knitr::kable(ab_biom_df1, linesep = "\\hline")
Parameter Test Statistic P-Value
Total Fauna Abundance Shapiro-Wilk Test W = 0.980 p = 0.701
Total Fauna Abundance Levene’s Test F₇ˌ₃₁ = 0.435 p = 0.872
Total Microfauna Abundance Shapiro-Wilk Test W = 0.980 p = 0.704
Total Microfauna Abundance Levene’s Test F₇ˌ₃₁ = 0.955 p = 0.480
Total Mesofauna Abundance Shapiro-Wilk Test W = 0.976 p = 0.564
Total Mesofauna Abundance Levene’s Test F₇ˌ₃₁ = 0.389 p = 0.901
Total Fauna Biomass Shapiro-Wilk Test W = 0.953 p = 0.107
Total Fauna Biomass Levene’s Test F₇ˌ₃₁ = 0.317 p = 0.940
Total Microfauna Biomass Shapiro-Wilk Test W = 0.980 p = 0.704
Total Microfauna Biomass Levene’s Test F₇ˌ₃₁ = 0.955 p = 0.480
Total Mesofauna Biomass Shapiro-Wilk Test W = 0.953 p = 0.105
Total Mesofauna Abundance Levene’s Test F₇ˌ₃₁ = 0.313 p = 0.943


cor_micro_meso_ab <- 
  cor.test(abundance_T1uT2$total_micro_ab_standardized,
         abundance_T1uT2$total_meso_ab_standardized, method = "pearson")

cor_micro_total_ab <- 
  cor.test(abundance_T1uT2$total_micro_ab_standardized,
         abundance_T1uT2$total_ab_standardized, method = "pearson")

cor_meso_total_ab <- 
  cor.test(abundance_T1uT2$total_meso_ab_standardized,
         abundance_T1uT2$total_ab_standardized, method = "pearson")

total_ab_aov2 <- Anova(total_ab_lm2, type = 'III')

micro_ab_aov2 <- Anova(micro_ab_lm2, type = 'III')

meso_ab_aov2 <- Anova(meso_ab_lm2, type = 'III')


Total soil microfauna and mesofauna abundances were significantly correlated (R42 = 0.467, p = 0.001); similarly, soil microfauna (R42 = 0.834, p < 0.001) and mesofauna (R42 = 0.877, p < 0.001) total abundances were each significantly and positively correlated with total fauna abundance. Mean total soil fauna abundance (Figure 3.4A) was strongly influenced by the original sampling location (i.e., significant block effects (F1,34 = 22.953, p < 0.001)) with a high abundance of both microfauna and mesofauna observed in a single block that contained one sample replicate from each treatment. Total abundance of soil fauna was significantly reduced under saturated vs. field-moist conditions (F1,34 = 19.104, p < 0.001). This was driven by decreased microfauna (F1,34 = 21.152, p < 0.001) and mesofauna (F1,33 = 6.143, p = 0.018) abundances. Destructive sampling did not affect total fauna abundance (F1,34 = 0.466, p = 0.499), soil microfauna abundance (F1,34 = 0.966, p = 0.33), nor soil mesofauna abundance (F1,33 = 1.968, p = 0.170). Neither total soil fauna abundance nor soil microfauna abundance was significantly affected by interaction effects (Appendix E), but soil mesofauna exhibited a significant temperature by destructive sampling time interaction effect (F1,33 = 4.276, p = 0.047). This suggests that soil mesofauna abundances in mesocosms assigned to 20 °C decreased from T1 to T2 following a three-week return to initial 12 °C conditions. Overall, mean total abundance (± SE) was greatest (360,000 ± 70,000 individuals per m2) in mesocosms assigned to 20 °C field-moist conditions, sampled at T1 and was lowest (150,000 ± 30,000 individuals per m2) in those assigned to 12 °C saturated conditions, sampled at T1 (see Appendix D). Estimates of effect size based on a linear model are given in Appendix F.

Supplemental Table 3.13

Total soil fauna, microfauna, and mesofauna abundance Pearson’s Test results.

ab_cor_df <- as.data.frame(matrix(data = c(
  "Total Soil Microfauna Abundance",
  "Total Soil Mesofauna Abundance",
  paste0("R", sub_digits(cor_micro_meso_ab$parameter), " = ", 
         format(round(cor_micro_meso_ab$estimate, 3), 
         nsmall = 3)),
  paste0("p = ", 
         format(round(cor_micro_meso_ab$p.value, 3),
         nsmall = 3)),
  "Total Soil Microfauna Abundance",
  "Total Soil Fauna Abundance",
  paste0("R", sub_digits(cor_micro_total_ab$parameter), " = ", 
         format(round(cor_micro_total_ab$estimate, 3), 
         nsmall = 3)),
  paste0("p = ", 
         format(round(cor_micro_total_ab$p.value, 3),
         nsmall = 3)),
  "Total Soil Mesofauna Abundance",
  "Total Soil Fauna Abundance",
  paste0("R", sub_digits(cor_meso_total_ab$parameter), " = ", 
         format(round(cor_meso_total_ab$estimate, 3), 
         nsmall = 3)),
  paste0("p = ", 
         format(round(cor_meso_total_ab$p.value, 3),
         nsmall = 3))
  ), ncol = 4, byrow = T))

colnames(ab_cor_df) <- 
  c("Variable 1", "Variable 2", "Statistic", "P-Value")

knitr::kable(ab_cor_df, linesep = "\\hline")
Variable 1 Variable 2 Statistic P-Value
Total Soil Microfauna Abundance Total Soil Mesofauna Abundance R₃₇ = 0.454 p = 0.004
Total Soil Microfauna Abundance Total Soil Fauna Abundance R₃₇ = 0.863 p = 0.000
Total Soil Mesofauna Abundance Total Soil Fauna Abundance R₃₇ = 0.842 p = 0.000


Supplemental Table 3.14

Total soil fauna, microfauna, and mesofauna abunance ANOVA results.

abundance_aov_tbl <- as.data.frame(matrix(data = c(
  "Total Soil Fauna Abundance",
  "Intercept",
  paste0("F", sub_digits(total_ab_aov2["(Intercept)", "Df"]), 
         "\u02CC", sub_digits(total_ab_aov2["Residuals", "Df"]), 
         " = ", format(round(total_ab_aov2["(Intercept)", "F value"], 3), 
                       nsmall = 3)),
  paste0("p = ", format(round(total_ab_aov2["(Intercept)", "Pr(>F)"], 3), 
                       nsmall = 3)),
  "Total Soil Fauna Abundance",
  "Soil Moisture Treatment",
  paste0("F", sub_digits(total_ab_aov2["moisture_tx", "Df"]), 
         "\u02CC", sub_digits(total_ab_aov2["Residuals", "Df"]), 
         " = ", format(round(total_ab_aov2["moisture_tx", "F value"], 3), 
                       nsmall = 3)),
  paste0("p = ", format(round(total_ab_aov2["moisture_tx", "Pr(>F)"], 3), 
                       nsmall = 3)),
  "Total Soil Fauna Abundance",
  "Temperature Treatment",
  paste0("F", sub_digits(total_ab_aov2["temp_tx", "Df"]), 
         "\u02CC", sub_digits(total_ab_aov2["Residuals", "Df"]), 
         " = ", format(round(total_ab_aov2["temp_tx", "F value"], 3), 
                       nsmall = 3)),
  paste0("p = ", format(round(total_ab_aov2["temp_tx", "Pr(>F)"], 3), 
                       nsmall = 3)),
  "Total Soil Fauna Abundance",
  "Destructive Sampling Treatment",
  paste0("F", sub_digits(total_ab_aov2["destructive_time", "Df"]), 
         "\u02CC", sub_digits(total_ab_aov2["Residuals", "Df"]), 
         " = ", format(round(total_ab_aov2["destructive_time", "F value"], 
                             3), 
                       nsmall = 3)),
  paste0("p = ", format(round(total_ab_aov2["destructive_time", "Pr(>F)"], 
                              3), 
                       nsmall = 3)),
  "Total Soil Fauna Abundance",
  "Block Effect",
  paste0("F", sub_digits(total_ab_aov2["block_effect", "Df"]), 
         "\u02CC", sub_digits(total_ab_aov2["Residuals", "Df"]), 
         " = ", format(round(total_ab_aov2["block_effect", "F value"], 3), 
                       nsmall = 3)),
  paste0("p = ", format(round(total_ab_aov2["block_effect", "Pr(>F)"], 3), 
                       nsmall = 3)),
  "Total Soil Microfauna Abundance",
  "Intercept",
  paste0("F", sub_digits(micro_ab_aov2["(Intercept)", "Df"]), 
         "\u02CC", sub_digits(micro_ab_aov2["Residuals", "Df"]), 
         " = ", format(round(micro_ab_aov2["(Intercept)", "F value"], 3), 
                       nsmall = 3)),
  paste0("p = ", format(round(micro_ab_aov2["(Intercept)", "Pr(>F)"], 3), 
                       nsmall = 3)),
  "Total Soil Microfauna Abundance",
  "Soil Moisture Treatment",
  paste0("F", sub_digits(micro_ab_aov2["moisture_tx", "Df"]), 
         "\u02CC", sub_digits(micro_ab_aov2["Residuals", "Df"]), 
         " = ", format(round(micro_ab_aov2["moisture_tx", "F value"], 3), 
                       nsmall = 3)),
  paste0("p = ", format(round(micro_ab_aov2["moisture_tx", "Pr(>F)"], 3), 
                       nsmall = 3)),
  "Total Soil Microfauna Abundance",
  "Temperature Treatment",
  paste0("F", sub_digits(micro_ab_aov2["temp_tx", "Df"]), 
         "\u02CC", sub_digits(micro_ab_aov2["Residuals", "Df"]), 
         " = ", format(round(micro_ab_aov2["temp_tx", "F value"], 3), 
                       nsmall = 3)),
  paste0("p = ", format(round(micro_ab_aov2["temp_tx", "Pr(>F)"], 3), 
                       nsmall = 3)),
  "Total Soil Microfauna Abundance",
  "Destructive Sampling Treatment",
  paste0("F", sub_digits(micro_ab_aov2["destructive_time", "Df"]), 
         "\u02CC", sub_digits(micro_ab_aov2["Residuals", "Df"]), 
         " = ", format(round(micro_ab_aov2["destructive_time", "F value"], 
                             3), 
                       nsmall = 3)),
  paste0("p = ", format(round(micro_ab_aov2["destructive_time", "Pr(>F)"], 
                              3), 
                       nsmall = 3)),
  "Total Soil Microfauna Abundance",
  "Block Effect",
  paste0("F", sub_digits(micro_ab_aov2["block_effect", "Df"]), 
         "\u02CC", sub_digits(micro_ab_aov2["Residuals", "Df"]), 
         " = ", format(round(micro_ab_aov2["block_effect", "F value"], 3), 
                       nsmall = 3)),
  paste0("p = ", format(round(micro_ab_aov2["block_effect", "Pr(>F)"], 3), 
                       nsmall = 3)),
  "Total Soil Mesofauna Abundance",
  "Intercept",
  paste0("F", sub_digits(meso_ab_aov2["(Intercept)", "Df"]), 
         "\u02CC", sub_digits(meso_ab_aov2["Residuals", "Df"]), 
         " = ", format(round(meso_ab_aov2["(Intercept)", "F value"], 3), 
                       nsmall = 3)),
  paste0("p = ", format(round(meso_ab_aov2["(Intercept)", "Pr(>F)"], 3), 
                       nsmall = 3)),
  "Total Soil Mesofauna Abundance",
  "Soil Moisture Treatment",
  paste0("F", sub_digits(meso_ab_aov2["moisture_tx", "Df"]), 
         "\u02CC", sub_digits(meso_ab_aov2["Residuals", "Df"]), 
         " = ", format(round(meso_ab_aov2["moisture_tx", "F value"], 3), 
                       nsmall = 3)),
  paste0("p = ", format(round(meso_ab_aov2["moisture_tx", "Pr(>F)"], 3), 
                       nsmall = 3)),
  "Total Soil Mesofauna Abundance",
  "Temperature Treatment",
  paste0("F", sub_digits(meso_ab_aov2["temp_tx", "Df"]), 
         "\u02CC", sub_digits(meso_ab_aov2["Residuals", "Df"]), 
         " = ", format(round(meso_ab_aov2["temp_tx", "F value"], 3), 
                       nsmall = 3)),
  paste0("p = ", format(round(meso_ab_aov2["temp_tx", "Pr(>F)"], 3), 
                       nsmall = 3)),
  "Total Soil Mesofauna Abundance",
  "Destructive Sampling Treatment",
  paste0("F", sub_digits(meso_ab_aov2["destructive_time", "Df"]), 
         "\u02CC", sub_digits(meso_ab_aov2["Residuals", "Df"]), 
         " = ", format(round(meso_ab_aov2["destructive_time", "F value"], 
                             3), 
                       nsmall = 3)),
  paste0("p = ", format(round(meso_ab_aov2["destructive_time", "Pr(>F)"], 
                              3), 
                       nsmall = 3)),
  "Total Soil Mesofauna Abundance",
  "Block Effect",
  paste0("F", sub_digits(meso_ab_aov2["block_effect", "Df"]), 
         "\u02CC", sub_digits(meso_ab_aov2["Residuals", "Df"]), 
         " = ", format(round(meso_ab_aov2["block_effect", "F value"], 3), 
                       nsmall = 3)),
  paste0("p = ", format(round(meso_ab_aov2["block_effect", "Pr(>F)"], 3), 
                       nsmall = 3)),
  "Total Soil Mesofauna Abundance",
  "Temperature x Destructive Sampling Interaction",
  paste0("F", sub_digits(meso_ab_aov2["temp_tx:destructive_time", "Df"]), 
         "\u02CC", sub_digits(meso_ab_aov2["Residuals", "Df"]), 
         " = ", format(round(meso_ab_aov2["temp_tx:destructive_time", 
                                         "F value"], 
                             3), 
                       nsmall = 3)),
  paste0("p = ", format(round(meso_ab_aov2["temp_tx:destructive_time", 
                                          "Pr(>F)"], 
                              3), 
                       nsmall = 3))
), ncol = 4, byrow = T))

colnames(abundance_aov_tbl) <- c("Experimental Parameter","Test Parameter", 
                                 "Statistic", "P-Value")

knitr::kable(abundance_aov_tbl)
Experimental Parameter Test Parameter Statistic P-Value
Total Soil Fauna Abundance Intercept F₁ˌ₃₄ = 57.927 p = 0.000
Total Soil Fauna Abundance Soil Moisture Treatment F₁ˌ₃₄ = 19.104 p = 0.000
Total Soil Fauna Abundance Temperature Treatment F₁ˌ₃₄ = 0.509 p = 0.481
Total Soil Fauna Abundance Destructive Sampling Treatment F₁ˌ₃₄ = 0.466 p = 0.499
Total Soil Fauna Abundance Block Effect F₁ˌ₃₄ = 22.953 p = 0.000
Total Soil Microfauna Abundance Intercept F₁ˌ₃₄ = 23.738 p = 0.000
Total Soil Microfauna Abundance Soil Moisture Treatment F₁ˌ₃₄ = 21.152 p = 0.000
Total Soil Microfauna Abundance Temperature Treatment F₁ˌ₃₄ = 0.403 p = 0.530
Total Soil Microfauna Abundance Destructive Sampling Treatment F₁ˌ₃₄ = 0.966 p = 0.333
Total Soil Microfauna Abundance Block Effect F₁ˌ₃₄ = 11.168 p = 0.002
Total Soil Mesofauna Abundance Intercept F₁ˌ₃₃ = 4938.218 p = 0.000
Total Soil Mesofauna Abundance Soil Moisture Treatment F₁ˌ₃₃ = 6.142 p = 0.018
Total Soil Mesofauna Abundance Temperature Treatment F₁ˌ₃₃ = 2.821 p = 0.103
Total Soil Mesofauna Abundance Destructive Sampling Treatment F₁ˌ₃₃ = 1.968 p = 0.170
Total Soil Mesofauna Abundance Block Effect F₁ˌ₃₃ = 11.936 p = 0.002
Total Soil Mesofauna Abundance Temperature x Destructive Sampling Interaction F₁ˌ₃₃ = 4.276 p = 0.047


cor_micro_meso_biom <- 
  cor.test(biomass_T1uT2$micro_biomass,
         biomass_T1uT2$meso_biomass, method = "pearson")

cor_micro_total_biom <- 
  cor.test(biomass_T1uT2$micro_biomass,
         biomass_T1uT2$total_biomass, method = "pearson")

cor_meso_total_biom <- 
  cor.test(biomass_T1uT2$meso_biomass,
         biomass_T1uT2$total_biomass, method = "pearson")

total_biom_aov2 <- Anova(total_biom_lm2, type = 'III')

micro_biom_aov2 <- Anova(micro_biom_lm2, type = 'III')

meso_biom_aov2 <- Anova(meso_biom_lm2, type = 'III')


Following trends in soil fauna abundance, total soil microfauna and mesofauna biomasses were significantly correlated (R42 = 0.460, p = 0.002) as was total soil microfauna (R42 = 0.478, p = 0.001) and mesofauna (R42 = 0.999, p < 0.001) biomasses with total faunal biomass. Mean total biomass (Figure 3.4B) was strongly related to the original sampling location (F1,33 = 17.288, p < 0.001). Total biomass was significantly reduced saturated conditions (F1,33 = 8.631, p = 0.006). This was driven by a significant decrease in both soil microfauna (F1,34 = 21.152, p < 0.001) and mesofauna (F1,33 = 8.266, p = 0.007). Total biomass was not influenced by temperature conditions (F1,33 = 0.076, p = 0.784) nor the timing of destructive sampling (F1,33 = 1.375, p = 0.249). Soil microfauna biomass was not influenced by significant interaction effects (Appendix E), but total fauna (F1,33 = 3.386, p = 0.075) and soil mesofauna (F1,33 = 3.439, p = 0.073) biomasses exhibited weak soil moisture by destructive sampling time interaction effects. This suggests that the biomasses of total fauna and soil mesofauna in mesocosms assigned to saturated conditions tended to increase from T1 to T2 following a three-week return to initial field-moist conditions. Overall, mean total biomass (± SE) was greatest (0.49 ± 0.10 g of C per m2 per year) in mesocosms assigned to 12 °C field-moist conditions, sampled at T1 and was least (0.25 ± 0.07 g of C per m2 per year) in those assigned to 12 °C saturated conditions, sampled at T1 (see Appendix D). Estimates of effect size based on a linear model are given in Appendix F.

Supplemental Table 3.15

Total soil fauna, microfauna, and mesofauna biomass Pearson’s Test results.

biom_cor_df <- as.data.frame(matrix(data = c(
  "Total Soil Microfauna Biomass",
  "Total Soil Mesofauna Biomass",
  paste0("R", sub_digits(cor_micro_meso_biom$parameter), " = ", 
         format(round(cor_micro_meso_biom$estimate, 3), 
         nsmall = 3)),
  paste0("p = ", 
         format(round(cor_micro_meso_biom$p.value, 3),
         nsmall = 3)),
  "Total Soil Microfauna Biomass",
  "Total Soil Fauna Biomass",
  paste0("R", sub_digits(cor_micro_total_biom$parameter), " = ", 
         format(round(cor_micro_total_biom$estimate, 3), 
         nsmall = 3)),
  paste0("p = ", 
         format(round(cor_micro_total_biom$p.value, 3),
         nsmall = 3)),
  "Total Soil Mesofauna Biomass",
  "Total Soil Fauna Biomass",
  paste0("R", sub_digits(cor_meso_total_biom$parameter), " = ", 
         format(round(cor_meso_total_biom$estimate, 3), 
         nsmall = 3)),
  paste0("p = ", 
         format(round(cor_meso_total_biom$p.value, 3),
         nsmall = 3))
  ), ncol = 4, byrow = T))

colnames(biom_cor_df) <- 
  c("Variable 1", "Variable 2", "Statistic", "P-Value")

knitr::kable(biom_cor_df, linesep = "\\hline")
Variable 1 Variable 2 Statistic P-Value
Total Soil Microfauna Biomass Total Soil Mesofauna Biomass R₃₇ = 0.438 p = 0.005
Total Soil Microfauna Biomass Total Soil Fauna Biomass R₃₇ = 0.459 p = 0.003
Total Soil Mesofauna Biomass Total Soil Fauna Biomass R₃₇ = 1.000 p = 0.000


Supplemental Table 3.16

Total soil fauna, microfauna, and mesofauna biomass ANOVA results.

biom_aov_tbl <- as.data.frame(matrix(data = c(
  "Total Soil Fauna Biomass",
  "Intercept",
  paste0("F", sub_digits(total_biom_aov2["(Intercept)", "Df"]), 
         "\u02CC", sub_digits(total_biom_aov2["Residuals", "Df"]), 
         " = ", format(round(total_biom_aov2["(Intercept)", "F value"], 3), 
                       nsmall = 3)),
  paste0("p = ", format(round(total_biom_aov2["(Intercept)", "Pr(>F)"], 3), 
                       nsmall = 3)),
  "Total Soil Fauna Biomass",
  "Soil Moisture Treatment",
  paste0("F", sub_digits(total_biom_aov2["moisture_tx", "Df"]), 
         "\u02CC", sub_digits(total_biom_aov2["Residuals", "Df"]), 
         " = ", format(round(total_biom_aov2["moisture_tx", "F value"], 3), 
                       nsmall = 3)),
  paste0("p = ", format(round(total_biom_aov2["moisture_tx", "Pr(>F)"], 3), 
                       nsmall = 3)),
  "Total Soil Fauna Biomass",
  "Temperature Treatment",
  paste0("F", sub_digits(total_biom_aov2["temp_tx", "Df"]), 
         "\u02CC", sub_digits(total_biom_aov2["Residuals", "Df"]), 
         " = ", format(round(total_biom_aov2["temp_tx", "F value"], 3), 
                       nsmall = 3)),
  paste0("p = ", format(round(total_biom_aov2["temp_tx", "Pr(>F)"], 3), 
                       nsmall = 3)),
  "Total Soil Fauna Biomass",
  "Destructive Sampling Treatment",
  paste0("F", sub_digits(total_biom_aov2["destructive_time", "Df"]), 
         "\u02CC", sub_digits(total_biom_aov2["Residuals", "Df"]), 
         " = ", format(round(total_biom_aov2["destructive_time", "F value"], 
                             3), 
                       nsmall = 3)),
  paste0("p = ", format(round(total_biom_aov2["destructive_time", "Pr(>F)"], 
                              3), 
                       nsmall = 3)),
  "Total Soil Fauna Biomass",
  "Block Effect",
  paste0("F", sub_digits(total_biom_aov2["block_effect", "Df"]), 
         "\u02CC", sub_digits(total_biom_aov2["Residuals", "Df"]), 
         " = ", format(round(total_biom_aov2["block_effect", "F value"], 3), 
                       nsmall = 3)),
  paste0("p = ", format(round(total_biom_aov2["block_effect", "Pr(>F)"], 3), 
                       nsmall = 3)),
  "Total Soil Fauna Biomass",
  "Soil Moisture x Destructive Sampling Interaction",
  paste0("F", sub_digits(total_biom_aov2["moisture_tx:destructive_time", "Df"]), 
         "\u02CC", sub_digits(total_biom_aov2["Residuals", "Df"]), 
         " = ", format(round(total_biom_aov2["moisture_tx:destructive_time", 
                                         "F value"], 
                             3), 
                       nsmall = 3)),
  paste0("p = ", format(round(total_biom_aov2["moisture_tx:destructive_time", 
                                          "Pr(>F)"], 
                              3), 
                       nsmall = 3)),
  "Total Soil Microfauna Biomass",
  "Intercept",
  paste0("F", sub_digits(micro_biom_aov2["(Intercept)", "Df"]), 
         "\u02CC", sub_digits(micro_biom_aov2["Residuals", "Df"]), 
         " = ", format(round(micro_biom_aov2["(Intercept)", "F value"], 3), 
                       nsmall = 3)),
  paste0("p = ", format(round(micro_biom_aov2["(Intercept)", "Pr(>F)"], 3), 
                       nsmall = 3)),
  "Total Soil Microfauna Biomass",
  "Soil Moisture Treatment",
  paste0("F", sub_digits(micro_biom_aov2["moisture_tx", "Df"]), 
         "\u02CC", sub_digits(micro_biom_aov2["Residuals", "Df"]), 
         " = ", format(round(micro_biom_aov2["moisture_tx", "F value"], 3), 
                       nsmall = 3)),
  paste0("p = ", format(round(micro_biom_aov2["moisture_tx", "Pr(>F)"], 3), 
                       nsmall = 3)),
  "Total Soil Microfauna Biomass",
  "Temperature Treatment",
  paste0("F", sub_digits(micro_biom_aov2["temp_tx", "Df"]), 
         "\u02CC", sub_digits(micro_biom_aov2["Residuals", "Df"]), 
         " = ", format(round(micro_biom_aov2["temp_tx", "F value"], 3), 
                       nsmall = 3)),
  paste0("p = ", format(round(micro_biom_aov2["temp_tx", "Pr(>F)"], 3), 
                       nsmall = 3)),
  "Total Soil Microfauna Biomass",
  "Destructive Sampling Treatment",
  paste0("F", sub_digits(micro_biom_aov2["destructive_time", "Df"]), 
         "\u02CC", sub_digits(micro_biom_aov2["Residuals", "Df"]), 
         " = ", format(round(micro_biom_aov2["destructive_time", "F value"], 
                             3), 
                       nsmall = 3)),
  paste0("p = ", format(round(micro_biom_aov2["destructive_time", "Pr(>F)"], 
                              3), 
                       nsmall = 3)),
  "Total Soil Microfauna Biomass",
  "Block Effect",
  paste0("F", sub_digits(micro_biom_aov2["block_effect", "Df"]), 
         "\u02CC", sub_digits(micro_biom_aov2["Residuals", "Df"]), 
         " = ", format(round(micro_biom_aov2["block_effect", "F value"], 3), 
                       nsmall = 3)),
  paste0("p = ", format(round(micro_biom_aov2["block_effect", "Pr(>F)"], 3), 
                       nsmall = 3)),
  "Total Soil Mesofauna Biomass",
  "Intercept",
  paste0("F", sub_digits(meso_biom_aov2["(Intercept)", "Df"]), 
         "\u02CC", sub_digits(meso_biom_aov2["Residuals", "Df"]), 
         " = ", format(round(meso_biom_aov2["(Intercept)", "F value"], 3), 
                       nsmall = 3)),
  paste0("p = ", format(round(meso_biom_aov2["(Intercept)", "Pr(>F)"], 3), 
                       nsmall = 3)),
  "Total Soil Mesofauna Biomass",
  "Soil Moisture Treatment",
  paste0("F", sub_digits(meso_biom_aov2["moisture_tx", "Df"]), 
         "\u02CC", sub_digits(meso_biom_aov2["Residuals", "Df"]), 
         " = ", format(round(meso_biom_aov2["moisture_tx", "F value"], 3), 
                       nsmall = 3)),
  paste0("p = ", format(round(meso_biom_aov2["moisture_tx", "Pr(>F)"], 3), 
                       nsmall = 3)),
  "Total Soil Mesofauna Biomass",
  "Temperature Treatment",
  paste0("F", sub_digits(meso_biom_aov2["temp_tx", "Df"]), 
         "\u02CC", sub_digits(meso_biom_aov2["Residuals", "Df"]), 
         " = ", format(round(meso_biom_aov2["temp_tx", "F value"], 3), 
                       nsmall = 3)),
  paste0("p = ", format(round(meso_biom_aov2["temp_tx", "Pr(>F)"], 3), 
                       nsmall = 3)),
  "Total Soil Mesofauna Biomass",
  "Destructive Sampling Treatment",
  paste0("F", sub_digits(meso_biom_aov2["destructive_time", "Df"]), 
         "\u02CC", sub_digits(meso_biom_aov2["Residuals", "Df"]), 
         " = ", format(round(meso_biom_aov2["destructive_time", "F value"], 
                             3), 
                       nsmall = 3)),
  paste0("p = ", format(round(meso_biom_aov2["destructive_time", "Pr(>F)"], 
                              3), 
                       nsmall = 3)),
  "Total Soil Mesofauna Biomass",
  "Block Effect",
  paste0("F", sub_digits(meso_biom_aov2["block_effect", "Df"]), 
         "\u02CC", sub_digits(meso_biom_aov2["Residuals", "Df"]), 
         " = ", format(round(meso_biom_aov2["block_effect", "F value"], 3), 
                       nsmall = 3)),
  paste0("p = ", format(round(meso_biom_aov2["block_effect", "Pr(>F)"], 3), 
                       nsmall = 3)),
  "Total Soil Mesofauna Biomass",
  "Soil Moisture x Destructive Sampling Interaction",
  paste0("F", sub_digits(meso_biom_aov2["moisture_tx:destructive_time", "Df"]), 
         "\u02CC", sub_digits(meso_biom_aov2["Residuals", "Df"]), 
         " = ", format(round(meso_biom_aov2["moisture_tx:destructive_time", 
                                         "F value"], 
                             3), 
                       nsmall = 3)),
  paste0("p = ", format(round(meso_biom_aov2["moisture_tx:destructive_time", 
                                          "Pr(>F)"], 
                              3), 
                       nsmall = 3))
), ncol = 4, byrow = T))

colnames(biom_aov_tbl) <- c("Experimental Parameter","Test Parameter", 
                                 "Statistic", "P-Value")

knitr::kable(biom_aov_tbl)
Experimental Parameter Test Parameter Statistic P-Value
Total Soil Fauna Biomass Intercept F₁ˌ₃₃ = 58.915 p = 0.000
Total Soil Fauna Biomass Soil Moisture Treatment F₁ˌ₃₃ = 8.631 p = 0.006
Total Soil Fauna Biomass Temperature Treatment F₁ˌ₃₃ = 0.076 p = 0.784
Total Soil Fauna Biomass Destructive Sampling Treatment F₁ˌ₃₃ = 1.375 p = 0.249
Total Soil Fauna Biomass Block Effect F₁ˌ₃₃ = 17.287 p = 0.000
Total Soil Fauna Biomass Soil Moisture x Destructive Sampling Interaction F₁ˌ₃₃ = 3.386 p = 0.075
Total Soil Microfauna Biomass Intercept F₁ˌ₃₄ = 23.738 p = 0.000
Total Soil Microfauna Biomass Soil Moisture Treatment F₁ˌ₃₄ = 21.152 p = 0.000
Total Soil Microfauna Biomass Temperature Treatment F₁ˌ₃₄ = 0.403 p = 0.530
Total Soil Microfauna Biomass Destructive Sampling Treatment F₁ˌ₃₄ = 0.966 p = 0.333
Total Soil Microfauna Biomass Block Effect F₁ˌ₃₄ = 11.168 p = 0.002
Total Soil Mesofauna Biomass Intercept F₁ˌ₃₃ = 57.803 p = 0.000
Total Soil Mesofauna Biomass Soil Moisture Treatment F₁ˌ₃₃ = 8.266 p = 0.007
Total Soil Mesofauna Biomass Temperature Treatment F₁ˌ₃₃ = 0.069 p = 0.795
Total Soil Mesofauna Biomass Destructive Sampling Treatment F₁ˌ₃₃ = 1.440 p = 0.239
Total Soil Mesofauna Biomass Block Effect F₁ˌ₃₃ = 16.758 p = 0.000
Total Soil Mesofauna Biomass Soil Moisture x Destructive Sampling Interaction F₁ˌ₃₃ = 3.439 p = 0.073


3.6 Community Composition and Similarity Among Treatments

Figure 3.5

Non-metric multidimensional scaling plot of mesocosm similarity at T1.

# T1 NMDS
# build the plot
make_mds_plotA <- function(ord, metadata) {

  plot_fun <- function() {

    op <- ordiplot(ord, type = "none",
                   xlab = "NMDS 1", ylab = "NMDS 2",
                   xlim = c(-0.8, 0.8), ylim = c(-0.8, 0.8))

    points(op, "sites", pch = 19, cex = 1.5, col = "green4",
           select = metadata$moisture_tx == "Field-Moist")

    points(op, "sites", pch = 19, cex = 1.5, col = "blue",
           select = metadata$moisture_tx == "Saturated")

    ordiellipse(
      ord,
      metadata$moisture_tx,
      conf = 0.95,
      col = c("green4", "blue"),
      lwd = 2,
      label = FALSE,
      draw = "lines"
    )

    legend("topright",
           legend = c("Field-Moist", "Saturated"),
           pch = 19,
           col = c("green4", "blue"),
           pt.cex = 1.5,
           bty = "n")
  }

  gridGraphics::echoGrob(plot_fun)
}

make_mds_plotB <- function(ord, metadata) {

  plot_fun <- function() {

    op <- ordiplot(ord, type = "none",
                   xlab = "NMDS 1", ylab = "NMDS 2",
                   xlim = c(-0.8, 0.8), ylim = c(-0.8, 0.8))

    points(op, "sites", pch = 19, cex = 1.5, col = "peru",
           select = metadata$temp_tx == "12 \u00B0C")

    points(op, "sites", pch = 19, cex = 1.5, col = "red4",
           select = metadata$temp_tx == "20 \u00B0C")

    ordiellipse(
      ord,
      metadata$temp_tx,
      conf = 0.95,
      col = c("peru", "red4"),
      lwd = 2,
      label = FALSE,
      draw = "lines"
    )

    legend("topright",
           legend = c("12 \u00B0C", "20 \u00B0C"),
           pch = 19,
           col = c("peru", "red4"),
           pt.cex = 1.5,
           bty = "n")
  }

  gridGraphics::echoGrob(plot_fun)
}

mds.fig_T1A <- make_mds_plotA(T1.mds, metadata_T1)
mds.fig_T1B <- make_mds_plotB(T1.mds, metadata_T1)

plot_grid(
  mds.fig_T1A,
  mds.fig_T1B,
  ncol = 1,
  align = "v",
  rel_heights = c(1, 1),  # adjust ratio if needed
  labels = c("A", "B"),      # labels for each plot
  label_x = 0.058,
  label_y = 0.95
)
Non-metric multidimensional scaling plot of mesocosm similarity at T~1~. (A) mesocosms show significant dissimilarity in community composition between field-moist and saturated moisture conditions; (B) mesocosms show similarity in community composition between temperature treatments. Stress = 0.114. Ellipses represent 95% CI based on similarity between samples.

Non-metric multidimensional scaling plot of mesocosm similarity at T1. (A) mesocosms show significant dissimilarity in community composition between field-moist and saturated moisture conditions; (B) mesocosms show similarity in community composition between temperature treatments. Stress = 0.114. Ellipses represent 95% CI based on similarity between samples.


abundances_T1 <- abundance_data %>% filter(destructive_time == "T1") 
abundances.divT1 <- adonis2(abundances_T1$total_ab_standardized ~ 
                            (moisture_tx*temp_tx) + 
                              block_effect, data = abundances_T1, 
                            permutations = 999, method="bray")


Reductions in total fauna abundance under saturated soil moisture conditions were driven by Mesostigmata, Collembola, and juvenile and adult oribatid mites at T1 (Appendix C). In all cases the reductions under saturated conditions were more pronounced at 12 °C than 20 °C, with Collembola completely absent in 12 °C saturated mesocosms. Warmer temperatures slightly increased juvenile Oribatida. Thus, moisture conditions had a significant effect (PerMANOVA F1,17 = 3.23, p= 0.045) on the overall community composition of the fauna (Figure 3.5A). Mesocosms were also significant different depending on where they were initially sampled (i.e., block effect PerMANOVA F1,17 = 4.35, p= 0.009). Temperature did not significantly affect community composition; however, the community was much more homogeneous under warmed (20 °C) conditions (Figure 3.5B).

Supplemental Table 3.17

T1 Community PerMANOVA results.

T1_permanova_tbl <- as.data.frame(matrix(data = c(
  "Soil Moisture Treatment",
  paste0("F", sub_digits(abundances.divT1["moisture_tx", "Df"]), 
         "\u02CC", sub_digits(abundances.divT1["Residual", "Df"]), 
         " = ", format(round(abundances.divT1["moisture_tx", "F"], 3), 
                       nsmall = 3)),
  paste0("p = ", format(round(abundances.divT1["moisture_tx", "Pr(>F)"], 3), 
                       nsmall = 3)),
  "Temperature Treatment",
  paste0("F", sub_digits(abundances.divT1["temp_tx", "Df"]), 
         "\u02CC", sub_digits(abundances.divT1["Residual", "Df"]), 
         " = ", format(round(abundances.divT1["temp_tx", "F"], 3), 
                       nsmall = 3)),
  paste0("p = ", format(round(abundances.divT1["temp_tx", "Pr(>F)"], 3), 
                       nsmall = 3)),
  "Block Effect",
  paste0("F", sub_digits(abundances.divT1["block_effect", "Df"]), 
         "\u02CC", sub_digits(abundances.divT1["Residual", "Df"]), 
         " = ", format(round(abundances.divT1["block_effect", "F"], 3), 
                       nsmall = 3)),
  paste0("p = ", format(round(abundances.divT1["block_effect", "Pr(>F)"], 3), 
                       nsmall = 3)),
  "Soil Moisture x Temperature Interaction",
  paste0("F", sub_digits(abundances.divT1["moisture_tx:temp_tx", 
                                          "Df"]), 
         "\u02CC", sub_digits(abundances.divT1["Residual", "Df"]), 
         " = ", format(round(abundances.divT1["moisture_tx:temp_tx", 
                                         "F"], 
                             3), 
                       nsmall = 3)),
  paste0("p = ", format(round(abundances.divT1["moisture_tx:temp_tx", 
                                          "Pr(>F)"], 
                              3), 
                       nsmall = 3))
), ncol = 3, byrow = T))

colnames(T1_permanova_tbl) <- c("Parameter", "Statistic", "P-Value")

knitr::kable(T1_permanova_tbl)
Parameter Statistic P-Value
Soil Moisture Treatment F₁ˌ₁₄ = 6.530 p = 0.017
Temperature Treatment F₁ˌ₁₄ = 3.059 p = 0.074
Block Effect F₁ˌ₁₄ = 13.355 p = 0.001
Soil Moisture x Temperature Interaction F₁ˌ₁₄ = 0.547 p = 0.523



Figure 3.6

Non-metric multidimensional scaling plot of mesocosm similarity at T2.

mds.fig_T2A <- make_mds_plotA(T2.mds, metadata_T2)
mds.fig_T2B <- make_mds_plotB(T2.mds, metadata_T2)

plot_grid(
  mds.fig_T2A,
  mds.fig_T2B,
  ncol = 1,
  align = "v",
  rel_heights = c(1, 1),  # adjust ratio if needed
  labels = c("A", "B"),      # labels for each plot
  label_x = 0.058,
  label_y = 0.95
)
Non-metric multidimensional scaling plot of mesocosm similarity at T~2~. (A) mesocosms show significant dissimilarity in community composition between field-moist and saturated moisture conditions; (B) mesocosms show similarity in community composition between temperature treatments. Stress = 0.146. Ellipses represent 95% CI based on similarity between samples.

Non-metric multidimensional scaling plot of mesocosm similarity at T2. (A) mesocosms show significant dissimilarity in community composition between field-moist and saturated moisture conditions; (B) mesocosms show similarity in community composition between temperature treatments. Stress = 0.146. Ellipses represent 95% CI based on similarity between samples.


abundances_T2 <- abundance_data %>% filter(destructive_time == "T2") 
abundances.divT2 <- adonis2(abundances_T2$total_ab_standardized ~ 
                              (moisture_tx*temp_tx), 
                            data = abundances_T2, permutations = 999, 
                            method="bray")


The soil food web fauna remained significantly different between the mesocosms that received saturated conditions vs. those under field-moist conditions even after three weeks recovery (T2) time (Moisture effect PerMANOVA F1,18 = 5.64, p= 0.003; Figure 3.6A). The experimental effects of temperature treatment did not significantly affect the soil fauna community composition, and the trend towards homogeneity under increased temperature treatment was not observed following the T2 recovery period (Figure 3.6B).

Supplemental Table 3.18

T2 Community PerMANOVA results.

T2_permanova_tbl <- as.data.frame(matrix(data = c(
  "Soil Moisture Treatment",
  paste0("F", sub_digits(abundances.divT2["moisture_tx", "Df"]), 
         "\u02CC", sub_digits(abundances.divT2["Residual", "Df"]), 
         " = ", format(round(abundances.divT2["moisture_tx", "F"], 3), 
                       nsmall = 3)),
  paste0("p = ", format(round(abundances.divT2["moisture_tx", "Pr(>F)"], 3), 
                       nsmall = 3)),
  "Temperature Treatment",
  paste0("F", sub_digits(abundances.divT2["temp_tx", "Df"]), 
         "\u02CC", sub_digits(abundances.divT2["Residual", "Df"]), 
         " = ", format(round(abundances.divT2["temp_tx", "F"], 3), 
                       nsmall = 3)),
  paste0("p = ", format(round(abundances.divT2["temp_tx", "Pr(>F)"], 3), 
                       nsmall = 3)),
  "Soil Moisture x Temperature Interaction",
  paste0("F", sub_digits(abundances.divT2["moisture_tx:temp_tx", 
                                          "Df"]), 
         "\u02CC", sub_digits(abundances.divT2["Residual", "Df"]), 
         " = ", format(round(abundances.divT2["moisture_tx:temp_tx", 
                                         "F"], 
                             3), 
                       nsmall = 3)),
  paste0("p = ", format(round(abundances.divT2["moisture_tx:temp_tx", 
                                          "Pr(>F)"], 
                              3), 
                       nsmall = 3))
), ncol = 3, byrow = T))

colnames(T2_permanova_tbl) <- c("Parameter", "Statistic", "P-Value")

knitr::kable(T2_permanova_tbl)
Parameter Statistic P-Value
Soil Moisture Treatment F₁ˌ₁₆ = 5.858 p = 0.022
Temperature Treatment F₁ˌ₁₆ = 0.502 p = 0.538
Soil Moisture x Temperature Interaction F₁ˌ₁₆ = 0.780 p = 0.436


3.7 Soil Food Web Carbon and Nitrogen Flux

Figure 3.7

Modeled rates of (A) carbon flux (consumption), (B) carbon mineralization (respiration), and (C) nitrogen mineralization.

flux_data_T1uT2 <- flux_data %>%
  filter(!destructive_time == "T0") %>%
  filter(!Sample_ID == "ExRes 5")

flux_data_T1uT2$tx <- interaction(flux_data_T1uT2$temp_tx, 
                                  flux_data_T1uT2$moisture_tx) 

flux_data_T1uT2 <- flux_data_T1uT2 %>%
  mutate(tx = fct_recode(tx,
    "12\u00B0 Field-Moist" = "12.Ambient",
    "20\u00B0 Field-Moist" = "20.Ambient",
    "12\u00B0 Saturated"   = "12.High",
    "20\u00B0 Saturated"   = "20.High"
  ))

ylab_consumption <- 
  "<span style='font-size:10pt'>Carbon<br>Flux<br>(g C / m<sup>2</sup> / yr)</span>"
ylab_Cmin  <- 
  "<span style='font-size:10pt'>Carbon Mineralization (g C / m<sup>2</sup> / yr)</span>"
ylab_Nmin  <- "
<span style='font-size:10pt'>Nitrogen Mineralization (g C / m<sup>2</sup> / yr)</span>"

consumption_plot <- 
  ggplot(flux_data_T1uT2, aes(x=tx, y=total_consumption, 
                            fill = as.factor(destructive_time))) + 
  geom_boxplot(outlier.shape=NA) + #avoid plotting outliers twice
  geom_jitter(aes(pch = as.factor(destructive_time)), 
              position=position_jitter(width=.1, height=0), size = 3) +
  theme(panel.grid.major = element_blank(), 
        panel.grid.minor = element_blank(),
        panel.background = element_blank(), 
        axis.line = element_line(colour = "black"),
        axis.title.y = element_textbox_simple(orientation="left-rotated",
                                              halign = 0.5,
                                              margin = margin(b = 15))) +
  scale_fill_brewer(palette = "Greys") +
  xlab("Environmental Treatment Condition") + 
  ylab(ylab_consumption) +
  labs(fill = "Sampling Time", pch = "Sampling Time")

Cmin_plot <- 
  ggplot(flux_data_T1uT2, aes(x=tx, y=total_Cmin, 
                            fill = as.factor(destructive_time))) + 
  geom_boxplot(outlier.shape=NA) + #avoid plotting outliers twice
  geom_jitter(aes(pch = as.factor(destructive_time)), 
              position=position_jitter(width=.1, height=0), size = 3) +
  theme(panel.grid.major = element_blank(), 
        panel.grid.minor = element_blank(),
        panel.background = element_blank(), 
        axis.line = element_line(colour = "black"),
        axis.title.y = element_textbox_simple(orientation="left-rotated",
                                              halign = 0.5,
                                              margin = margin(b = 15))) +
  scale_fill_brewer(palette = "Greys") +
  xlab("Environmental Treatment Condition") + 
  ylab(ylab_Cmin) +
  labs(fill = "Sampling Time", pch = "Sampling Time")

Nmin_plot <- 
  ggplot(flux_data_T1uT2, aes(x=tx, y=total_Nmin, 
                            fill = as.factor(destructive_time))) + 
  geom_boxplot(outlier.shape=NA) + #avoid plotting outliers twice
  geom_jitter(aes(pch = as.factor(destructive_time)), 
              position=position_jitter(width=.1, height=0), size = 3) +
  theme(panel.grid.major = element_blank(), 
        panel.grid.minor = element_blank(),
        panel.background = element_blank(), 
        axis.line = element_line(colour = "black"),
        axis.title.y = element_textbox_simple(orientation="left-rotated",
                                              halign = 0.5,
                                              margin = margin(b = 15))) +
  scale_fill_brewer(palette = "Greys") +
  xlab("Environmental Treatment Condition") + 
  ylab(ylab_Nmin) +
  labs(fill = "Sampling Time", pch = "Sampling Time")

f1 <- place_tag(consumption_plot, "A", x_left = 0.58)
f2 <- place_tag(Cmin_plot,            "B", x_left = 0.58)
f3 <- place_tag(Nmin_plot,            "C", x_left = 0.58)

(f1 / f2 / f3) +
  plot_layout(ncol = 1, guides = "collect") &
  theme(legend.position = "bottom")
Fluxes were modeled across experimental treatments of temperature (12 °C, 20 °C) and soil moisture (field-moist, saturated) destructively sampled after three-weeks (T~1~) or following three-week recovery period (T~2~). Letters denote significant differences between groups, as per Tukey’s HSD test.

Fluxes were modeled across experimental treatments of temperature (12 °C, 20 °C) and soil moisture (field-moist, saturated) destructively sampled after three-weeks (T1) or following three-week recovery period (T2). Letters denote significant differences between groups, as per Tukey’s HSD test.


consumption_lm <- lm(total_consumption ~
                          moisture_tx * temp_tx * destructive_time + 
                          moisture_tx * temp_tx +
                          moisture_tx * destructive_time + 
                          temp_tx * destructive_time +
                          moisture_tx +
                          temp_tx +
                          destructive_time +
                          block_effect,
                     data = flux_data_T1uT2)

consumption_lm2 <- lm(total_consumption ~
                        
                        
                        
                        temp_tx * destructive_time +
                        moisture_tx +
                        temp_tx +
                        destructive_time +
                        block_effect,
                data = flux_data_T1uT2)

Cmin_lm <- lm(total_Cmin ~
                          moisture_tx * temp_tx * destructive_time + 
                          moisture_tx * temp_tx +
                          moisture_tx * destructive_time + 
                          temp_tx * destructive_time +
                          moisture_tx +
                          temp_tx +
                          destructive_time +
                          block_effect,
                     data = flux_data_T1uT2)

Cmin_lm2 <- lm(total_Cmin ~
                
                
                
                temp_tx * destructive_time +
                moisture_tx +
                temp_tx +
                destructive_time +
                block_effect,
                data = flux_data_T1uT2)

Nmin_lm <- lm(total_Nmin ~
                        moisture_tx * temp_tx * destructive_time + 
                        moisture_tx * temp_tx +
                        moisture_tx * destructive_time + 
                        temp_tx * destructive_time +
                        moisture_tx +
                        temp_tx +
                        destructive_time +
                        block_effect,
                    data = flux_data_T1uT2)

Nmin_lm2 <- lm(total_Nmin ~
                
                
                
                temp_tx * destructive_time +
                moisture_tx +
                temp_tx +
                destructive_time +
                block_effect,
               data = flux_data_T1uT2)


Mean total consumptive flux, C mineralization, and N mineralization were compared across 39 mesocosms. Mean total consumptive flux (W = 0.988, p = 0.944), C mineralization (W = 0.987, p = 0.933), and N mineralization (W = 0.981, p = 0.751) met the assumption of normality, per a Shapiro-Wilk test. Mean total consumptive flux (F₇ˌ₃₁ = 0.719, p = 0.657), C mineralization (F₇ˌ₃₁ = 0.747, p = 0.635), and N mineralization (F₇ˌ₃₁ = 0.847, p = 0.558) also met the assumption of homogeneity of variance, per Levene’s test.

Supplemental Table 3.N

Shapiro-Wilk and Levene’s Tests constructed to test whether total consumptive flux, C mineralization, and N mineralization conform to the assumptions of normality and homodescacity.

flux_df1 <- as.data.frame(matrix(data = c(
  "Total Consumptive Flux",
  "Shapiro-Wilk Test", 
  paste0("W = ", 
         format(round(shapiro_test(residuals(consumption_lm2))$statistic, 3), 
         nsmall = 3)),
  paste0("p = ", 
         format(round(shapiro_test(residuals(consumption_lm2))$p.value, 3),
         nsmasll = 3)),
  "Total Consumptive Flux",
  "Levene's Test",
  paste0("F", sub_digits(
    levene_test(total_consumption ~ (moisture_tx * temp_tx * destructive_time), 
              data = flux_data_T1uT2)$df1), "\u02CC",
  sub_digits(
    levene_test(total_consumption ~ (moisture_tx * temp_tx * destructive_time), 
              data = flux_data_T1uT2)$df2), " = ",
  format(round(levene_test(total_consumption ~ 
                             (moisture_tx * temp_tx * destructive_time), 
              data = flux_data_T1uT2)$statistic, 3), nsmall = 3)),
  paste0("p = ", format(round(levene_test(total_consumption ~ 
                             (moisture_tx * temp_tx * destructive_time), 
              data = flux_data_T1uT2)$p, 3), nsmall = 3)),
  "Carbon Minderalization",
  "Shapiro-Wilk Test", 
  paste0("W = ", 
         format(round(shapiro_test(residuals(Cmin_lm2))$statistic, 3), 
         nsmall = 3)),
  paste0("p = ", 
         format(round(shapiro_test(residuals(Cmin_lm2))$p.value, 3),
         nsmasll = 3)),
  "Carbon Minderalization",
  "Levene's Test",
  paste0("F", sub_digits(
    levene_test(total_Cmin ~ (moisture_tx * temp_tx * destructive_time), 
              data = flux_data_T1uT2)$df1), "\u02CC",
  sub_digits(
    levene_test(total_Cmin ~ (moisture_tx * temp_tx * destructive_time), 
              data = flux_data_T1uT2)$df2), " = ",
  format(round(levene_test(total_Cmin ~ 
                             (moisture_tx * temp_tx * destructive_time), 
              data = flux_data_T1uT2)$statistic, 3), nsmall = 3)),
  paste0("p = ", format(round(levene_test(total_Cmin ~ 
                             (moisture_tx * temp_tx * destructive_time), 
              data = flux_data_T1uT2)$p, 3), nsmall = 3)),
  "Nitrogen Minderalization",
  "Shapiro-Wilk Test", 
  paste0("W = ", 
         format(round(shapiro_test(residuals(Nmin_lm2))$statistic, 3), 
         nsmall = 3)),
  paste0("p = ", 
         format(round(shapiro_test(residuals(Nmin_lm2))$p.value, 3),
         nsmasll = 3)),
  "Nitrogen Minderalization",
  "Levene's Test",
  paste0("F", sub_digits(
    levene_test(total_Nmin ~ (moisture_tx * temp_tx * destructive_time), 
              data = flux_data_T1uT2)$df1), "\u02CC",
  sub_digits(
    levene_test(total_Nmin ~ (moisture_tx * temp_tx * destructive_time), 
              data = flux_data_T1uT2)$df2), " = ",
  format(round(levene_test(total_Nmin ~ 
                             (moisture_tx * temp_tx * destructive_time), 
              data = flux_data_T1uT2)$statistic, 3), nsmall = 3)),
  paste0("p = ", format(round(levene_test(total_Nmin ~ 
                             (moisture_tx * temp_tx * destructive_time), 
              data = flux_data_T1uT2)$p, 3), nsmall = 3))
  ), ncol = 4, byrow = T))

colnames(flux_df1) <- 
  c("Parameter", "Test", "Statistic", "P-Value")

knitr::kable(flux_df1, linesep = "\\hline")
Parameter Test Statistic P-Value
Total Consumptive Flux Shapiro-Wilk Test W = 0.988 p = 0.944
Total Consumptive Flux Levene’s Test F₇ˌ₃₁ = 0.719 p = 0.657
Carbon Minderalization Shapiro-Wilk Test W = 0.987 p = 0.933
Carbon Minderalization Levene’s Test F₇ˌ₃₁ = 0.747 p = 0.635
Nitrogen Minderalization Shapiro-Wilk Test W = 0.981 p = 0.751
Nitrogen Minderalization Levene’s Test F₇ˌ₃₁ = 0.847 p = 0.558


consumption_aov2 <- Anova(consumption_lm2, type = 'III')


Mean total consumptive flux of C through the soil fauna food web (Figure 3.7A) was significantly related to block effects (F₁ˌ₃₃ = 6.267, p = 0.017), and was greater in blocks characterized by especially high soil fauna abundances. Total C flux also significantly decreased under saturation (F₁ˌ₃₃ = 8.653, p = 0.006), but significantly increased at 20 °C vs. 12 °C (F₁ˌ₃₃ = 214.881, p = 0.000). This was driven by a significant temperature-by-sampling time interaction effect (F₁ˌ₃₃ = 94.744, p = 0.000), which highlights that mean total flux in mesocosms assigned to 20 °C decreased at T2 following a three-week return to 12 °C field-moist conditions. Destructive sampling treatments alone did not significantly affect C flux (F₁ˌ₃₃ = 0.748, p = 0.393). No other interaction effects significantly affected C flux (Appendix E). Mean total flux (± SE) under each treatment is presented in Appendix D. Estimates of effect size based on a linear model are given in Appendix F.

Supplemental Table N+1

Total consumptive flux ANOVA results.

total_consumption_aov_tbl <- as.data.frame(matrix(data = c(
  "Intercept",
  paste0("F", sub_digits(consumption_aov2["(Intercept)", "Df"]), 
         "\u02CC", sub_digits(consumption_aov2["Residuals", "Df"]), 
         " = ", format(round(consumption_aov2["(Intercept)", "F value"], 3), 
                       nsmall = 3)),
  paste0("p = ", format(round(consumption_aov2["(Intercept)", "Pr(>F)"], 3), 
                       nsmall = 3)),
  "Soil Moisture Treatment",
  paste0("F", sub_digits(consumption_aov2["moisture_tx", "Df"]), 
         "\u02CC", sub_digits(consumption_aov2["Residuals", "Df"]), 
         " = ", format(round(consumption_aov2["moisture_tx", "F value"], 3), 
                       nsmall = 3)),
  paste0("p = ", format(round(consumption_aov2["moisture_tx", "Pr(>F)"], 3), 
                       nsmall = 3)),
  "Temperature Treatment",
  paste0("F", sub_digits(consumption_aov2["temp_tx", "Df"]), 
         "\u02CC", sub_digits(consumption_aov2["Residuals", "Df"]), 
         " = ", format(round(consumption_aov2["temp_tx", "F value"], 3), 
                       nsmall = 3)),
  paste0("p = ", format(round(consumption_aov2["temp_tx", "Pr(>F)"], 3), 
                       nsmall = 3)),
  "Destructive Sampling Treatment",
  paste0("F", sub_digits(consumption_aov2["destructive_time", "Df"]), 
         "\u02CC", sub_digits(consumption_aov2["Residuals", "Df"]), 
         " = ", format(round(consumption_aov2["destructive_time", "F value"], 
                             3), 
                       nsmall = 3)),
  paste0("p = ", format(round(consumption_aov2["destructive_time", "Pr(>F)"], 
                              3), 
                       nsmall = 3)),
  "Block Effect",
  paste0("F", sub_digits(consumption_aov2["block_effect", "Df"]), 
         "\u02CC", sub_digits(consumption_aov2["Residuals", "Df"]), 
         " = ", format(round(consumption_aov2["block_effect", "F value"], 3), 
                       nsmall = 3)),
  paste0("p = ", format(round(consumption_aov2["block_effect", "Pr(>F)"], 3), 
                       nsmall = 3)),
  "Temperature x Destructive Sampling Interaction",
  paste0("F", sub_digits(consumption_aov2["temp_tx:destructive_time", "Df"]), 
         "\u02CC", sub_digits(consumption_aov2["Residuals", "Df"]), 
         " = ", format(round(consumption_aov2["temp_tx:destructive_time", 
                                         "F value"], 
                             3), 
                       nsmall = 3)),
  paste0("p = ", format(round(consumption_aov2["temp_tx:destructive_time", 
                                          "Pr(>F)"], 
                              3), 
                       nsmall = 3))
), ncol = 3, byrow = T))

colnames(total_consumption_aov_tbl) <- c("Parameter", "Statistic", "P-Value")

knitr::kable(total_consumption_aov_tbl)
Parameter Statistic P-Value
Intercept F₁ˌ₃₃ = 1046.791 p = 0.000
Soil Moisture Treatment F₁ˌ₃₃ = 8.653 p = 0.006
Temperature Treatment F₁ˌ₃₃ = 214.881 p = 0.000
Destructive Sampling Treatment F₁ˌ₃₃ = 0.748 p = 0.393
Block Effect F₁ˌ₃₃ = 6.267 p = 0.017
Temperature x Destructive Sampling Interaction F₁ˌ₃₃ = 94.744 p = 0.000


Cmin_aov2 <- Anova(Cmin_lm2, type = 'III')


Total C mineralization of the soil food web (Figure 3.7B) followed similar trends to total C flux whereby experimental block effects were significant (F₁ˌ₃₃ = 6.173, p = 0.018). Total C mineralization increased at 20 °C vs. 12 °C (F₁ˌ₃₃ = 236.901, p = 0.000), but decreased under saturated vs. field-moist soil moisture conditions (F₁ˌ₃₃ = 8.725, p = 0.006). Destructive sampling treatments alone did not affect C mineralization (F₁ˌ₃₃ = 0.739, p = 0.396), but C mineralization was influenced by a significant temperature by destructive sampling time interaction effect (F₁ˌ₃₃ = 105.313, p = 0.000), highlighting that total C mineralization in mesocosms assigned to 20 °C decreased at T2 following a three-week return to 12 °C field-moist conditions. No other interaction effects significantly influenced C mineralization (Appendix E). Following three weeks of assigned experimental soil moisture and temperature conditions at T1 destructive sampling, C mineralization represented ~41% of total flux in mesocosms assigned to 12 °C conditions, and 42% of total flux in mesocosms assigned to 20 °C conditions. For all mesocosms, during the three weeks of recovery under field (12 °C field-moist) conditions (i.e., T2 destructive sampling), C mineralization remained at ~41% of the total flux. Mean total C mineralization (± SE) under each treatment is presented in Appendix D. Estimates of effect size based on a linear model are given in Appendix F.

Supplemental Table N+2

Carbon mineralization ANOVA results.

Cmin_aov_tbl <- as.data.frame(matrix(data = c(
  "Intercept",
  paste0("F", sub_digits(Cmin_aov2["(Intercept)", "Df"]), 
         "\u02CC", sub_digits(Cmin_aov2["Residuals", "Df"]), 
         " = ", format(round(Cmin_aov2["(Intercept)", "F value"], 3), 
                       nsmall = 3)),
  paste0("p = ", format(round(Cmin_aov2["(Intercept)", "Pr(>F)"], 3), 
                       nsmall = 3)),
  "Soil Moisture Treatment",
  paste0("F", sub_digits(Cmin_aov2["moisture_tx", "Df"]), 
         "\u02CC", sub_digits(Cmin_aov2["Residuals", "Df"]), 
         " = ", format(round(Cmin_aov2["moisture_tx", "F value"], 3), 
                       nsmall = 3)),
  paste0("p = ", format(round(Cmin_aov2["moisture_tx", "Pr(>F)"], 3), 
                       nsmall = 3)),
  "Temperature Treatment",
  paste0("F", sub_digits(Cmin_aov2["temp_tx", "Df"]), 
         "\u02CC", sub_digits(Cmin_aov2["Residuals", "Df"]), 
         " = ", format(round(Cmin_aov2["temp_tx", "F value"], 3), 
                       nsmall = 3)),
  paste0("p = ", format(round(Cmin_aov2["temp_tx", "Pr(>F)"], 3), 
                       nsmall = 3)),
  "Destructive Sampling Treatment",
  paste0("F", sub_digits(Cmin_aov2["destructive_time", "Df"]), 
         "\u02CC", sub_digits(Cmin_aov2["Residuals", "Df"]), 
         " = ", format(round(Cmin_aov2["destructive_time", "F value"], 
                             3), 
                       nsmall = 3)),
  paste0("p = ", format(round(Cmin_aov2["destructive_time", "Pr(>F)"], 
                              3), 
                       nsmall = 3)),
  "Block Effect",
  paste0("F", sub_digits(Cmin_aov2["block_effect", "Df"]), 
         "\u02CC", sub_digits(Cmin_aov2["Residuals", "Df"]), 
         " = ", format(round(Cmin_aov2["block_effect", "F value"], 3), 
                       nsmall = 3)),
  paste0("p = ", format(round(Cmin_aov2["block_effect", "Pr(>F)"], 3), 
                       nsmall = 3)),
  "Temperature x Destructive Sampling Interaction",
  paste0("F", sub_digits(Cmin_aov2["temp_tx:destructive_time", "Df"]), 
         "\u02CC", sub_digits(Cmin_aov2["Residuals", "Df"]), 
         " = ", format(round(Cmin_aov2["temp_tx:destructive_time", 
                                         "F value"], 
                             3), 
                       nsmall = 3)),
  paste0("p = ", format(round(Cmin_aov2["temp_tx:destructive_time", 
                                          "Pr(>F)"], 
                              3), 
                       nsmall = 3))
), ncol = 3, byrow = T))

colnames(Cmin_aov_tbl) <- c("Parameter", "Statistic", "P-Value")

knitr::kable(Cmin_aov_tbl)
Parameter Statistic P-Value
Intercept F₁ˌ₃₃ = 1030.642 p = 0.000
Soil Moisture Treatment F₁ˌ₃₃ = 8.725 p = 0.006
Temperature Treatment F₁ˌ₃₃ = 236.901 p = 0.000
Destructive Sampling Treatment F₁ˌ₃₃ = 0.739 p = 0.396
Block Effect F₁ˌ₃₃ = 6.173 p = 0.018
Temperature x Destructive Sampling Interaction F₁ˌ₃₃ = 105.313 p = 0.000


Nmin_aov2 <- Anova(Nmin_lm2, type = 'III')


Mean total N mineralization (Figure 3.7C) was significantly influenced by both soil moisture (F₁ˌ₃₃ = 13.061, p = 0.001) and temperature (F₁ˌ₃₃ = 78.383, p = 0.000) conditions; mean total N mineralization decreased under saturated field-moist vs. conditions and increased at 20 °C vs. 12 °C. Furthermore, a significant temperature by destructive sampling time interaction effect (F₁ˌ₃₃ = 54.875, p = 0.000) demonstrates that mean total N mineralization in mesocosms assigned to 20 °C decreased at T2 following a three-week return to 12 °C field-moist conditions. There were no significant block effects (F₁ˌ₃₃ = 0.002, p = 0.965) and destructive sampling treatments did not affect N mineralization (F₁ˌ₃₃ = 2.387, p = 0.132). No other interaction effects significantly affected N mineralization (Appendix E). Mean total N mineralization (± SE) under each treatment is presented in Appendix D. Estimates of effect size based on a linear model are given in Appendix F.

Supplemental Table N+3

Nitrogen mineralization ANOVA results.

Nmin_aov_tbl <- as.data.frame(matrix(data = c(
  "Intercept",
  paste0("F", sub_digits(Nmin_aov2["(Intercept)", "Df"]), 
         "\u02CC", sub_digits(Nmin_aov2["Residuals", "Df"]), 
         " = ", format(round(Nmin_aov2["(Intercept)", "F value"], 3), 
                       nsmall = 3)),
  paste0("p = ", format(round(Nmin_aov2["(Intercept)", "Pr(>F)"], 3), 
                       nsmall = 3)),
  "Soil Moisture Treatment",
  paste0("F", sub_digits(Nmin_aov2["moisture_tx", "Df"]), 
         "\u02CC", sub_digits(Nmin_aov2["Residuals", "Df"]), 
         " = ", format(round(Nmin_aov2["moisture_tx", "F value"], 3), 
                       nsmall = 3)),
  paste0("p = ", format(round(Nmin_aov2["moisture_tx", "Pr(>F)"], 3), 
                       nsmall = 3)),
  "Temperature Treatment",
  paste0("F", sub_digits(Nmin_aov2["temp_tx", "Df"]), 
         "\u02CC", sub_digits(Nmin_aov2["Residuals", "Df"]), 
         " = ", format(round(Nmin_aov2["temp_tx", "F value"], 3), 
                       nsmall = 3)),
  paste0("p = ", format(round(Nmin_aov2["temp_tx", "Pr(>F)"], 3), 
                       nsmall = 3)),
  "Destructive Sampling Treatment",
  paste0("F", sub_digits(Nmin_aov2["destructive_time", "Df"]), 
         "\u02CC", sub_digits(Nmin_aov2["Residuals", "Df"]), 
         " = ", format(round(Nmin_aov2["destructive_time", "F value"], 
                             3), 
                       nsmall = 3)),
  paste0("p = ", format(round(Nmin_aov2["destructive_time", "Pr(>F)"], 
                              3), 
                       nsmall = 3)),
  "Block Effect",
  paste0("F", sub_digits(Nmin_aov2["block_effect", "Df"]), 
         "\u02CC", sub_digits(Nmin_aov2["Residuals", "Df"]), 
         " = ", format(round(Nmin_aov2["block_effect", "F value"], 3), 
                       nsmall = 3)),
  paste0("p = ", format(round(Nmin_aov2["block_effect", "Pr(>F)"], 3), 
                       nsmall = 3)),
  "Temperature x Destructive Sampling Interaction",
  paste0("F", sub_digits(Nmin_aov2["temp_tx:destructive_time", "Df"]), 
         "\u02CC", sub_digits(Nmin_aov2["Residuals", "Df"]), 
         " = ", format(round(Nmin_aov2["temp_tx:destructive_time", 
                                         "F value"], 
                             3), 
                       nsmall = 3)),
  paste0("p = ", format(round(Nmin_aov2["temp_tx:destructive_time", 
                                          "Pr(>F)"], 
                              3), 
                       nsmall = 3))
), ncol = 3, byrow = T))

colnames(Nmin_aov_tbl) <- c("Parameter", "Statistic", "P-Value")

knitr::kable(Nmin_aov_tbl)
Parameter Statistic P-Value
Intercept F₁ˌ₃₃ = 1047.625 p = 0.000
Soil Moisture Treatment F₁ˌ₃₃ = 13.061 p = 0.001
Temperature Treatment F₁ˌ₃₃ = 78.383 p = 0.000
Destructive Sampling Treatment F₁ˌ₃₃ = 2.387 p = 0.132
Block Effect F₁ˌ₃₃ = 0.002 p = 0.965
Temperature x Destructive Sampling Interaction F₁ˌ₃₃ = 54.875 p = 0.000


Chapter 4

References

Appendices

Appenix A

Node model parameters for the soil food web trophic groups under control (12 °C) and warmed (20 °C) conditions.

Parameters include C:N and estimated percent assimilation efficiency (Ea), percent production efficiency (Ep), and population death rates (d).1,2,3

AppenA.temp1 <- ExRes_prop_control 

AppenA.temp1$CN <- round(AppenA.temp1$CN, 0)

AppenA.temp1 <- AppenA.temp1 %>%
  select(X = X,
         `Node ID` = ID,
         `C:N` = CN,
         `E~a~ (12 &deg;C)` = a,
         `E~p~ (12 &deg;C)` = p,
         `d (12 &deg;C)` = d)

AppenA.temp2 <- ExRes_prop_warming

AppenA.temp2$a <- round(AppenA.temp2$p, 0)
AppenA.temp2$p <- round(AppenA.temp2$p, 0)
AppenA.temp2$d <- round(AppenA.temp2$d, 2)

AppenA.temp2 <- AppenA.temp2 %>%
  select(`Node ID` = ID,
         `E~a~ (20 &deg;C)` = a,
         `E~p~ (20 &deg;C)` = p,
         `d (20 &deg;C)` = d)

AppenA <- merge(x = AppenA.temp1, y = AppenA.temp2, by = "Node ID") %>%
  arrange(X) %>%
  select(-X)

AppenA$`Node ID`[AppenA$`Node ID` == "mesostigs"] <- 
  "Arthropod-feeding mites"
AppenA$`Node ID`[AppenA$`Node ID` == "zerconidae"] <- 
  "Nematode-feeding mites"
AppenA$`Node ID`[AppenA$`Node ID` == "prostig_astig"] <- 
  "Non-predatory prostigmatid and astigmatid mites"
AppenA$`Node ID`[AppenA$`Node ID` == "juv_oribatids"] <- 
  "Juvenile oribatid mites"
AppenA$`Node ID`[AppenA$`Node ID` == "oribatids"] <- 
  "Adult oribatid mites"
AppenA$`Node ID`[AppenA$`Node ID` == "collembola"] <- 
  "Collembola"
AppenA$`Node ID`[AppenA$`Node ID` == "predatory_nematodes"] <- 
  "Predatory nematodes"
AppenA$`Node ID`[AppenA$`Node ID` == "bactivorous_nematodes"] <- 
  "Bactivorous nematodes"
AppenA$`Node ID`[AppenA$`Node ID` == "fungivorous_nematodes"] <- 
  "Fungivorous nematodes"
AppenA$`Node ID`[AppenA$`Node ID` == "omnivorous_nematodes"] <- 
  "Omnivorous nematodes"
AppenA$`Node ID`[AppenA$`Node ID` == "protists"] <- 
  "Protists"
AppenA$`Node ID`[AppenA$`Node ID` == "bacteria"] <- 
  "Bacteria"
AppenA$`Node ID`[AppenA$`Node ID` == "fungi"] <- 
  "Fungi"
AppenA$`Node ID`[AppenA$`Node ID` == "labile"] <- 
  "Labile detritus"
AppenA$`Node ID`[AppenA$`Node ID` == "recalcitrant"] <- 
  "Recalcitrant detritus"

knitr::kable(AppenA, linesep = "\\hline")
Node ID C:N Ea (12 &deg;C) Ep (12 &deg;C) d (12 &deg;C) Ea (20 &deg;C) Ep (20 &deg;C) d (20 &deg;C)
Arthropod-feeding mites 8 60 35 1.84 31 31 2.44
Nematode-feeding mites 8 90 35 1.84 31 31 2.44
Non-predatory prostigmatid and astigmatid mites 8 50 35 1.84 31 31 2.44
Juvenile oribatid mites 8 50 35 1.20 31 31 1.59
Adult oribatid mites 8 50 35 1.20 31 31 1.59
Collembola 8 50 35 1.84 31 31 2.44
Predatory nematodes 10 50 37 1.60 33 33 2.13
Bactivorous nematodes 10 60 37 4.36 33 33 5.79
Fungivorous nematodes 10 38 37 1.92 33 33 2.55
Omnivorous nematodes 10 60 37 2.68 33 33 3.56
Protists 7 95 40 6.00 37 37 8.03
Bacteria 4 100 30 6.00 28 28 8.03
Fungi 10 100 30 1.20 28 28 1.61
Labile detritus 57 100 100 0.00 100 100 0.00
Recalcitrant detritus 19 100 100 0.00 100 100 0.00

1Metabolic parameters from Hunt et al. (1987).
2Metabolic scaling of parameters for microbial nodes from Li et al. (2019).
3Metabolic scaling of parameters for soil fauna nodes from Luxton (1972, 1981).

Appendix B

The soil food web interaction matrix.

Rows denote consumers, columns denote resources. A value of 1 indicates the presence of a trophic interaction, and a value of 0 indicates no interaction. Values greater than 0 but less than 1 indicate the presence of a weak trophic interaction. Meso = arthropod-feeding mites, Zerco = nematode-feeding mites, Mites NP = non-predatory prostigmatid and astigmatid mites, Col = collembola, Pred Nem = predatory nematodes, Bac Nem = bactivorous nematodes, Fung Nem = fungivorous nematodes, Omni Nem = omnivorous nematodes, Pro = protists, Bact = bacteria, Fung = fungi, Labile = labile detritus, Recal = recalcitrant detritus.

AppenB <- ExRes_imat

colnames(AppenB) <- c("Meso", "Zerco", "Mites NP", "Juv Orib", "Orib",
                      "Coll", "Pred Nem", "Bac Nem", "Fung Nem", "Omni Nem",
                      "Pro", "Bact", "Fung", "Labile", "Recal")
rownames(AppenB) <- c("Meso", "Zerco", "Mites NP", "Juv Orib", "Orib",
                      "Coll", "Pred Nem", "Bac Nem", "Fung Nem", "Omni Nem",
                      "Pro", "Bact", "Fung", "Labile", "Recal")

knitr::kable(AppenB, linesep = "\\hline")
Meso Zerco Mites NP Juv Orib Orib Coll Pred Nem Bac Nem Fung Nem Omni Nem Pro Bact Fung Labile Recal
Meso 0 0 1 1 0 1 0.0 0.0 0.0 0 0 0 0 0.0 0.0
Zerco 0 0 0 0 0 0 1.0 1.0 1.0 1 0 0 0 0.0 0.0
Mites NP 0 0 0 0 0 0 0.0 0.0 0.0 0 0 0 1 0.0 0.0
Juv Orib 0 0 0 0 0 0 0.0 0.0 0.0 0 0 0 1 0.0 0.0
Orib 0 0 0 0 0 0 0.0 0.0 0.0 0 0 0 1 0.0 0.0
Coll 0 0 0 0 0 0 0.0 0.0 0.0 0 0 0 1 0.0 0.0
Pred Nem 0 0 0 0 0 0 0.0 1.0 1.0 1 1 0 0 0.0 0.0
Bac Nem 0 0 0 0 0 0 0.0 0.0 0.0 0 1 1 0 0.0 0.0
Fung Nem 0 0 0 0 0 0 0.0 0.0 0.0 0 0 0 1 0.0 0.0
Omni Nem 0 0 0 0 0 0 0.5 0.5 0.5 0 1 1 1 0.0 0.0
Pro 0 0 0 0 0 0 0.0 0.0 0.0 0 0 1 0 0.0 0.0
Bact 0 0 0 0 0 0 0.0 0.0 0.0 0 0 0 0 0.7 0.3
Fung 0 0 0 0 0 0 0.0 0.0 0.0 0 0 0 0 0.3 0.7
Labile 0 0 0 0 0 0 0.0 0.0 0.0 0 0 0 0 0.0 0.0
Recal 0 0 0 0 0 0 0.0 0.0 0.0 0 0 0 0 0.0 0.0


Appendix C

Mean node biomasses.

Biomasses (± SE) are given in g of C per m2 of soil under each experimental treatment. Meso = arthropod-feeding mites, Zerco = nematode-feeding mites, Mites NP = non-predatory prostigmatid and astigmatid mites, Col = collembola, Pred Nem = predatory nematodes, Bac Nem = bactivorous nematodes, Fung Nem = fungivorous nematodes, Omni Nem = omnivorous nematodes, Pro = protists, Bact = bacteria, Fung = fungi, Labile = labile detritus, Recal = recalcitrant detritus.

AppenC.temp <- rownames_to_column(as.data.frame(t(model_biomasses)), 
                                  "Sample_ID") %>%
  filter(!Sample_ID == "ExRes 5")

AppenC.temp2 <- merge(x = sample_metadata, y = AppenC.temp, 
                      by = "Sample_ID") %>%
  mutate(tx = interaction(destructive_time, moisture_tx, temp_tx))

AppenC.temp2$tx2 <- recode_factor(AppenC.temp2$tx, 
                                  "T0.Ambient.12" = "T~0~",
                                  "T0.Ambient.12" = "T~0~",
                                  "T0.Ambient.20" = "T~0~", 
                                  "T0.High.12" = "T~0~",
                                  "T0.High.20" = "T~0~",
                                  "T1.Ambient.12" = "T~1~ Field-Moist 12 &deg;C",
                                  "T1.Ambient.20" = "T~1~ Field-Moist 20 &deg;C",
                                  "T1.High.12" = "T~1~ Saturated 12 &deg;C",
                                  "T1.High.20" = "T~1~ Saturated 20 &deg;C",
                                  "T2.Ambient.12" = "T~2~ Field-Moist 12 &deg;C",
                                  "T2.Ambient.20" = "T~2~ Field-Moist 20 &deg;C",
                                  "T2.High.12" = "T~2~ Saturated 12 &deg;C",
                                  "T2.High.20" = "T~2~ Saturated 20 &deg;C")

AppenC.temp3 <- AppenC.temp2 %>% 
  group_by(tx2) %>%
  summarise(
    meso.mean = mean(mesostigs_biomass),
    meso.se = sd(mesostigs_biomass)/sqrt(length(mesostigs_biomass)),
    zerco.mean = mean(zerconidae_biomass),
    zerco.se = sd(zerconidae_biomass)/sqrt(length(zerconidae_biomass)),
    mitesNP.mean = mean(prostig_astig_biomass),
    mitesNP.se = sd(prostig_astig_biomass)/sqrt(length(prostig_astig_biomass)),
    juvorib.mean = mean(juv_oribatids_biomass),
    juvorib.se = sd(juv_oribatids_biomass)/sqrt(length(juv_oribatids_biomass)),
    orib.mean = mean(oribatids_biomass),
    orib.se = sd(oribatids_biomass)/sqrt(length(oribatids_biomass)),
    coll.mean = mean(collembola_biomass),
    coll.se = sd(collembola_biomass)/sqrt(length(collembola_biomass)),
    prednem.mean = mean(n.predator_biomass),
    prednem.se = sd(n.predator_biomass)/sqrt(length(n.predator_biomass)),
    bactnem.mean = mean(n.bacterivore_biomass),
    bactnem.se = sd(n.bacterivore_biomass)/sqrt(length(n.bacterivore_biomass)),
    fungnem.mean = mean(n.fungivore_biomass),
    fungnem.se = sd(n.fungivore_biomass)/sqrt(length(n.fungivore_biomass)),
    omninem.mean = mean(n.omnivore_biomass),
    omninem.se = sd(n.omnivore_biomass)/sqrt(length(n.omnivore_biomass)),
    pro.mean = mean(protists_biomass),
    pro.se = sd(protists_biomass)/sqrt(length(protists_biomass)),
    bact.mean = mean(bacteria_biomass),
    bact.se = sd(bacteria_biomass)/sqrt(length(bacteria_biomass)),
    fung.mean = mean(fungi_biomass),
    fung.se = sd(fungi_biomass)/sqrt(length(fungi_biomass)),
    labile.mean = mean(labile_biomass),
    labile.se = sd(labile_biomass)/sqrt(length(labile_biomass)),
    recal.mean = mean(recal_biomass),
    recal.se = sd(recal_biomass)/sqrt(length(recal_biomass))
  )

AppenC <- AppenC.temp3 %>%
  select("Treatment" = "tx2") %>%
  mutate(Meso = paste0(round(AppenC.temp3$meso.mean, 3), 
                       " &plusmn; ", 
                       round(AppenC.temp3$meso.se, 3)), 
         Zerco = paste0(round(AppenC.temp3$zerco.mean, 3), 
                       " &plusmn; ", 
                       round(AppenC.temp3$zerco.se, 3)),
         `Mites NP` = paste0(round(AppenC.temp3$mitesNP.mean, 3), 
                       " &plusmn; ", 
                       round(AppenC.temp3$mitesNP.se, 3)),
         `Juv Orib` = paste0(round(AppenC.temp3$juvorib.mean, 2), 
                       " &plusmn; ", 
                       round(AppenC.temp3$juvorib.se, 2)),
         Orib = paste0(round(AppenC.temp3$orib.mean, 2), 
                       " &plusmn; ", 
                       round(AppenC.temp3$orib.se, 2)),
         Coll = paste0(round(AppenC.temp3$coll.mean, 3), 
                       " &plusmn; ", 
                       round(AppenC.temp3$coll.se, 3)),
         `Pred Nem` = paste0(round(AppenC.temp3$prednem.mean, 4), 
                       " &plusmn; ", 
                       round(AppenC.temp3$prednem.se, 4)),
         `Bac Nem` = paste0(round(AppenC.temp3$bactnem.mean, 4), 
                       " &plusmn; ", 
                       round(AppenC.temp3$bactnem.se, 4)),
         `Fung Nem` = paste0(round(AppenC.temp3$fungnem.mean, 4), 
                       " &plusmn; ", 
                       round(AppenC.temp3$fungnem.se, 4)),
         `Omni Nem` = paste0(round(AppenC.temp3$omninem.mean, 4), 
                       " &plusmn; ", 
                       round(AppenC.temp3$omninem.se, 4)),
         Pro = paste0(round(AppenC.temp3$pro.mean, 1), 
                       " &plusmn; ", 
                       round(AppenC.temp3$pro.se, 1)),
         Bact = paste0(round(AppenC.temp3$bact.mean, 1), 
                       " &plusmn; ", 
                       round(AppenC.temp3$bact.se, 1)),
         Fung = paste0(round(AppenC.temp3$fung.mean, 0), 
                       " &plusmn; ", 
                       round(AppenC.temp3$fung.se, 0)),
         Labile = paste0(round(AppenC.temp3$labile.mean, 0)),
         Recal = paste0(round(AppenC.temp3$recal.mean, 0))
         )

knitr::kable(AppenC, linesep = "\\hline")
Treatment Meso Zerco Mites NP Juv Orib Orib Coll Pred Nem Bac Nem Fung Nem Omni Nem Pro Bact Fung Labile Recal
T0 0.003 &plusmn; 0.002 0.009 &plusmn; 0.004 0.041 &plusmn; 0.008 0.31 &plusmn; 0.04 0.36 &plusmn; 0.04 0.004 &plusmn; 0.002 0.0019 &plusmn; 4e-04 6e-04 &plusmn; 2e-04 0.006 &plusmn; 0.0014 7e-04 &plusmn; 2e-04 2.8 &plusmn; 0.1 11.7 &plusmn; 0.2 87 &plusmn; 2 135707 135707
T1 Field-Moist 12 &deg;C 0.006 &plusmn; 0.002 0.005 &plusmn; 0.003 0.04 &plusmn; 0.016 0.14 &plusmn; 0.03 0.29 &plusmn; 0.05 0.006 &plusmn; 0.004 0.0013 &plusmn; 9e-04 5e-04 &plusmn; 3e-04 0.0043 &plusmn; 0.0029 5e-04 &plusmn; 3e-04 2.5 &plusmn; 0.1 10.6 &plusmn; 0.6 79 &plusmn; 4 135707 135707
T1 Field-Moist 20 &deg;C 0.005 &plusmn; 0.002 0.004 &plusmn; 0.001 0.045 &plusmn; 0.013 0.12 &plusmn; 0.02 0.28 &plusmn; 0.06 0.004 &plusmn; 0.001 0.0016 &plusmn; 3e-04 6e-04 &plusmn; 1e-04 0.0052 &plusmn; 0.0011 6e-04 &plusmn; 1e-04 2.6 &plusmn; 0.1 10.9 &plusmn; 0.4 81 &plusmn; 3 135707 135707
T1 Saturated 12 &deg;C 0.001 &plusmn; 0.001 0.006 &plusmn; 0.003 0.027 &plusmn; 0.005 0.07 &plusmn; 0.02 0.14 &plusmn; 0.04 0 &plusmn; 0 5e-04 &plusmn; 2e-04 2e-04 &plusmn; 1e-04 0.0017 &plusmn; 5e-04 2e-04 &plusmn; 1e-04 2.7 &plusmn; 0.1 11.6 &plusmn; 0.3 86 &plusmn; 2 135707 135707
T1 Saturated 20 &deg;C 0.004 &plusmn; 0.002 0.003 &plusmn; 0.002 0.03 &plusmn; 0.01 0.12 &plusmn; 0.02 0.2 &plusmn; 0.06 0.002 &plusmn; 0.001 6e-04 &plusmn; 1e-04 2e-04 &plusmn; 1e-04 0.0018 &plusmn; 5e-04 2e-04 &plusmn; 1e-04 2.7 &plusmn; 0.1 11.6 &plusmn; 0.3 86 &plusmn; 2 135707 135707
T2 Field-Moist 12 &deg;C 0.002 &plusmn; 0.001 0.003 &plusmn; 0.001 0.034 &plusmn; 0.01 0.13 &plusmn; 0.03 0.21 &plusmn; 0.04 0.004 &plusmn; 0.002 0.0014 &plusmn; 4e-04 5e-04 &plusmn; 1e-04 0.0046 &plusmn; 0.0013 5e-04 &plusmn; 1e-04 2.3 &plusmn; 0.1 9.9 &plusmn; 0.5 74 &plusmn; 4 135707 135707
T2 Field-Moist 20 &deg;C 0.002 &plusmn; 0.001 0.004 &plusmn; 0.002 0.032 &plusmn; 0.011 0.09 &plusmn; 0.02 0.17 &plusmn; 0.02 0.002 &plusmn; 0.001 0.0018 &plusmn; 4e-04 6e-04 &plusmn; 1e-04 0.0057 &plusmn; 0.0012 7e-04 &plusmn; 1e-04 2.5 &plusmn; 0.1 10.6 &plusmn; 0.2 79 &plusmn; 2 135707 135707
T2 Saturated 12 &deg;C 0.004 &plusmn; 0.002 0.004 &plusmn; 0.002 0.03 &plusmn; 0.006 0.1 &plusmn; 0.02 0.2 &plusmn; 0.04 0.002 &plusmn; 0.002 6e-04 &plusmn; 2e-04 2e-04 &plusmn; 1e-04 0.0019 &plusmn; 5e-04 2e-04 &plusmn; 1e-04 2.6 &plusmn; 0.1 11.1 &plusmn; 0.5 82 &plusmn; 4 135707 135707
T2 Saturated 20 &deg;C 0.002 &plusmn; 0.001 0.002 &plusmn; 0.002 0.023 &plusmn; 0.006 0.1 &plusmn; 0.04 0.18 &plusmn; 0.07 0.001 &plusmn; 0.001 3e-04 &plusmn; 1e-04 1e-04 &plusmn; 0 8e-04 &plusmn; 2e-04 1e-04 &plusmn; 0 2.7 &plusmn; 0.1 11.3 &plusmn; 0.2 84 &plusmn; 2 135707 135707


Appendix D

Supplementary table of means.

Mean value (± SE) for each variable measured. Heterotrophic respiration is given in g of C per m2 per year; soil moisture is given in ln(percent) gravimetrically; pH is given in ln(pH); C:N ratio is a unitless quantity; phenol oxidase and peroxidase concentration is given in μMol substrate per g soil per hour; total abundance and microfauna abundance is given in individuals per m2; mesofauna abundance is given in ln(individuals per m2); total biomass is given in g of C per m2; consumptive flux and C mineralization are given in g of C per m2 per year; N mineralization is given in g of N per m2 per year.

resp.data$tx <- interaction(resp.data$destructive_time,
                            resp.data$temp_tx, resp.data$moisture_tx) 

resp.data <- resp.data %>%
  mutate(tx = 
           fct_recode(tx,
                      "T\u2080" = "T0.12.Ambient",
                      "T\u2080" = "T0.12.High",
                      "T\u2080" = "T0.20.Ambient",
                      "T\u2080" = "T0.20.High",
                      "T\u2081 12\u00B0C Field-Moist" = "T1.12.Ambient",
                      "T\u2081 12\u00B0C Saturated" = "T1.12.High",
                      "T\u2081 20\u00B0C Field-Moist" = "T1.20.Ambient",
                      "T\u2081 20\u00B0C Saturated" = "T1.20.High",
                      "T\u2082 12\u00B0C Field-Moist" = "T2.12.Ambient",
                      "T\u2082 12\u00B0C Saturated" = "T2.12.High",
                      "T\u2082 20\u00B0C Field-Moist" = "T2.20.Ambient",
                      "T\u2082 20\u00B0C Saturated" = "T2.20.High"
  ))

resp_summary <- resp.data %>%
  group_by(tx) %>%
  summarize(
    mean.resp = mean(cum_resp),
    se.resp = sd(cum_resp)/sqrt(length(cum_resp))
  ) %>%
  mutate(`Heterotrophic Respiration` = 
           paste0(format(round(mean.resp, 1), nsmall = 1), 
                  " &plusmn; ",
                  format(round(se.resp, 1), nsmall=1))) %>%
  select(-c(mean.resp, se.resp))

soil_data$tx <- interaction(soil_data$destructive_time,
                            soil_data$temp_tx, soil_data$moisture_tx) 

soil_data <- soil_data %>%
  mutate(tx = 
           fct_recode(tx,
                      "T\u2080" = "T0.12.Ambient",
                      "T\u2080" = "T0.12.High",
                      "T\u2080" = "T0.20.Ambient",
                      "T\u2080" = "T0.20.High",
                      "T\u2081 12\u00B0C Field-Moist" = "T1.12.Ambient",
                      "T\u2081 12\u00B0C Saturated" = "T1.12.High",
                      "T\u2081 20\u00B0C Field-Moist" = "T1.20.Ambient",
                      "T\u2081 20\u00B0C Saturated" = "T1.20.High",
                      "T\u2082 12\u00B0C Field-Moist" = "T2.12.Ambient",
                      "T\u2082 12\u00B0C Saturated" = "T2.12.High",
                      "T\u2082 20\u00B0C Field-Moist" = "T2.20.Ambient",
                      "T\u2082 20\u00B0C Saturated" = "T2.20.High"
  ))

soil_summary <- soil_data %>%
  group_by(tx) %>%
  summarize(
    mean.moisture = mean(log(pct_moisture)),
    se.moisture = sd(log(pct_moisture))/sqrt(length(pct_moisture)),
    mean.pH = mean(log(pH)),
    se.pH = sd(log(pH))/sqrt(length(pH)),
    mean.CN = mean(C_N_ratio),
    se.CN = sd(C_N_ratio)/sqrt(length(C_N_ratio)),
    mean.phenox = mean(Phenox),
    se.phenox = sd(Phenox)/sqrt(length(Phenox)),
    mean.perox = mean(na.omit(Perox)),
    se.perox = sd(na.omit(Perox))/sqrt(length(na.omit(Perox)))
  ) %>%
  mutate(`Soil Moisture` = 
           paste0(format(round(mean.moisture, 2), nsmall = 2), 
                  " &plusmn; ",
                  format(round(se.moisture, 2), nsmall = 2)),
         `pH` = 
           paste0(format(round(mean.pH, 3), nsmall = 3), 
                  " &plusmn; ",
                  format(round(se.pH, 3), nsmall = 3)),
         `C:N` = 
           paste0(format(round(mean.CN, 0), nsmall = 0), 
                  " &plusmn; ",
                  format(round(se.CN, 0), nsmall = 0)),
         `Phenol oxidase` = 
           paste0(format(round(mean.phenox, 0), nsmall = 0), 
                  " &plusmn; ",
                  format(round(se.phenox, 0), nsmall = 0)),
         `Peroxidase` = 
           paste0(format(round(mean.perox, 0), nsmall = 0), 
                  " &plusmn; ",
                  format(round(se.perox, 0), nsmall = 0))
         ) %>%
  select(-c(mean.moisture, se.moisture, mean.pH, se.pH, mean.CN, se.CN,
            mean.phenox, se.phenox, mean.perox, se.perox))

abundance_data$tx <- interaction(abundance_data$destructive_time,
                                 abundance_data$temp_tx, 
                                 abundance_data$moisture_tx) 

abundance_data <- abundance_data %>%
  mutate(tx = 
           fct_recode(tx,
                      "T\u2080" = "T0.12.Ambient",
                      "T\u2080" = "T0.12.High",
                      "T\u2080" = "T0.20.Ambient",
                      "T\u2080" = "T0.20.High",
                      "T\u2081 12\u00B0C Field-Moist" = "T1.12.Ambient",
                      "T\u2081 12\u00B0C Saturated" = "T1.12.High",
                      "T\u2081 20\u00B0C Field-Moist" = "T1.20.Ambient",
                      "T\u2081 20\u00B0C Saturated" = "T1.20.High",
                      "T\u2082 12\u00B0C Field-Moist" = "T2.12.Ambient",
                      "T\u2082 12\u00B0C Saturated" = "T2.12.High",
                      "T\u2082 20\u00B0C Field-Moist" = "T2.20.Ambient",
                      "T\u2082 20\u00B0C Saturated" = "T2.20.High"
  ))

abundance_summary <- abundance_data %>%
  group_by(tx) %>%
  summarize(
    mean.total.ab = mean(total_ab_standardized),
    se.total.ab = sd(total_ab_standardized)/
      sqrt(length(total_ab_standardized)),
    mean.micro.ab = mean(total_micro_ab_standardized),
    se.micro.ab = sd(total_micro_ab_standardized)/
      sqrt(length(total_micro_ab_standardized)),
    mean.meso.ab = mean(log(total_meso_ab_standardized)),
    se.meso.ab = sd(log(total_meso_ab_standardized))/
      sqrt(length(total_meso_ab_standardized))
  ) %>%
  mutate(`Total Abundance` = 
           paste0(format(round(mean.total.ab, -4), nsmall = 0), 
                  " &plusmn; ",
                  format(round(se.total.ab, -4), nsmall=0)),
         `Microfauna Abundance` = 
           paste0(format(round(mean.micro.ab, -4), nsmall = 0), 
                  " &plusmn; ",
                  format(round(se.micro.ab, -4), nsmall=0)),
         `Mesofauna Abundance` = 
           paste0(format(round(mean.meso.ab, 1), nsmall = 1), 
                  " &plusmn; ",
                  format(round(se.meso.ab, 1), nsmall=1))
         ) %>%
  select(-c(mean.total.ab, se.total.ab, mean.micro.ab, se.micro.ab, 
            mean.meso.ab, se.meso.ab))

biomass_data$tx <- interaction(biomass_data$destructive_time,
                               biomass_data$temp_tx, 
                               biomass_data$moisture_tx) 

biomass_data <- biomass_data %>%
  mutate(tx = 
           fct_recode(tx,
                      "T\u2080" = "T0.12.Ambient",
                      "T\u2080" = "T0.12.High",
                      "T\u2080" = "T0.20.Ambient",
                      "T\u2080" = "T0.20.High",
                      "T\u2081 12\u00B0C Field-Moist" = "T1.12.Ambient",
                      "T\u2081 12\u00B0C Saturated" = "T1.12.High",
                      "T\u2081 20\u00B0C Field-Moist" = "T1.20.Ambient",
                      "T\u2081 20\u00B0C Saturated" = "T1.20.High",
                      "T\u2082 12\u00B0C Field-Moist" = "T2.12.Ambient",
                      "T\u2082 12\u00B0C Saturated" = "T2.12.High",
                      "T\u2082 20\u00B0C Field-Moist" = "T2.20.Ambient",
                      "T\u2082 20\u00B0C Saturated" = "T2.20.High"
  ))

biomass_summary <- biomass_data %>%
  group_by(tx) %>%
  summarize(
    mean.total.biom = mean(total_biomass),
    se.total.biom = sd(total_biomass)/
      sqrt(length(total_biomass)),
    mean.micro.biom = mean(micro_biomass),
    se.micro.biom = sd(micro_biomass)/
      sqrt(length(micro_biomass)),
    mean.meso.biom = mean(meso_biomass),
    se.meso.biom = sd(meso_biomass)/
      sqrt(length(meso_biomass))
  ) %>%
  mutate(`Total Biomass` = 
           paste0(format(round(mean.total.biom, 2), nsmall = 2), 
                  " &plusmn; ",
                  format(round(se.total.biom, 2), nsmall = 2)),
         `Microfauna Biomass` = 
           paste0(format(round(mean.micro.biom, 4), nsmall = 4), 
                  " &plusmn; ",
                  format(round(se.micro.biom, 4), nsmall = 4)),
         `Mesofauna Biomass` = 
           paste0(format(round(mean.meso.biom, 2), nsmall = 2), 
                  " &plusmn; ",
                  format(round(se.meso.biom, 2), nsmall = 2))
         ) %>%
  select(-c(mean.total.biom, se.total.biom, mean.micro.biom, se.micro.biom, 
            mean.meso.biom, se.meso.biom))

flux_data$tx <- interaction(flux_data$destructive_time,
                            flux_data$temp_tx,
                            flux_data$moisture_tx) 

flux_data <- flux_data %>%
  mutate(tx = 
           fct_recode(tx,
                      "T\u2080" = "T0.12.Ambient",
                      "T\u2080" = "T0.12.High",
                      "T\u2080" = "T0.20.Ambient",
                      "T\u2080" = "T0.20.High",
                      "T\u2081 12\u00B0C Field-Moist" = "T1.12.Ambient",
                      "T\u2081 12\u00B0C Saturated" = "T1.12.High",
                      "T\u2081 20\u00B0C Field-Moist" = "T1.20.Ambient",
                      "T\u2081 20\u00B0C Saturated" = "T1.20.High",
                      "T\u2082 12\u00B0C Field-Moist" = "T2.12.Ambient",
                      "T\u2082 12\u00B0C Saturated" = "T2.12.High",
                      "T\u2082 20\u00B0C Field-Moist" = "T2.20.Ambient",
                      "T\u2082 20\u00B0C Saturated" = "T2.20.High"
  ))

flux_summary <- flux_data %>%
  group_by(tx) %>%
  summarize(
    mean.cons = mean(total_consumption),
    se.cons = sd(total_consumption)/
      sqrt(length(total_consumption)),
    mean.Cmin = mean(total_Cmin),
    se.Cmin = sd(total_Cmin)/
      sqrt(length(total_Cmin)),
    mean.Nmin = mean(total_Nmin),
    se.Nmin = sd(total_Nmin)/
      sqrt(length(total_Nmin))
  ) %>%
  mutate(`Consumptive Flux` = 
           paste0(format(round(mean.cons, 0), nsmall = 0), 
                  " &plusmn; ",
                  format(round(se.cons, 0), nsmall = 0)),
         `C Mineralization` = 
           paste0(format(round(mean.Cmin, 0), nsmall = 0), 
                  " &plusmn; ",
                  format(round(se.Cmin, 0), nsmall = 0)),
         `N Mineralization` = 
           paste0(format(round(mean.Nmin, 2), nsmall = 2), 
                  " &plusmn; ",
                  format(round(se.Nmin, 2), nsmall = 2))
         ) %>%
  select(-c(mean.cons, se.cons, mean.Cmin, se.Cmin, 
            mean.Nmin, se.Nmin))

AppenD <- t(merge(x = resp_summary, y = soil_summary, by = "tx") %>%
  left_join(abundance_summary, by = "tx") %>%
  left_join(biomass_summary, by = "tx") %>%
  left_join(flux_summary, by = "tx") %>%
  column_to_rownames("tx"))

knitr::kable(AppenD, linesep = "\\hline")
T₀ T₁ 12°C Field-Moist T₁ 12°C Saturated T₁ 20°C Field-Moist T₁ 20°C Saturated T₂ 12°C Field-Moist T₂ 12°C Saturated T₂ 20°C Field-Moist T₂ 20°C Saturated
Heterotrophic Respiration 7.0 &plusmn; 0.1 6.0 &plusmn; 0.4 6.4 &plusmn; 0.5 6.7 &plusmn; 0.5 7.0 &plusmn; 0.2 6.1 &plusmn; 0.3 6.6 &plusmn; 0.4 6.5 &plusmn; 0.5 6.7 &plusmn; 0.5
Soil Moisture 6.68 &plusmn; 0.06 6.68 &plusmn; 0.09 6.97 &plusmn; 0.06 6.64 &plusmn; 0.08 6.86 &plusmn; 0.07 6.72 &plusmn; 0.07 6.84 &plusmn; 0.06 6.52 &plusmn; 0.07 6.83 &plusmn; 0.07
pH 1.405 &plusmn; 0.013 1.387 &plusmn; 0.028 1.450 &plusmn; 0.027 1.378 &plusmn; 0.004 1.414 &plusmn; 0.015 1.443 &plusmn; 0.022 1.447 &plusmn; 0.014 1.436 &plusmn; 0.013 1.445 &plusmn; 0.009
C:N 37 &plusmn; 2 36 &plusmn; 3 36 &plusmn; 3 40 &plusmn; 5 NA &plusmn; NA 33 &plusmn; 3 36 &plusmn; 1 NA &plusmn; NA NA &plusmn; NA
Phenol oxidase 158 &plusmn; 16 131 &plusmn; 29 NA &plusmn; NA 199 &plusmn; 24 183 &plusmn; 31 146 &plusmn; 8 160 &plusmn; 8 155 &plusmn; 8 148 &plusmn; 5
Peroxidase 154 &plusmn; 8 111 &plusmn; 36 98 &plusmn; 21 143 &plusmn; 12 157 &plusmn; 16 172 &plusmn; 13 183 &plusmn; 9 175 &plusmn; 24 163 &plusmn; 15
Total Abundance 540000 &plusmn; 50000 330000 &plusmn; 130000 150000 &plusmn; 30000 360000 &plusmn; 70000 220000 &plusmn; 50000 300000 &plusmn; 60000 200000 &plusmn; 40000 290000 &plusmn; 40000 160000 &plusmn; 50000
Microfauna Abundance 170000 &plusmn; 40000 120000 &plusmn; 80000 50000 &plusmn; 10000 150000 &plusmn; 30000 50000 &plusmn; 10000 130000 &plusmn; 40000 50000 &plusmn; 20000 160000 &plusmn; 40000 20000 &plusmn; 10000
Mesofauna Abundance 12.8 &plusmn; 0.1 12.1 &plusmn; 0.2 11.4 &plusmn; 0.2 12.1 &plusmn; 0.3 11.9 &plusmn; 0.2 12.0 &plusmn; 0.2 11.8 &plusmn; 0.2 11.7 &plusmn; 0.2 11.6 &plusmn; 0.3
Total Biomass 0.74 &plusmn; 0.08 0.49 &plusmn; 0.10 0.25 &plusmn; 0.07 0.46 &plusmn; 0.09 0.37 &plusmn; 0.09 0.39 &plusmn; 0.08 0.34 &plusmn; 0.07 0.31 &plusmn; 0.05 0.31 &plusmn; 0.11
Microfauna Biomass 0.0092 &plusmn; 0.0022 0.0066 &plusmn; 0.0044 0.0026 &plusmn; 0.0008 0.0080 &plusmn; 0.0017 0.0028 &plusmn; 0.0007 0.0070 &plusmn; 0.0020 0.0029 &plusmn; 0.0008 0.0087 &plusmn; 0.0019 0.0013 &plusmn; 0.0004
Mesofauna Biomass 0.73 &plusmn; 0.08 0.48 &plusmn; 0.10 0.25 &plusmn; 0.07 0.46 &plusmn; 0.09 0.36 &plusmn; 0.09 0.39 &plusmn; 0.08 0.34 &plusmn; 0.07 0.30 &plusmn; 0.05 0.31 &plusmn; 0.11
Consumptive Flux 1342 &plusmn; 28 1214 &plusmn; 65 1309 &plusmn; 32 1863 &plusmn; 69 1967 &plusmn; 60 1127 &plusmn; 54 1254 &plusmn; 52 1205 &plusmn; 27 1280 &plusmn; 28
C Mineralization 548 &plusmn; 12 496 &plusmn; 27 535 &plusmn; 13 776 &plusmn; 29 820 &plusmn; 25 461 &plusmn; 22 513 &plusmn; 21 492 &plusmn; 11 523 &plusmn; 11
N Mineralization -5.03 &plusmn; 0.12 -4.67 &plusmn; 0.26 -5.25 &plusmn; 0.09 -3.18 &plusmn; 0.22 -3.52 &plusmn; 0.10 -4.39 &plusmn; 0.22 -4.95 &plusmn; 0.24 -4.77 &plusmn; 0.13 -5.10 &plusmn; 0.12


Appendix E

Supplementary table of ANOVA outputs.

ANOVA output for each variable measured. Heterotrophic respiration is given in ln(g of C per m2 per year); soil moisture is given in ln(percent) gravimetrically; pH is given in ln(pH); C:N ratio is a unitless quantity; phenol oxidase and peroxidase concentration is given in μMol substrate per g soil per hour; total abundance and microfauna abundance is given in individuals per m2; mesofauna abundance is given in ln(individuals per m2); total biomass is given in in g of C per m2; consumptive flux and C mineralization are given in g of C per m2 per year; N mineralization is given in g of N per m2 per year.

sub_digits <- function(x) {
  subs <- c("₀","₁","₂","₃","₄","₅","₆","₇","₈","₉")
  digits <- strsplit(as.character(x), "")[[1]]
  paste0(subs[as.integer(digits) + 1], collapse = "")
}

terms <- c(
  "(Intercept)",
  "moisture_tx",
  "temp_tx",
  "destructive_time",
  "block_effect",
  "temp_tx:moisture_tx",
  "destructive_tx:moisture_tx",
  "temp_tx:destructive_tx",
  "temp_tx:destructive_tx:moisture_tx"
)

fmt_term_safe <- function(aov_tbl, term) {
  # Check if term exists in the ANOVA table
  if (!(term %in% rownames(aov_tbl))) {
    return("--")  # or "-" if you prefer
  }
  
  F_val <- round(aov_tbl[term, "F value"], 3)
  p_val <- round(aov_tbl[term, "Pr(>F)"], 3)
  df_term <- aov_tbl[term, "Df"]
  df_res  <- aov_tbl["Residuals", "Df"]
  
  paste0(
    "F", sub_digits(df_term),
    "\u02CC",
    sub_digits(df_res),
    " = ", format(F_val, nsmall = 3),
    ", <br> p = ", format(p_val, nsmall = 3)
  )
}

fmt_aov_row_safe <- function(aov_tbl, terms) {
  vapply(terms, fmt_term_safe, aov_tbl = aov_tbl, FUN.VALUE = character(1))
}

aov_list <- list(
  `Heterotrophic Respiration` = resp_aov2,
  `Soil pH` = pH_aov2,
   `C:N` = CN_aov2,
  `Phenol oxidase` = phenox_aov2,
  `Peroxidase` = perox_aov2,
  `Total Abundance` = total_ab_aov2,
  `Microfauna Abundance` = micro_ab_aov2,
  `Mesofauna Abudnace` = meso_ab_aov2,
  `Total Biomass` = total_biom_aov2,
  `Microfauna Biomass` = micro_biom_aov2,
  `Mesofauna Biomass` = meso_biom_aov2,
  `Consumptive Flux` = consumption_aov2,
  `C Mineralization` = Cmin_aov2,
  `N Mineralization` = Nmin_aov2
)

AppenE <- do.call(
  rbind,
  lapply(aov_list, fmt_aov_row_safe, terms = terms)
)

colnames(AppenE) <- c("Intercept", "Soil Moisture Treatment", 
                      "Temperature Treatment", 
                      "Destructive Sampling Treatment", "Block Effect", 
                      "Soil Moisture x Temperature Interaction", 
                      "Soil Moisture x Destructive Sampling Interaction",
                      "Temperature x Destructive Sampling Interaction",
                      "Soil Moisture x Temperature x Destructive Sampling Interaction")

knitr::kable(AppenE, linesep = "\\hline")
Intercept Soil Moisture Treatment Temperature Treatment Destructive Sampling Treatment Block Effect Soil Moisture x Temperature Interaction Soil Moisture x Destructive Sampling Interaction Temperature x Destructive Sampling Interaction Soil Moisture x Temperature x Destructive Sampling Interaction
Heterotrophic Respiration F₁ˌ₃₄ = 448.960, <br> p = 0.000 F₁ˌ₃₄ = 1.777, <br> p = 0.191 F₁ˌ₃₄ = 2.848, <br> p = 0.101 F₁ˌ₃₄ = 0.004, <br> p = 0.950 F₁ˌ₃₄ = 0.216, <br> p = 0.645
Soil pH F₁ˌ₃₂ = 17476.702, <br> p = 0.000 F₁ˌ₃₂ = 2.097, <br> p = 0.157 F₁ˌ₃₂ = 1.630, <br> p = 0.211 F₁ˌ₃₂ = 12.166, <br> p = 0.001 F₁ˌ₃₂ = 0.028, <br> p = 0.868
C:N F₁ˌ₃₁ = 336.769, <br> p = 0.000 F₁ˌ₃₁ = 0.398, <br> p = 0.533 F₁ˌ₃₁ = 1.522, <br> p = 0.227 F₁ˌ₃₁ = 0.502, <br> p = 0.484 F₁ˌ₃₁ = 1.038, <br> p = 0.316
Phenol oxidase F₁ˌ₃₂ = 55.547, <br> p = 0.000 F₁ˌ₃₂ = 0.760, <br> p = 0.390 F₁ˌ₃₂ = 16.455, <br> p = 0.000 F₁ˌ₃₂ = 5.398, <br> p = 0.027 F₁ˌ₃₂ = 1.159, <br> p = 0.290
Peroxidase F₁ˌ₃₁ = 42.085, <br> p = 0.000 F₁ˌ₃₁ = 0.009, <br> p = 0.925 F₁ˌ₃₁ = 6.954, <br> p = 0.013 F₁ˌ₃₁ = 20.949, <br> p = 0.000 F₁ˌ₃₁ = 6.091, <br> p = 0.019
Total Abundance F₁ˌ₃₄ = 57.927, <br> p = 0.000 F₁ˌ₃₄ = 19.104, <br> p = 0.000 F₁ˌ₃₄ = 0.509, <br> p = 0.481 F₁ˌ₃₄ = 0.466, <br> p = 0.499 F₁ˌ₃₄ = 22.953, <br> p = 0.000
Microfauna Abundance F₁ˌ₃₄ = 23.738, <br> p = 0.000 F₁ˌ₃₄ = 21.152, <br> p = 0.000 F₁ˌ₃₄ = 0.403, <br> p = 0.530 F₁ˌ₃₄ = 0.966, <br> p = 0.333 F₁ˌ₃₄ = 11.168, <br> p = 0.002
Mesofauna Abudnace F₁ˌ₃₃ = 4938.218, <br> p = 0.000 F₁ˌ₃₃ = 6.142, <br> p = 0.018 F₁ˌ₃₃ = 2.821, <br> p = 0.103 F₁ˌ₃₃ = 1.968, <br> p = 0.170 F₁ˌ₃₃ = 11.936, <br> p = 0.002
Total Biomass F₁ˌ₃₃ = 58.915, <br> p = 0.000 F₁ˌ₃₃ = 8.631, <br> p = 0.006 F₁ˌ₃₃ = 0.076, <br> p = 0.784 F₁ˌ₃₃ = 1.375, <br> p = 0.249 F₁ˌ₃₃ = 17.287, <br> p = 0.000
Microfauna Biomass F₁ˌ₃₄ = 23.738, <br> p = 0.000 F₁ˌ₃₄ = 21.152, <br> p = 0.000 F₁ˌ₃₄ = 0.403, <br> p = 0.530 F₁ˌ₃₄ = 0.966, <br> p = 0.333 F₁ˌ₃₄ = 11.168, <br> p = 0.002
Mesofauna Biomass F₁ˌ₃₃ = 57.803, <br> p = 0.000 F₁ˌ₃₃ = 8.266, <br> p = 0.007 F₁ˌ₃₃ = 0.069, <br> p = 0.795 F₁ˌ₃₃ = 1.440, <br> p = 0.239 F₁ˌ₃₃ = 16.758, <br> p = 0.000
Consumptive Flux F₁ˌ₃₃ = 1046.791, <br> p = 0.000 F₁ˌ₃₃ = 8.653, <br> p = 0.006 F₁ˌ₃₃ = 214.881, <br> p = 0.000 F₁ˌ₃₃ = 0.748, <br> p = 0.393 F₁ˌ₃₃ = 6.267, <br> p = 0.017
C Mineralization F₁ˌ₃₃ = 1030.642, <br> p = 0.000 F₁ˌ₃₃ = 8.725, <br> p = 0.006 F₁ˌ₃₃ = 236.901, <br> p = 0.000 F₁ˌ₃₃ = 0.739, <br> p = 0.396 F₁ˌ₃₃ = 6.173, <br> p = 0.018
N Mineralization F₁ˌ₃₃ = 1047.625, <br> p = 0.000 F₁ˌ₃₃ = 13.061, <br> p = 0.001 F₁ˌ₃₃ = 78.383, <br> p = 0.000 F₁ˌ₃₃ = 2.387, <br> p = 0.132 F₁ˌ₃₃ = 0.002, <br> p = 0.965


Appendix F

Supplementary table of linear model outputs.

Estimate of coefficient (± SEM) for each variable measured, based on corresponding linear models. Heterotrophic respiration is given in ln(g of C per m2 per year); soil moisture is given in ln(percent) gravimetrically; pH is given in ln(pH); C:N ratio is a unitless quantity; phenol oxidase and peroxidase concentration is given in μMol substrate per g soil per hour; total abundance and microfauna abundance is given in individuals per m2; mesofauna abundance is given in ln(individuals per m2); total biomass is given in in g of C per m2; consumptive flux and C mineralization are given in g of C per m2 per year; N mineralization is given in g of N per m2 per year.

lm_terms <- c(
  "(Intercept)",
  "moisture_txHigh",
  "temp_tx20",
  "destructive_timeT2",
  "block_effecthigh ",
  "moisture_txHigh:temp_tx20",
  "moisture_txHigh:destructive_timeT2",
  "temp_tx20:destructive_timeT2",
  "moisture_txHigh:temp_tx20:destructive_timeT2"
)

fmt_lm_term_safe <- function(lm_tbl, term) {
  coefs <- summary(lm_tbl)$coefficients
  if (!(term %in% rownames(coefs))) {
    return("--")   # or "-" if you prefer
  }
  
  est <- coefs[term, "Estimate"]
  se  <- coefs[term, "Std. Error"]
  digits <- get_round_digit(se)
  
  paste0(
    format(round(est, digits), digits),
    " \u00B1 ",
    format(round(se, digits), digits)
  )
}


fmt_lm_row_safe <- function(lm_tbl, terms) {
  vapply(terms, fmt_lm_term_safe, lm_tbl = lm_tbl, FUN.VALUE = character(1))
}

lm_list <- list(
  `Heterotrophic Respiration` = resp_lm2,
  `Soil pH` = pH_lm2,
   `C:N` = CN_lm2,
  `Phenol oxidase` = phenox_lm2,
  `Peroxidase` = perox_lm2,
  `Total Abundance` = total_ab_lm2,
  `Microfauna Abundance` = micro_ab_lm2,
  `Mesofauna Abudnace` = meso_ab_lm2,
  `Total Biomass` = total_biom_lm2,
  `Microfauna Biomass` = micro_biom_lm2,
  `Mesofauna Biomass` = meso_biom_lm2,
  `Consumptive Flux` = consumption_lm2,
  `C Mineralization` = Cmin_lm2,
  `N Mineralization` = Nmin_lm2
)

AppenF <- do.call(
  rbind,
  lapply(lm_list, fmt_lm_row_safe, terms = lm_terms)
)

colnames(AppenF) <- c("Intercept", "Saturated Soil Moisture", 
                      "+ 8\u00B0C Warming", 
                      "T\u2082 Destructive Sampling", "High Abundance Block", 
                      "Saturated Soil Moisture x + 8\u00B0C Warming Interaction", 
                      "Saturated Soil Moisture x T\u2082 Destructive Sampling Interaction",
                      "Temperature x T\u2082 Destructive Sampling Interaction",
                      "Saturated Soil Moisture x + 8\u00B0C Warming x T\u2082 Destructive Sampling Interaction")

knitr::kable(AppenF, linesep = "\\hline")
Intercept Saturated Soil Moisture
  • 8°C Warming
T₂ Destructive Sampling High Abundance Block Saturated Soil Moisture x + 8°C Warming Interaction Saturated Soil Moisture x T₂ Destructive Sampling Interaction Temperature x T₂ Destructive Sampling Interaction Saturated Soil Moisture x + 8°C Warming x T₂ Destructive Sampling Interaction
Heterotrophic Respiration 6.1 ± 0.3 0.4 ± 0.3 0.5 ± 0.3 0 ± 0.3
Soil pH 1.41 ± 0.01 0.014 ± 0.01 -0.012 ± 0.01 0.04 ± 0.01
C:N 36 ± 2 -1 ± 2 2 ± 2 -1 ± 2
Phenol oxidase 110 ± 20 -10 ± 10 80 ± 20 40 ± 20 -80 ± 30
Peroxidase 100 ± 10 0 ± 10 50 ± 20 80 ± 20 -60 ± 20
Total Abundance 280000 ± 40000 -150000 ± 30000 20000 ± 30000 20000 ± 40000
Microfauna Abundance 110000 ± 20000 -1e+05 ± 20000 10000 ± 20000 20000 ± 20000
Mesofauna Abudnace 11.8 ± 0.2 -0.4 ± 0.1 0.4 ± 0.2 0.3 ± 0.2 -0.6 ± 0.3
Total Biomass 0.43 ± 0.06 -0.2 ± 0.07 0.01 ± 0.05 -0.08 ± 0.07 0.18 ± 0.1
Microfauna Biomass 0.006 ± 0.001 -0.006 ± 0.001 0.001 ± 0.001 0.001 ± 0.001
Mesofauna Biomass 0.42 ± 0.06 -0.2 ± 0.07 0.01 ± 0.05 -0.08 ± 0.07 0.18 ± 0.1
Consumptive Flux 1180 ± 40 90 ± 30 670 ± 50 -40 ± 50 -620 ± 60
C Mineralization 480 ± 20 40 ± 10 290 ± 20 -20 ± 20 -270 ± 30
N Mineralization -4.7 ± 0.1 -0.5 ± 0.1 1.6 ± 0.2 0.3 ± 0.2 -1.9 ± 0.3

Curriculum Vitae