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") 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.
carbon flux, nitrogen mineralization, soil biodiversity, boreal
peatlands, energetic food web models, hydrological changes, warming
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.
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.
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).
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).
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.
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.
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.
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:
- 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).
- Examining whether any measurable response of perturbed mesocosms is mitigated when mesocosms are returned to field-based temperatures (Resilience).
- 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.
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).
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
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
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.
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.
# 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.
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, " ± ", se_cum_resp_T0),
"ln(g of C / m^2^ / year)",
"Soil Moisture",
paste0(mean_soil_moisture_T0, " ± ", se_soil_moisture_T0),
"%",
"pH",
paste0(mean_pH_T0, " ± ", se_pH_T0),
"Unitless",
"C:N Ratio",
paste0(mean_CN_T0, " ± ", se_CN_T0),
"Unitless",
"Phenol Oxidase Concentration",
paste0(mean_phenox_T0, " ± ", se_phenox_T0),
"μmol substrate / g soil / hour",
"Peroxidase Concentration",
paste0(mean_perox_T0, " ± ", se_perox_T0),
" μmol substrate / g soil / hour",
"Total Microfauna Abundance",
paste0(mean_mico_abundance_T0, " ± ", se_micro_abundance_T0),
"individuals per m^2^",
"Total Mesofauna Abundance",
paste0(mean_meso_abundance_T0, " ± ", se_meso_abundance_T0),
"individuals per m^2^",
"Total Fauna Abundance",
paste0(mean_total_abundance_T0, " ± ", se_total_abundance_T0),
"individuals per m^2^"
), ncol = 3, byrow = T))
colnames(T0_df1) <- c("Measurement", "Mean ± 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.
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, " ± ", se_micro_biomass_T0),
"g of C / m^2^",
"Mesofauna Biomass",
paste0(mean_meso_biomass_T0, " ± ", se_meso_bioamss_T0),
"g of C / m^2^",
"Total Biomass",
paste0(mean_total_biomass_T0, " ± ", se_total_biomass_T0),
"g of C / m^2^",
"Total Consumption",
paste0(mean_total_consumption_T0, " ± ", se_total_consumption_T0),
"g of C / m^2^ / year",
"Total C Mineralization",
paste0(mean_total_Cmin_T0, " ± ", se_total_Cmin_T0),
"g of C / m^2^ / year",
"Total N Mineralization",
paste0(mean_total_Nmin_T0, " ± ", se_total_Nmin_T0),
"g of C / m^2^ / year"
), ncol = 3, byrow = T))
colnames(T0_df2) <- c("Measurement", "Mean ± 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 |
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_plotresp_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.
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,
"< 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,
"< 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 |
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,
"< 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,
"< 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,
"< 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,
"< 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 |
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")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.
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,
"< 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,
"< 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,
"< 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,
"< 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,
"< 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,
"< 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.
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,
"< 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,
"< 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,
"< 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,
"< 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.
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,
"< 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,
"< 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,
"< 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,
"< 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.
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,
"< 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,
"< 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,
"< 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,
"< 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 |
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 (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.
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 |
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.
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 |
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.
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 |
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 (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.
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.
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 |
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.
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 |
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 |
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 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).
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 |
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 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).
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 |
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 (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.
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 |
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.
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 |
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.
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 |
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.
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 |
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 °C)` = a,
`E~p~ (12 °C)` = p,
`d (12 °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 °C)` = a,
`E~p~ (20 °C)` = p,
`d (20 °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 °C) | Ep (12 °C) | d (12 °C) | Ea (20 °C) | Ep (20 °C) | d (20 °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).
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 |
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 °C",
"T1.Ambient.20" = "T~1~ Field-Moist 20 °C",
"T1.High.12" = "T~1~ Saturated 12 °C",
"T1.High.20" = "T~1~ Saturated 20 °C",
"T2.Ambient.12" = "T~2~ Field-Moist 12 °C",
"T2.Ambient.20" = "T~2~ Field-Moist 20 °C",
"T2.High.12" = "T~2~ Saturated 12 °C",
"T2.High.20" = "T~2~ Saturated 20 °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),
" ± ",
round(AppenC.temp3$meso.se, 3)),
Zerco = paste0(round(AppenC.temp3$zerco.mean, 3),
" ± ",
round(AppenC.temp3$zerco.se, 3)),
`Mites NP` = paste0(round(AppenC.temp3$mitesNP.mean, 3),
" ± ",
round(AppenC.temp3$mitesNP.se, 3)),
`Juv Orib` = paste0(round(AppenC.temp3$juvorib.mean, 2),
" ± ",
round(AppenC.temp3$juvorib.se, 2)),
Orib = paste0(round(AppenC.temp3$orib.mean, 2),
" ± ",
round(AppenC.temp3$orib.se, 2)),
Coll = paste0(round(AppenC.temp3$coll.mean, 3),
" ± ",
round(AppenC.temp3$coll.se, 3)),
`Pred Nem` = paste0(round(AppenC.temp3$prednem.mean, 4),
" ± ",
round(AppenC.temp3$prednem.se, 4)),
`Bac Nem` = paste0(round(AppenC.temp3$bactnem.mean, 4),
" ± ",
round(AppenC.temp3$bactnem.se, 4)),
`Fung Nem` = paste0(round(AppenC.temp3$fungnem.mean, 4),
" ± ",
round(AppenC.temp3$fungnem.se, 4)),
`Omni Nem` = paste0(round(AppenC.temp3$omninem.mean, 4),
" ± ",
round(AppenC.temp3$omninem.se, 4)),
Pro = paste0(round(AppenC.temp3$pro.mean, 1),
" ± ",
round(AppenC.temp3$pro.se, 1)),
Bact = paste0(round(AppenC.temp3$bact.mean, 1),
" ± ",
round(AppenC.temp3$bact.se, 1)),
Fung = paste0(round(AppenC.temp3$fung.mean, 0),
" ± ",
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 ± 0.002 | 0.009 ± 0.004 | 0.041 ± 0.008 | 0.31 ± 0.04 | 0.36 ± 0.04 | 0.004 ± 0.002 | 0.0019 ± 4e-04 | 6e-04 ± 2e-04 | 0.006 ± 0.0014 | 7e-04 ± 2e-04 | 2.8 ± 0.1 | 11.7 ± 0.2 | 87 ± 2 | 135707 | 135707 |
| T1 Field-Moist 12 °C | 0.006 ± 0.002 | 0.005 ± 0.003 | 0.04 ± 0.016 | 0.14 ± 0.03 | 0.29 ± 0.05 | 0.006 ± 0.004 | 0.0013 ± 9e-04 | 5e-04 ± 3e-04 | 0.0043 ± 0.0029 | 5e-04 ± 3e-04 | 2.5 ± 0.1 | 10.6 ± 0.6 | 79 ± 4 | 135707 | 135707 |
| T1 Field-Moist 20 °C | 0.005 ± 0.002 | 0.004 ± 0.001 | 0.045 ± 0.013 | 0.12 ± 0.02 | 0.28 ± 0.06 | 0.004 ± 0.001 | 0.0016 ± 3e-04 | 6e-04 ± 1e-04 | 0.0052 ± 0.0011 | 6e-04 ± 1e-04 | 2.6 ± 0.1 | 10.9 ± 0.4 | 81 ± 3 | 135707 | 135707 |
| T1 Saturated 12 °C | 0.001 ± 0.001 | 0.006 ± 0.003 | 0.027 ± 0.005 | 0.07 ± 0.02 | 0.14 ± 0.04 | 0 ± 0 | 5e-04 ± 2e-04 | 2e-04 ± 1e-04 | 0.0017 ± 5e-04 | 2e-04 ± 1e-04 | 2.7 ± 0.1 | 11.6 ± 0.3 | 86 ± 2 | 135707 | 135707 |
| T1 Saturated 20 °C | 0.004 ± 0.002 | 0.003 ± 0.002 | 0.03 ± 0.01 | 0.12 ± 0.02 | 0.2 ± 0.06 | 0.002 ± 0.001 | 6e-04 ± 1e-04 | 2e-04 ± 1e-04 | 0.0018 ± 5e-04 | 2e-04 ± 1e-04 | 2.7 ± 0.1 | 11.6 ± 0.3 | 86 ± 2 | 135707 | 135707 |
| T2 Field-Moist 12 °C | 0.002 ± 0.001 | 0.003 ± 0.001 | 0.034 ± 0.01 | 0.13 ± 0.03 | 0.21 ± 0.04 | 0.004 ± 0.002 | 0.0014 ± 4e-04 | 5e-04 ± 1e-04 | 0.0046 ± 0.0013 | 5e-04 ± 1e-04 | 2.3 ± 0.1 | 9.9 ± 0.5 | 74 ± 4 | 135707 | 135707 |
| T2 Field-Moist 20 °C | 0.002 ± 0.001 | 0.004 ± 0.002 | 0.032 ± 0.011 | 0.09 ± 0.02 | 0.17 ± 0.02 | 0.002 ± 0.001 | 0.0018 ± 4e-04 | 6e-04 ± 1e-04 | 0.0057 ± 0.0012 | 7e-04 ± 1e-04 | 2.5 ± 0.1 | 10.6 ± 0.2 | 79 ± 2 | 135707 | 135707 |
| T2 Saturated 12 °C | 0.004 ± 0.002 | 0.004 ± 0.002 | 0.03 ± 0.006 | 0.1 ± 0.02 | 0.2 ± 0.04 | 0.002 ± 0.002 | 6e-04 ± 2e-04 | 2e-04 ± 1e-04 | 0.0019 ± 5e-04 | 2e-04 ± 1e-04 | 2.6 ± 0.1 | 11.1 ± 0.5 | 82 ± 4 | 135707 | 135707 |
| T2 Saturated 20 °C | 0.002 ± 0.001 | 0.002 ± 0.002 | 0.023 ± 0.006 | 0.1 ± 0.04 | 0.18 ± 0.07 | 0.001 ± 0.001 | 3e-04 ± 1e-04 | 1e-04 ± 0 | 8e-04 ± 2e-04 | 1e-04 ± 0 | 2.7 ± 0.1 | 11.3 ± 0.2 | 84 ± 2 | 135707 | 135707 |
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),
" ± ",
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),
" ± ",
format(round(se.moisture, 2), nsmall = 2)),
`pH` =
paste0(format(round(mean.pH, 3), nsmall = 3),
" ± ",
format(round(se.pH, 3), nsmall = 3)),
`C:N` =
paste0(format(round(mean.CN, 0), nsmall = 0),
" ± ",
format(round(se.CN, 0), nsmall = 0)),
`Phenol oxidase` =
paste0(format(round(mean.phenox, 0), nsmall = 0),
" ± ",
format(round(se.phenox, 0), nsmall = 0)),
`Peroxidase` =
paste0(format(round(mean.perox, 0), nsmall = 0),
" ± ",
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),
" ± ",
format(round(se.total.ab, -4), nsmall=0)),
`Microfauna Abundance` =
paste0(format(round(mean.micro.ab, -4), nsmall = 0),
" ± ",
format(round(se.micro.ab, -4), nsmall=0)),
`Mesofauna Abundance` =
paste0(format(round(mean.meso.ab, 1), nsmall = 1),
" ± ",
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),
" ± ",
format(round(se.total.biom, 2), nsmall = 2)),
`Microfauna Biomass` =
paste0(format(round(mean.micro.biom, 4), nsmall = 4),
" ± ",
format(round(se.micro.biom, 4), nsmall = 4)),
`Mesofauna Biomass` =
paste0(format(round(mean.meso.biom, 2), nsmall = 2),
" ± ",
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),
" ± ",
format(round(se.cons, 0), nsmall = 0)),
`C Mineralization` =
paste0(format(round(mean.Cmin, 0), nsmall = 0),
" ± ",
format(round(se.Cmin, 0), nsmall = 0)),
`N Mineralization` =
paste0(format(round(mean.Nmin, 2), nsmall = 2),
" ± ",
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 ± 0.1 | 6.0 ± 0.4 | 6.4 ± 0.5 | 6.7 ± 0.5 | 7.0 ± 0.2 | 6.1 ± 0.3 | 6.6 ± 0.4 | 6.5 ± 0.5 | 6.7 ± 0.5 |
| Soil Moisture | 6.68 ± 0.06 | 6.68 ± 0.09 | 6.97 ± 0.06 | 6.64 ± 0.08 | 6.86 ± 0.07 | 6.72 ± 0.07 | 6.84 ± 0.06 | 6.52 ± 0.07 | 6.83 ± 0.07 |
| pH | 1.405 ± 0.013 | 1.387 ± 0.028 | 1.450 ± 0.027 | 1.378 ± 0.004 | 1.414 ± 0.015 | 1.443 ± 0.022 | 1.447 ± 0.014 | 1.436 ± 0.013 | 1.445 ± 0.009 |
| C:N | 37 ± 2 | 36 ± 3 | 36 ± 3 | 40 ± 5 | NA ± NA | 33 ± 3 | 36 ± 1 | NA ± NA | NA ± NA |
| Phenol oxidase | 158 ± 16 | 131 ± 29 | NA ± NA | 199 ± 24 | 183 ± 31 | 146 ± 8 | 160 ± 8 | 155 ± 8 | 148 ± 5 |
| Peroxidase | 154 ± 8 | 111 ± 36 | 98 ± 21 | 143 ± 12 | 157 ± 16 | 172 ± 13 | 183 ± 9 | 175 ± 24 | 163 ± 15 |
| Total Abundance | 540000 ± 50000 | 330000 ± 130000 | 150000 ± 30000 | 360000 ± 70000 | 220000 ± 50000 | 300000 ± 60000 | 200000 ± 40000 | 290000 ± 40000 | 160000 ± 50000 |
| Microfauna Abundance | 170000 ± 40000 | 120000 ± 80000 | 50000 ± 10000 | 150000 ± 30000 | 50000 ± 10000 | 130000 ± 40000 | 50000 ± 20000 | 160000 ± 40000 | 20000 ± 10000 |
| Mesofauna Abundance | 12.8 ± 0.1 | 12.1 ± 0.2 | 11.4 ± 0.2 | 12.1 ± 0.3 | 11.9 ± 0.2 | 12.0 ± 0.2 | 11.8 ± 0.2 | 11.7 ± 0.2 | 11.6 ± 0.3 |
| Total Biomass | 0.74 ± 0.08 | 0.49 ± 0.10 | 0.25 ± 0.07 | 0.46 ± 0.09 | 0.37 ± 0.09 | 0.39 ± 0.08 | 0.34 ± 0.07 | 0.31 ± 0.05 | 0.31 ± 0.11 |
| Microfauna Biomass | 0.0092 ± 0.0022 | 0.0066 ± 0.0044 | 0.0026 ± 0.0008 | 0.0080 ± 0.0017 | 0.0028 ± 0.0007 | 0.0070 ± 0.0020 | 0.0029 ± 0.0008 | 0.0087 ± 0.0019 | 0.0013 ± 0.0004 |
| Mesofauna Biomass | 0.73 ± 0.08 | 0.48 ± 0.10 | 0.25 ± 0.07 | 0.46 ± 0.09 | 0.36 ± 0.09 | 0.39 ± 0.08 | 0.34 ± 0.07 | 0.30 ± 0.05 | 0.31 ± 0.11 |
| Consumptive Flux | 1342 ± 28 | 1214 ± 65 | 1309 ± 32 | 1863 ± 69 | 1967 ± 60 | 1127 ± 54 | 1254 ± 52 | 1205 ± 27 | 1280 ± 28 |
| C Mineralization | 548 ± 12 | 496 ± 27 | 535 ± 13 | 776 ± 29 | 820 ± 25 | 461 ± 22 | 513 ± 21 | 492 ± 11 | 523 ± 11 |
| N Mineralization | -5.03 ± 0.12 | -4.67 ± 0.26 | -5.25 ± 0.09 | -3.18 ± 0.22 | -3.52 ± 0.10 | -4.39 ± 0.22 | -4.95 ± 0.24 | -4.77 ± 0.13 | -5.10 ± 0.12 |
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 | – | – | – | – |
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 |
|
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 | – |