<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Tutorial on Castro Lab</title><link>https://www.castrolab.org/tags/tutorial/</link><description>Recent content in Tutorial on Castro Lab</description><generator>Hugo -- gohugo.io</generator><language>en-us</language><managingEditor>ecastron@utalca.cl (Eduardo Castro)</managingEditor><webMaster>ecastron@utalca.cl (Eduardo Castro)</webMaster><copyright>&amp;copy; 2023</copyright><lastBuildDate>Tue, 21 Apr 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://www.castrolab.org/tags/tutorial/" rel="self" type="application/rss+xml"/><item><title>Seasonal community dynamics in Comau Fjord — Analysis walkthrough</title><link>https://www.castrolab.org/post/comau-walkthrough/</link><pubDate>Tue, 21 Apr 2026 00:00:00 +0000</pubDate><author>ecastron@utalca.cl (Eduardo Castro)</author><guid>https://www.castrolab.org/post/comau-walkthrough/</guid><description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Companion to:&lt;/strong&gt; Guajardo-Leiva et al., &lt;em&gt;Seasonal structuring of microbial communities and functional potential in a Patagonian fjord&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This walkthrough explains the logic behind each analysis in the paper — not just &lt;em&gt;how&lt;/em&gt; the code works, but &lt;em&gt;why&lt;/em&gt; we made each analytical choice and &lt;em&gt;what the results mean&lt;/em&gt; biologically. It is written for anyone familiar with R and community ecology who wants to understand or reproduce the work, or adapt it to their own system. All scripts and data files are available in this repository.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Data and scripts:&lt;/strong&gt; All files needed to reproduce the analyses are available at
&lt;a href="https://github.com/ecastron/comau-reproducibility"&gt;github.com/ecastron/comau-reproducibility&lt;/a&gt;.
Download the repo as a ZIP (green &lt;em&gt;Code&lt;/em&gt; button) or clone it:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git clone https://github.com/ecastron/comau-reproducibility.git
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Then run any figure script from that directory:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-r" data-lang="r"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;setwd&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;path/to/comau-reproducibility&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;source&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;utils.R&amp;#34;&lt;/span&gt;) &lt;span style="color:#75715e"&gt;# always load this first&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;source&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;Figure1_final.R&amp;#34;&lt;/span&gt;) &lt;span style="color:#75715e"&gt;# or Figure2_final.R, etc.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The code chunks below are drawn directly from those scripts and are complete enough to reproduce each analysis step-by-step.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id="the-story-in-one-paragraph"&gt;The story in one paragraph&lt;/h2&gt;
&lt;p&gt;Comau Fjord (42°S, Chilean Patagonia) is a deep, stratified fjord with a sharp two-layer water column: a shallow, freshwater-influenced surface layer (5 m) that swings wildly with season, and a deeper, saline layer (20 m) that barely changes. We sequenced the microbial community across both depths during three Southern Hemisphere seasons — Summer, Fall, Winter — and reconstructed 513 metagenome-assembled genomes (MAGs). The central question was whether depth and season structure communities in the same way or through different mechanisms. The answer is that they do not: &lt;strong&gt;surface communities are shaped by competition and niche partitioning&lt;/strong&gt; (functionally diverse, phylogenetically overdispersed), while &lt;strong&gt;deep communities are shaped by environmental filtering&lt;/strong&gt; (functionally convergent, phylogenetically clustered). pH emerges as the single strongest continuous driver, and seasonal timing — not geographic distance — best predicts how similar any two samples are.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="study-system-and-prior-work"&gt;Study system and prior work&lt;/h2&gt;
&lt;p&gt;Comau Fjord stretches ~45 km through northern Chilean Patagonia, reaching nearly 490 m depth. High rainfall and snowmelt create a shallow brackish surface layer over a cold, saline body of modified Subantarctic water. This stratification creates steep vertical gradients in temperature, salinity, nutrients, and pH. Salinity-driven stratification has been shown to shape macrobenthic biodiversity patterns along both the horizontal and vertical axes of the fjord &lt;a href="https://consensus.app/papers/details/5aa3cfc863bf5c3eb79b82ed0d08fc3b/?utm_source=claude_desktop"&gt;Villalobos et al. 2021&lt;/a&gt;, and the same two-layer structure likely sets the template for the microbial niche partitioning we document here.&lt;/p&gt;
&lt;p&gt;The metagenomes and MAGs used in this study were first described in &lt;a href="https://consensus.app/papers/details/cbfdcfaa837a5ca3960edb5d2ea9b38a/?utm_source=claude_desktop"&gt;Castro-Nallar et al. 2023&lt;/a&gt;, presenting the spatially and temporally resolved dataset as a resource. An earlier metagenomics survey by &lt;a href="https://consensus.app/papers/details/f7e862b4e7a954f78bd9d44a39e9d74f/?utm_source=claude_desktop"&gt;Guajardo-Leiva et al. 2023&lt;/a&gt; established that surface communities are taxonomically distinct from global ocean surveys (Tara Oceans), yet converge on cosmopolitan marine lineages (Proteobacteria, Bacteroidota, Actinobacteria). The first metagenomic description of the fjord dates to a microbial mat study by &lt;a href="https://consensus.app/papers/details/7e8acad00eb5577c845a2ca66cd1d766/?utm_source=claude_desktop"&gt;Ugalde et al. 2013&lt;/a&gt;, which identified sulfate and nitrate reduction genes in Gammaproteobacteria-dominated communities — foreshadowing the sulfur-cycle signal we detect in the water column.&lt;/p&gt;
&lt;h3 id="salmon-aquaculture-an-elephant-in-the-fjord"&gt;Salmon aquaculture: an elephant in the fjord&lt;/h3&gt;
&lt;p&gt;The northern Chilean Patagonian fjords, including Comau, host one of the world&amp;rsquo;s most intensive salmon aquaculture industries. Microcosm experiments conducted directly in Comau Fjord showed that nutrient loading from fish farms significantly restructures bacterial communities — dissimilarity between low- and high-nutrient treatments reaching 78% — while diversity itself remained resilient &lt;a href="https://consensus.app/papers/details/339430a7c9ff5de295998d86913c9108/?utm_source=claude_desktop"&gt;Olsen et al. 2017&lt;/a&gt;. Dissolved organic matter from salmon feed (SF-DOM) is highly reactive, boosting bacterial production 2-fold while reducing species richness &lt;a href="https://consensus.app/papers/details/7e77446cd68f52dea081cdfaeb6ed91e/?utm_source=claude_desktop"&gt;Montero et al. 2022&lt;/a&gt;. Communities carry elevated &lt;strong&gt;antibiotic resistance genes (ARGs)&lt;/strong&gt; — dominated by beta-lactams, tetracyclines, and MLS resistance &lt;a href="https://consensus.app/papers/details/f7e862b4e7a954f78bd9d44a39e9d74f/?utm_source=claude_desktop"&gt;Guajardo-Leiva et al. 2023&lt;/a&gt;. In March 2021, the same seasonal forcing that drives natural community dynamics triggered a catastrophic &lt;em&gt;Heterosigma akashiwo&lt;/em&gt; bloom that killed ~6,000 tonnes of farmed salmon within 15 days &lt;a href="https://consensus.app/papers/details/03ecb7a1d54052c5bc8803d0d39a84c5/?utm_source=claude_desktop"&gt;Díaz et al. 2022&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id="seasonal-forcing-in-patagonian-fjords"&gt;Seasonal forcing in Patagonian fjords&lt;/h3&gt;
&lt;p&gt;Primary production in Chilean fjords swings by two orders of magnitude between winter and spring, with bacterioplankton tightly coupled to phytoplankton throughout &lt;a href="https://consensus.app/papers/details/e6f4b7e9d4535a26aeaa49b2b8ddf54e/?utm_source=claude_desktop"&gt;Montero et al. 2011&lt;/a&gt;. In Puyuhuapi Fjord, Flavobacteriaceae, Rhodobacteraceae, and Cryomorphaceae dominate surface communities and their diversity declines with rising winter temperatures — a warning for climate change impacts &lt;a href="https://consensus.app/papers/details/c1c546dcfc6a5c26a3a11a7a399877bb/?utm_source=claude_desktop"&gt;Gutiérrez et al. 2018&lt;/a&gt;. Across a wider spatial scale, &lt;a href="https://consensus.app/papers/details/bc749bd6dd9756dcb444599c4ca13b2f/?utm_source=claude_desktop"&gt;Tamayo-Leiva et al. 2021&lt;/a&gt; showed that estuarine water influence structures bacterioplankton over hundreds of kilometres, with dissolved oxygen and salinity as first-order drivers.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="data-objects-and-shared-utilities"&gt;Data objects and shared utilities&lt;/h2&gt;
&lt;p&gt;All analyses start from two core files and a shared utility script:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;File&lt;/th&gt;
&lt;th&gt;Contents&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Comau_ps90.RDS&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;A &lt;code&gt;phyloseq&lt;/code&gt; object: count table (MAGs × samples), taxonomy, sample metadata, and a rooted ML phylogeny built from 81 universal marker genes (IQ-TREE)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;gene_bin_mat.collapsed.v6.csv&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Binary matrix of functional gene hits (rows = genes/KOs, columns = 677 MAGs before dereplication)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;utils.R&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Shared palettes, season classifier, &lt;code&gt;load_ps()&lt;/code&gt;, VIF filter, MRM wrappers&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Every script begins with &lt;code&gt;source(&amp;quot;utils.R&amp;quot;)&lt;/code&gt;, which sets the working directory, defines palettes and helpers, and exposes &lt;code&gt;load_ps()&lt;/code&gt;. Key definitions from &lt;code&gt;utils.R&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-r" data-lang="r"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Season assignment — Southern Hemisphere calendar&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;get_season_sh &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;function&lt;/span&gt;(d) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; m &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;as.integer&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;format&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;as.Date&lt;/span&gt;(d), &lt;span style="color:#e6db74"&gt;&amp;#34;%m&amp;#34;&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;ifelse&lt;/span&gt;(m &lt;span style="color:#f92672"&gt;%in%&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;c&lt;/span&gt;(&lt;span style="color:#ae81ff"&gt;12&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;), &lt;span style="color:#e6db74"&gt;&amp;#34;Summer&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;ifelse&lt;/span&gt;(m &lt;span style="color:#f92672"&gt;%in%&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;c&lt;/span&gt;(&lt;span style="color:#ae81ff"&gt;3&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;4&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;5&lt;/span&gt;), &lt;span style="color:#e6db74"&gt;&amp;#34;Fall&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;ifelse&lt;/span&gt;(m &lt;span style="color:#f92672"&gt;%in%&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;c&lt;/span&gt;(&lt;span style="color:#ae81ff"&gt;6&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;7&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;8&lt;/span&gt;), &lt;span style="color:#e6db74"&gt;&amp;#34;Winter&amp;#34;&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;NA_character_&lt;/span&gt;)))
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Canonical palettes (Wong 2011 — colour-blind safe)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;pal_season &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;c&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;Summer&amp;#34;&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;#E69F00&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34;Fall&amp;#34;&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;#D55E00&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34;Winter&amp;#34;&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;#56B4E9&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;shape_depth &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;c&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;5&amp;#34;&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;16&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34;20&amp;#34;&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;17&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Load and annotate phyloseq object&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;load_ps &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;function&lt;/span&gt;(path &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;Comau_ps90.RDS&amp;#34;&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ps &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;readRDS&lt;/span&gt;(path)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; sd &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;as.data.frame&lt;/span&gt;(phyloseq&lt;span style="color:#f92672"&gt;::&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;sample_data&lt;/span&gt;(ps))
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; sd&lt;span style="color:#f92672"&gt;$&lt;/span&gt;Collection_Date &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;as.Date&lt;/span&gt;(sd&lt;span style="color:#f92672"&gt;$&lt;/span&gt;Collection_Date)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; sd&lt;span style="color:#f92672"&gt;$&lt;/span&gt;season &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;factor&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;get_season_sh&lt;/span&gt;(sd&lt;span style="color:#f92672"&gt;$&lt;/span&gt;Collection_Date), levels &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;c&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;Summer&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34;Fall&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34;Winter&amp;#34;&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; sd&lt;span style="color:#f92672"&gt;$&lt;/span&gt;depth_m &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;factor&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;as.character&lt;/span&gt;(sd&lt;span style="color:#f92672"&gt;$&lt;/span&gt;depth_m), levels &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;c&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;5&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34;20&amp;#34;&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; phyloseq&lt;span style="color:#f92672"&gt;::&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;sample_data&lt;/span&gt;(ps) &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; phyloseq&lt;span style="color:#f92672"&gt;::&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;sample_data&lt;/span&gt;(sd)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ps
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Iterative VIF filter (drops highest-VIF predictor until all VIF ≤ thr)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;drop_high_vif_vegan &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;function&lt;/span&gt;(Xdf, Y, thr &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;10&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; keep &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;colnames&lt;/span&gt;(Xdf)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;repeat&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; mod &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; vegan&lt;span style="color:#f92672"&gt;::&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;rda&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;as.matrix&lt;/span&gt;(Y) &lt;span style="color:#f92672"&gt;~&lt;/span&gt; ., data &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;as.data.frame&lt;/span&gt;(Xdf[, keep, drop &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;FALSE&lt;/span&gt;]))
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; v &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; vegan&lt;span style="color:#f92672"&gt;::&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;vif.cca&lt;/span&gt;(mod)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (&lt;span style="color:#a6e22e"&gt;max&lt;/span&gt;(v, na.rm &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;TRUE&lt;/span&gt;) &lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; thr &lt;span style="color:#f92672"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;length&lt;/span&gt;(keep) &lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; keep &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;setdiff&lt;/span&gt;(keep, &lt;span style="color:#a6e22e"&gt;names&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;which.max&lt;/span&gt;(v)))
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;else&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;break&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Xdf[, keep, drop &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;FALSE&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h2 id="figure-1--who-is-there-and-does-it-change-with-season"&gt;Figure 1 — Who is there, and does it change with season?&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Script:&lt;/strong&gt; &lt;code&gt;Figure1_final.R&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;This figure establishes the basic pattern: season structures the community (PCoA + PERMANOVA), the phylum composition is depth-stratified and seasonally dynamic, and phylogenetic relatedness (aMPD) varies across season × depth combinations.&lt;/p&gt;
&lt;h3 id="panel-a--map"&gt;Panel A — Map&lt;/h3&gt;
&lt;p&gt;The 12 sampling sites span the length of Comau Fjord, with Huinay Research Station as the base. The map uses GADM Chile administrative shapefiles and &lt;code&gt;rnaturalearth&lt;/code&gt; for the locator inset.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-r" data-lang="r"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;source&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;utils.R&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;library&lt;/span&gt;(sf); &lt;span style="color:#a6e22e"&gt;library&lt;/span&gt;(rnaturalearth); &lt;span style="color:#a6e22e"&gt;library&lt;/span&gt;(ggrepel); &lt;span style="color:#a6e22e"&gt;library&lt;/span&gt;(ggspatial)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;library&lt;/span&gt;(shadowtext); &lt;span style="color:#a6e22e"&gt;library&lt;/span&gt;(readr); &lt;span style="color:#a6e22e"&gt;library&lt;/span&gt;(ggplot2)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Helper: 5-pointed star polygon at lon/lat&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;make_star_lonlat &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;function&lt;/span&gt;(lon, lat, r_deg &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0.010&lt;/span&gt;, inner_ratio &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0.5&lt;/span&gt;, n &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;5&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; lat_rad &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; lat &lt;span style="color:#f92672"&gt;*&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;pi&lt;/span&gt;&lt;span style="color:#f92672"&gt;/&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;180&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ang &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;seq&lt;/span&gt;(&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;&lt;span style="color:#f92672"&gt;*&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;pi&lt;/span&gt;, length.out &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;&lt;span style="color:#f92672"&gt;*&lt;/span&gt;n &lt;span style="color:#f92672"&gt;+&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;)[&lt;span style="color:#f92672"&gt;-&lt;/span&gt;(&lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;&lt;span style="color:#f92672"&gt;*&lt;/span&gt;n &lt;span style="color:#f92672"&gt;+&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;)]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; rad &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;rep&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;c&lt;/span&gt;(r_deg, r_deg&lt;span style="color:#f92672"&gt;*&lt;/span&gt;inner_ratio), n)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; dx &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; (rad &lt;span style="color:#f92672"&gt;*&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;cos&lt;/span&gt;(ang)) &lt;span style="color:#f92672"&gt;/&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;max&lt;/span&gt;(&lt;span style="color:#ae81ff"&gt;0.1&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;cos&lt;/span&gt;(lat_rad))
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; dy &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; rad &lt;span style="color:#f92672"&gt;*&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;sin&lt;/span&gt;(ang)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;data.frame&lt;/span&gt;(long &lt;span style="color:#f92672"&gt;=&lt;/span&gt; lon &lt;span style="color:#f92672"&gt;+&lt;/span&gt; dx, lat &lt;span style="color:#f92672"&gt;=&lt;/span&gt; lat &lt;span style="color:#f92672"&gt;+&lt;/span&gt; dy, group &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;huinay_star&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;meta &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; readr&lt;span style="color:#f92672"&gt;::&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;read_tsv&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;metadata.tsv&amp;#34;&lt;/span&gt;, show_col_types &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;FALSE&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;pts12 &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; meta &lt;span style="color:#f92672"&gt;|&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;transmute&lt;/span&gt;(line_chr &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;gsub&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;^L&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34;&amp;#34;&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;as.character&lt;/span&gt;(line)),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; site_chr &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;gsub&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;^S&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34;&amp;#34;&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;as.character&lt;/span&gt;(site)),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; longitude &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;as.numeric&lt;/span&gt;(longitude),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; latitude &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;as.numeric&lt;/span&gt;(latitude)) &lt;span style="color:#f92672"&gt;|&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;filter&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;is.finite&lt;/span&gt;(longitude), &lt;span style="color:#a6e22e"&gt;is.finite&lt;/span&gt;(latitude)) &lt;span style="color:#f92672"&gt;|&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;group_by&lt;/span&gt;(line_chr, site_chr) &lt;span style="color:#f92672"&gt;|&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;summarise&lt;/span&gt;(longitude &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;median&lt;/span&gt;(longitude), latitude &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;median&lt;/span&gt;(latitude), .groups &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;drop&amp;#34;&lt;/span&gt;) &lt;span style="color:#f92672"&gt;|&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;mutate&lt;/span&gt;(label &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;paste0&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;L&amp;#34;&lt;/span&gt;, line_chr, &lt;span style="color:#e6db74"&gt;&amp;#34;S&amp;#34;&lt;/span&gt;, site_chr))
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;adm2 &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; sf&lt;span style="color:#f92672"&gt;::&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;st_read&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;CHL_adm_shp/CHL_adm2.shp&amp;#34;&lt;/span&gt;, quiet &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;TRUE&lt;/span&gt;) &lt;span style="color:#f92672"&gt;|&amp;gt;&lt;/span&gt; sf&lt;span style="color:#f92672"&gt;::&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;st_transform&lt;/span&gt;(&lt;span style="color:#ae81ff"&gt;4326&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;palena_wgs &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; dplyr&lt;span style="color:#f92672"&gt;::&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;filter&lt;/span&gt;(adm2, NAME_2 &lt;span style="color:#f92672"&gt;==&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;Palena&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;huinay &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;data.frame&lt;/span&gt;(longitude &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;-72.415246&lt;/span&gt;, latitude &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;-42.379839&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;huinay_star &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;make_star_lonlat&lt;/span&gt;(huinay&lt;span style="color:#f92672"&gt;$&lt;/span&gt;longitude, huinay&lt;span style="color:#f92672"&gt;$&lt;/span&gt;latitude, r_deg &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0.008&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;chl &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; rnaturalearth&lt;span style="color:#f92672"&gt;::&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;ne_countries&lt;/span&gt;(country &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;Chile&amp;#34;&lt;/span&gt;, returnclass &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;sf&amp;#34;&lt;/span&gt;) &lt;span style="color:#f92672"&gt;|&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; sf&lt;span style="color:#f92672"&gt;::&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;st_transform&lt;/span&gt;(&lt;span style="color:#ae81ff"&gt;4326&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Bounding box for main map&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;pad_x &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0.05&lt;/span&gt;; pad_y &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0.03&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;xlim &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;c&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;min&lt;/span&gt;(pts12&lt;span style="color:#f92672"&gt;$&lt;/span&gt;longitude) &lt;span style="color:#f92672"&gt;-&lt;/span&gt; pad_x, &lt;span style="color:#a6e22e"&gt;max&lt;/span&gt;(pts12&lt;span style="color:#f92672"&gt;$&lt;/span&gt;longitude) &lt;span style="color:#f92672"&gt;+&lt;/span&gt; pad_x)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ylim &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;c&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;min&lt;/span&gt;(pts12&lt;span style="color:#f92672"&gt;$&lt;/span&gt;latitude) &lt;span style="color:#f92672"&gt;-&lt;/span&gt; pad_y, &lt;span style="color:#a6e22e"&gt;max&lt;/span&gt;(pts12&lt;span style="color:#f92672"&gt;$&lt;/span&gt;latitude) &lt;span style="color:#f92672"&gt;+&lt;/span&gt; pad_y)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;main_map &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;ggplot&lt;/span&gt;() &lt;span style="color:#f92672"&gt;+&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;geom_polygon&lt;/span&gt;(data &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;...&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;aes&lt;/span&gt;(x &lt;span style="color:#f92672"&gt;=&lt;/span&gt; long, y &lt;span style="color:#f92672"&gt;=&lt;/span&gt; lat, group &lt;span style="color:#f92672"&gt;=&lt;/span&gt; group), &lt;span style="color:#75715e"&gt;# palena_df&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; color &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;grey35&amp;#34;&lt;/span&gt;, fill &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;grey95&amp;#34;&lt;/span&gt;, linewidth &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0.6&lt;/span&gt;) &lt;span style="color:#f92672"&gt;+&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;geom_polygon&lt;/span&gt;(data &lt;span style="color:#f92672"&gt;=&lt;/span&gt; huinay_star, &lt;span style="color:#a6e22e"&gt;aes&lt;/span&gt;(x &lt;span style="color:#f92672"&gt;=&lt;/span&gt; long, y &lt;span style="color:#f92672"&gt;=&lt;/span&gt; lat, group &lt;span style="color:#f92672"&gt;=&lt;/span&gt; group),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; fill &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;black&amp;#34;&lt;/span&gt;, color &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;black&amp;#34;&lt;/span&gt;) &lt;span style="color:#f92672"&gt;+&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;geom_point&lt;/span&gt;(data &lt;span style="color:#f92672"&gt;=&lt;/span&gt; pts12, &lt;span style="color:#a6e22e"&gt;aes&lt;/span&gt;(x &lt;span style="color:#f92672"&gt;=&lt;/span&gt; longitude, y &lt;span style="color:#f92672"&gt;=&lt;/span&gt; latitude),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; shape &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;21&lt;/span&gt;, fill &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;red&amp;#34;&lt;/span&gt;, color &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;black&amp;#34;&lt;/span&gt;, size &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;3.4&lt;/span&gt;) &lt;span style="color:#f92672"&gt;+&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ggrepel&lt;span style="color:#f92672"&gt;::&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;geom_label_repel&lt;/span&gt;(data &lt;span style="color:#f92672"&gt;=&lt;/span&gt; pts12, &lt;span style="color:#a6e22e"&gt;aes&lt;/span&gt;(x &lt;span style="color:#f92672"&gt;=&lt;/span&gt; longitude, y &lt;span style="color:#f92672"&gt;=&lt;/span&gt; latitude, label &lt;span style="color:#f92672"&gt;=&lt;/span&gt; label),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; size &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;3.2&lt;/span&gt;, fill &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;white&amp;#34;&lt;/span&gt;, label.size &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;, seed &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;42&lt;/span&gt;) &lt;span style="color:#f92672"&gt;+&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;coord_sf&lt;/span&gt;(xlim &lt;span style="color:#f92672"&gt;=&lt;/span&gt; xlim, ylim &lt;span style="color:#f92672"&gt;=&lt;/span&gt; ylim, expand &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;FALSE&lt;/span&gt;) &lt;span style="color:#f92672"&gt;+&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;annotation_north_arrow&lt;/span&gt;(location &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;tl&amp;#34;&lt;/span&gt;, style &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;north_arrow_minimal&lt;/span&gt;()) &lt;span style="color:#f92672"&gt;+&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;annotation_scale&lt;/span&gt;(location &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;bl&amp;#34;&lt;/span&gt;) &lt;span style="color:#f92672"&gt;+&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;theme_minimal&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;locator &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;ggplot&lt;/span&gt;() &lt;span style="color:#f92672"&gt;+&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;geom_sf&lt;/span&gt;(data &lt;span style="color:#f92672"&gt;=&lt;/span&gt; chl, fill &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;grey95&amp;#34;&lt;/span&gt;, color &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;grey35&amp;#34;&lt;/span&gt;, linewidth &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0.3&lt;/span&gt;) &lt;span style="color:#f92672"&gt;+&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;geom_sf&lt;/span&gt;(data &lt;span style="color:#f92672"&gt;=&lt;/span&gt; palena_box, fill &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;NA&lt;/span&gt;, color &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;red&amp;#34;&lt;/span&gt;, linewidth &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0.6&lt;/span&gt;) &lt;span style="color:#f92672"&gt;+&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;coord_sf&lt;/span&gt;(expand &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;FALSE&lt;/span&gt;) &lt;span style="color:#f92672"&gt;+&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;theme_void&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;p_A &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; main_map &lt;span style="color:#f92672"&gt;+&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; patchwork&lt;span style="color:#f92672"&gt;::&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;inset_element&lt;/span&gt;(locator, left &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0.04&lt;/span&gt;, bottom &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0.06&lt;/span&gt;, right &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0.42&lt;/span&gt;, top &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0.46&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="panel-b--beta-diversity-pcoa--permanova"&gt;Panel B — Beta-diversity (PCoA + PERMANOVA)&lt;/h3&gt;
&lt;p&gt;We compute &lt;strong&gt;Bray–Curtis dissimilarity&lt;/strong&gt; on relative abundances. Bray–Curtis is bounded [0,1], insensitive to joint absences, and the standard choice for compositional community data. The PERMANOVA is stratified by depth so that samples are only shuffled within depth groups — this holds depth constant and isolates the seasonal signal.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-r" data-lang="r"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ps &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;load_ps&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ps_rel &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;transform_sample_counts&lt;/span&gt;(ps, &lt;span style="color:#66d9ef"&gt;function&lt;/span&gt;(x) &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (&lt;span style="color:#a6e22e"&gt;sum&lt;/span&gt;(x) &lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;) x&lt;span style="color:#f92672"&gt;/&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;sum&lt;/span&gt;(x) &lt;span style="color:#66d9ef"&gt;else&lt;/span&gt; x)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;dist_mat &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; phyloseq&lt;span style="color:#f92672"&gt;::&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;distance&lt;/span&gt;(ps_rel, method &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;bray&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;set.seed&lt;/span&gt;(&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ord &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;ordinate&lt;/span&gt;(ps_rel, method &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;PCoA&amp;#34;&lt;/span&gt;, distance &lt;span style="color:#f92672"&gt;=&lt;/span&gt; dist_mat)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;pdat &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;plot_ordination&lt;/span&gt;(ps_rel, ord, justDF &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;TRUE&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;p_B &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;ggplot&lt;/span&gt;(pdat, &lt;span style="color:#a6e22e"&gt;aes&lt;/span&gt;(x &lt;span style="color:#f92672"&gt;=&lt;/span&gt; Axis.1, y &lt;span style="color:#f92672"&gt;=&lt;/span&gt; Axis.2)) &lt;span style="color:#f92672"&gt;+&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;geom_point&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;aes&lt;/span&gt;(color &lt;span style="color:#f92672"&gt;=&lt;/span&gt; season, shape &lt;span style="color:#f92672"&gt;=&lt;/span&gt; depth_m), size &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;2.2&lt;/span&gt;, alpha &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0.9&lt;/span&gt;) &lt;span style="color:#f92672"&gt;+&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;stat_ellipse&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;aes&lt;/span&gt;(color &lt;span style="color:#f92672"&gt;=&lt;/span&gt; season, group &lt;span style="color:#f92672"&gt;=&lt;/span&gt; season), type &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;t&amp;#34;&lt;/span&gt;, level &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0.95&lt;/span&gt;) &lt;span style="color:#f92672"&gt;+&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;scale_color_manual&lt;/span&gt;(values &lt;span style="color:#f92672"&gt;=&lt;/span&gt; pal_season) &lt;span style="color:#f92672"&gt;+&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;scale_shape_manual&lt;/span&gt;(values &lt;span style="color:#f92672"&gt;=&lt;/span&gt; shape_depth) &lt;span style="color:#f92672"&gt;+&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;theme_bw&lt;/span&gt;(base_size &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;11&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Stratified PERMANOVA (strata = depth holds depth constant)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;meta &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;as&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;sample_data&lt;/span&gt;(ps_rel), &lt;span style="color:#e6db74"&gt;&amp;#34;data.frame&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;meta &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; meta&lt;span style="color:#a6e22e"&gt;[attr&lt;/span&gt;(dist_mat, &lt;span style="color:#e6db74"&gt;&amp;#34;Labels&amp;#34;&lt;/span&gt;), , drop &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;FALSE&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;keep &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; &lt;span style="color:#f92672"&gt;!&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;is.na&lt;/span&gt;(meta&lt;span style="color:#f92672"&gt;$&lt;/span&gt;season) &lt;span style="color:#f92672"&gt;&amp;amp;&lt;/span&gt; &lt;span style="color:#f92672"&gt;!&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;is.na&lt;/span&gt;(meta&lt;span style="color:#f92672"&gt;$&lt;/span&gt;depth_m)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;meta &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; meta[keep, ]; dmat &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;as.matrix&lt;/span&gt;(dist_mat)[keep, keep]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;adon &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; vegan&lt;span style="color:#f92672"&gt;::&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;adonis2&lt;/span&gt;(dmat &lt;span style="color:#f92672"&gt;~&lt;/span&gt; season, data &lt;span style="color:#f92672"&gt;=&lt;/span&gt; meta, permutations &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;999&lt;/span&gt;, strata &lt;span style="color:#f92672"&gt;=&lt;/span&gt; meta&lt;span style="color:#f92672"&gt;$&lt;/span&gt;depth_m)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Result: R² = 0.273, P = 0.001&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Pairwise contrasts (BH-corrected)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;pairwise_permanova_strat &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;function&lt;/span&gt;(dmat, meta, group_col &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;season&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; strata_col &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;depth_m&amp;#34;&lt;/span&gt;, permutations &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;999&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; g &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;droplevels&lt;/span&gt;(meta[[group_col]]); lv &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;levels&lt;/span&gt;(g)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; out &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;list&lt;/span&gt;(); k &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; (i &lt;span style="color:#66d9ef"&gt;in&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;seq_len&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;length&lt;/span&gt;(lv)&lt;span style="color:#ae81ff"&gt;-1&lt;/span&gt;)) &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; (j &lt;span style="color:#66d9ef"&gt;in&lt;/span&gt; (i&lt;span style="color:#ae81ff"&gt;+1&lt;/span&gt;)&lt;span style="color:#f92672"&gt;:&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;length&lt;/span&gt;(lv)) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; pair &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;c&lt;/span&gt;(lv[i], lv[j]); idx &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; g &lt;span style="color:#f92672"&gt;%in%&lt;/span&gt; pair
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; fit &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; vegan&lt;span style="color:#f92672"&gt;::&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;adonis2&lt;/span&gt;(dmat[idx,idx] &lt;span style="color:#f92672"&gt;~&lt;/span&gt; meta[[group_col]][idx],
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; permutations &lt;span style="color:#f92672"&gt;=&lt;/span&gt; permutations, strata &lt;span style="color:#f92672"&gt;=&lt;/span&gt; meta[[strata_col]][idx])
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; tab &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;as.data.frame&lt;/span&gt;(fit)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; out[[k]] &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;data.frame&lt;/span&gt;(Comparison &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;paste&lt;/span&gt;(pair, collapse&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34; vs &amp;#34;&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; R2 &lt;span style="color:#f92672"&gt;=&lt;/span&gt; tab&lt;span style="color:#f92672"&gt;$&lt;/span&gt;R2[1], p &lt;span style="color:#f92672"&gt;=&lt;/span&gt; tab&lt;span style="color:#f92672"&gt;$&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;`Pr&lt;/span&gt;(&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt;F)`[1])
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; k &amp;lt;- k+1
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; df &amp;lt;- do.call(rbind, out)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; df$`&lt;span style="color:#a6e22e"&gt;p &lt;/span&gt;(BH)` &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;p.adjust&lt;/span&gt;(df&lt;span style="color:#f92672"&gt;$&lt;/span&gt;p, method &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;BH&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; df
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;pw_df &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;pairwise_permanova_strat&lt;/span&gt;(dmat, meta)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Season explains 27% of community variation. All pairwise seasonal contrasts are significant after BH correction, with Summer–Fall showing the largest divergence (R² = 0.316).&lt;/p&gt;
&lt;h3 id="panel-c--phylum-level-seasonality"&gt;Panel C — Phylum-level seasonality&lt;/h3&gt;
&lt;p&gt;Raw counts are aggregated to phylum, then plotted as stacked area charts across calendar month-day (so all years overlay on the same axis). Only phyla contributing ≥ 1% of total counts are shown individually.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-r" data-lang="r"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;mat_counts &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;as&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;otu_table&lt;/span&gt;(ps), &lt;span style="color:#e6db74"&gt;&amp;#34;matrix&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (&lt;span style="color:#f92672"&gt;!&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;taxa_are_rows&lt;/span&gt;(ps)) mat_counts &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;t&lt;/span&gt;(mat_counts)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;phy_vec &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;as.vector&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;tax_table&lt;/span&gt;(ps)[, &lt;span style="color:#e6db74"&gt;&amp;#34;Phylum&amp;#34;&lt;/span&gt;])
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;phy_vec&lt;span style="color:#a6e22e"&gt;[is.na&lt;/span&gt;(phy_vec) &lt;span style="color:#f92672"&gt;|&lt;/span&gt; phy_vec &lt;span style="color:#f92672"&gt;==&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;&amp;#34;&lt;/span&gt;] &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;Unclassified&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;names&lt;/span&gt;(phy_vec) &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;rownames&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;tax_table&lt;/span&gt;(ps))
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;mat_phylum &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;rowsum&lt;/span&gt;(mat_counts, group &lt;span style="color:#f92672"&gt;=&lt;/span&gt; phy_vec, reorder &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;TRUE&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;smeta &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;as&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;sample_data&lt;/span&gt;(ps), &lt;span style="color:#e6db74"&gt;&amp;#34;data.frame&amp;#34;&lt;/span&gt;) &lt;span style="color:#f92672"&gt;%&amp;gt;%&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; tibble&lt;span style="color:#f92672"&gt;::&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;rownames_to_column&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;Sample&amp;#34;&lt;/span&gt;) &lt;span style="color:#f92672"&gt;%&amp;gt;%&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;mutate&lt;/span&gt;(Collection_Date &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;as.Date&lt;/span&gt;(Collection_Date),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; cal_date &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;as.Date&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;paste0&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;2000-&amp;#34;&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;format&lt;/span&gt;(Collection_Date, &lt;span style="color:#e6db74"&gt;&amp;#34;%m-%d&amp;#34;&lt;/span&gt;))),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; depth_m &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;factor&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;as.character&lt;/span&gt;(depth_m), levels &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;c&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;5&amp;#34;&lt;/span&gt;,&lt;span style="color:#e6db74"&gt;&amp;#34;20&amp;#34;&lt;/span&gt;)))
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;dfC &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;as.data.frame&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;t&lt;/span&gt;(mat_phylum)) &lt;span style="color:#f92672"&gt;%&amp;gt;%&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; tibble&lt;span style="color:#f92672"&gt;::&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;rownames_to_column&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;Sample&amp;#34;&lt;/span&gt;) &lt;span style="color:#f92672"&gt;%&amp;gt;%&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;pivot_longer&lt;/span&gt;(&lt;span style="color:#f92672"&gt;-&lt;/span&gt;Sample, names_to &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;Phylum&amp;#34;&lt;/span&gt;, values_to &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;Count&amp;#34;&lt;/span&gt;) &lt;span style="color:#f92672"&gt;%&amp;gt;%&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;left_join&lt;/span&gt;(smeta, by &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;Sample&amp;#34;&lt;/span&gt;) &lt;span style="color:#f92672"&gt;%&amp;gt;%&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;filter&lt;/span&gt;(&lt;span style="color:#f92672"&gt;!&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;is.na&lt;/span&gt;(cal_date), &lt;span style="color:#f92672"&gt;!&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;is.na&lt;/span&gt;(depth_m))
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Keep phyla ≥ 1% globally&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;dom_phyla &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; dfC &lt;span style="color:#f92672"&gt;%&amp;gt;%&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;group_by&lt;/span&gt;(Phylum) &lt;span style="color:#f92672"&gt;%&amp;gt;%&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;summarise&lt;/span&gt;(Total &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;sum&lt;/span&gt;(Count), .groups &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;drop&amp;#34;&lt;/span&gt;) &lt;span style="color:#f92672"&gt;%&amp;gt;%&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;mutate&lt;/span&gt;(Prop &lt;span style="color:#f92672"&gt;=&lt;/span&gt; Total &lt;span style="color:#f92672"&gt;/&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;sum&lt;/span&gt;(Total)) &lt;span style="color:#f92672"&gt;%&amp;gt;%&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;filter&lt;/span&gt;(Prop &lt;span style="color:#f92672"&gt;&amp;gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0.01&lt;/span&gt;) &lt;span style="color:#f92672"&gt;%&amp;gt;%&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;pull&lt;/span&gt;(Phylum)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;dfC &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; dfC &lt;span style="color:#f92672"&gt;%&amp;gt;%&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;mutate&lt;/span&gt;(PhylumCollapsed &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;if_else&lt;/span&gt;(Phylum &lt;span style="color:#f92672"&gt;%in%&lt;/span&gt; dom_phyla, Phylum, &lt;span style="color:#e6db74"&gt;&amp;#34;Other&amp;#34;&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; PhylumCollapsed &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;factor&lt;/span&gt;(PhylumCollapsed, levels &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;names&lt;/span&gt;(pal_phylum)))
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;df_day &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; dfC &lt;span style="color:#f92672"&gt;%&amp;gt;%&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;group_by&lt;/span&gt;(cal_date, depth_m, PhylumCollapsed) &lt;span style="color:#f92672"&gt;%&amp;gt;%&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;summarise&lt;/span&gt;(Count &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;sum&lt;/span&gt;(Count, na.rm &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;TRUE&lt;/span&gt;), .groups &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;drop&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;p_C &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;ggplot&lt;/span&gt;(df_day, &lt;span style="color:#a6e22e"&gt;aes&lt;/span&gt;(x &lt;span style="color:#f92672"&gt;=&lt;/span&gt; cal_date, y &lt;span style="color:#f92672"&gt;=&lt;/span&gt; Count, fill &lt;span style="color:#f92672"&gt;=&lt;/span&gt; PhylumCollapsed)) &lt;span style="color:#f92672"&gt;+&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;geom_area&lt;/span&gt;(position &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;fill&amp;#34;&lt;/span&gt;, linewidth &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0.1&lt;/span&gt;) &lt;span style="color:#f92672"&gt;+&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;facet_wrap&lt;/span&gt;(&lt;span style="color:#f92672"&gt;~&lt;/span&gt; depth_m, ncol &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; labeller &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;labeller&lt;/span&gt;(depth_m &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;c&lt;/span&gt;(`5` &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;5 m&amp;#34;&lt;/span&gt;, `20` &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;20 m&amp;#34;&lt;/span&gt;))) &lt;span style="color:#f92672"&gt;+&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;scale_y_continuous&lt;/span&gt;(labels &lt;span style="color:#f92672"&gt;=&lt;/span&gt; scales&lt;span style="color:#f92672"&gt;::&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;percent_format&lt;/span&gt;(accuracy &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;)) &lt;span style="color:#f92672"&gt;+&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;scale_x_date&lt;/span&gt;(date_labels &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;%b&amp;#34;&lt;/span&gt;, date_breaks &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;1 month&amp;#34;&lt;/span&gt;) &lt;span style="color:#f92672"&gt;+&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;scale_fill_manual&lt;/span&gt;(values &lt;span style="color:#f92672"&gt;=&lt;/span&gt; pal_phylum, drop &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;TRUE&lt;/span&gt;) &lt;span style="color:#f92672"&gt;+&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;labs&lt;/span&gt;(x &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;Calendar date&amp;#34;&lt;/span&gt;, y &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;Relative abundance&amp;#34;&lt;/span&gt;, fill &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;Phylum&amp;#34;&lt;/span&gt;) &lt;span style="color:#f92672"&gt;+&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;theme_bw&lt;/span&gt;(base_size &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;11&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;A notable finding: the &lt;strong&gt;Cyanobacteria bloom from April to August at 5 m&lt;/strong&gt; — Southern Hemisphere mid-year, when the mixed layer deepens and nutrients surge. This mirrors bacterioplankton–phytoplankton coupling patterns documented in Reloncaví Fjord &lt;a href="https://consensus.app/papers/details/e6f4b7e9d4535a26aeaa49b2b8ddf54e/?utm_source=claude_desktop"&gt;Montero et al. 2011&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id="panel-d--abundance-weighted-mpd"&gt;Panel D — Abundance-weighted MPD&lt;/h3&gt;
&lt;p&gt;To measure not just &lt;em&gt;who&lt;/em&gt; is there but &lt;em&gt;how related they are&lt;/em&gt;, we compute &lt;strong&gt;abundance-weighted mean pairwise distance (aMPD)&lt;/strong&gt;. Statistical testing uses &lt;strong&gt;aligned-rank transform ANOVA (ARTool)&lt;/strong&gt; — appropriate for non-normal data in a two-way factorial design (season × depth). Post-hoc Dunn tests are run separately within each depth to avoid confounding depth differences with seasonal contrasts.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-r" data-lang="r"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;library&lt;/span&gt;(picante); &lt;span style="color:#a6e22e"&gt;library&lt;/span&gt;(ARTool); &lt;span style="color:#a6e22e"&gt;library&lt;/span&gt;(rstatix); &lt;span style="color:#a6e22e"&gt;library&lt;/span&gt;(multcompView)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;comm &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;as&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;otu_table&lt;/span&gt;(ps), &lt;span style="color:#e6db74"&gt;&amp;#34;matrix&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (&lt;span style="color:#a6e22e"&gt;taxa_are_rows&lt;/span&gt;(ps)) comm &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;t&lt;/span&gt;(comm)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;comm &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; comm&lt;span style="color:#a6e22e"&gt;[rowSums&lt;/span&gt;(comm) &lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;, , drop &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;FALSE&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;tree &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;phy_tree&lt;/span&gt;(ps)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;tax_in_both &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;intersect&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;colnames&lt;/span&gt;(comm), tree&lt;span style="color:#f92672"&gt;$&lt;/span&gt;tip.label)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;comm &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; comm[, tax_in_both, drop &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;FALSE&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;tree &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; ape&lt;span style="color:#f92672"&gt;::&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;keep.tip&lt;/span&gt;(tree, tax_in_both)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;comm_rel &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;sweep&lt;/span&gt;(comm, &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;rowSums&lt;/span&gt;(comm), &lt;span style="color:#e6db74"&gt;&amp;#34;/&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;D &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;cophenetic&lt;/span&gt;(tree); D &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; D&lt;span style="color:#a6e22e"&gt;[colnames&lt;/span&gt;(comm_rel), &lt;span style="color:#a6e22e"&gt;colnames&lt;/span&gt;(comm_rel)]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;aMPD &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; picante&lt;span style="color:#f92672"&gt;::&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;mpd&lt;/span&gt;(samp &lt;span style="color:#f92672"&gt;=&lt;/span&gt; comm_rel, dis &lt;span style="color:#f92672"&gt;=&lt;/span&gt; D, abundance.weighted &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;TRUE&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sd2 &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;as&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;sample_data&lt;/span&gt;(ps), &lt;span style="color:#e6db74"&gt;&amp;#34;data.frame&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;adiv_pd &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;data.frame&lt;/span&gt;(Sample &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;rownames&lt;/span&gt;(comm_rel), aMPD &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;as.numeric&lt;/span&gt;(aMPD)) &lt;span style="color:#f92672"&gt;%&amp;gt;%&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;left_join&lt;/span&gt;(tibble&lt;span style="color:#f92672"&gt;::&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;rownames_to_column&lt;/span&gt;(sd2, &lt;span style="color:#e6db74"&gt;&amp;#34;Sample&amp;#34;&lt;/span&gt;)[, &lt;span style="color:#a6e22e"&gt;c&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;Sample&amp;#34;&lt;/span&gt;,&lt;span style="color:#e6db74"&gt;&amp;#34;season&amp;#34;&lt;/span&gt;,&lt;span style="color:#e6db74"&gt;&amp;#34;depth_m&amp;#34;&lt;/span&gt;)],
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; by &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;Sample&amp;#34;&lt;/span&gt;) &lt;span style="color:#f92672"&gt;%&amp;gt;%&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;filter&lt;/span&gt;(&lt;span style="color:#f92672"&gt;!&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;is.na&lt;/span&gt;(season), &lt;span style="color:#f92672"&gt;!&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;is.na&lt;/span&gt;(depth_m))
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Two-way ART ANOVA&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;art_fit &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; ARTool&lt;span style="color:#f92672"&gt;::&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;art&lt;/span&gt;(aMPD &lt;span style="color:#f92672"&gt;~&lt;/span&gt; season &lt;span style="color:#f92672"&gt;*&lt;/span&gt; depth_m, data &lt;span style="color:#f92672"&gt;=&lt;/span&gt; adiv_pd)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;anova&lt;/span&gt;(art_fit)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Post-hoc: Dunn test within each depth&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;dunn_depth &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; adiv_pd &lt;span style="color:#f92672"&gt;%&amp;gt;%&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;group_by&lt;/span&gt;(depth_m) &lt;span style="color:#f92672"&gt;%&amp;gt;%&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; rstatix&lt;span style="color:#f92672"&gt;::&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;dunn_test&lt;/span&gt;(aMPD &lt;span style="color:#f92672"&gt;~&lt;/span&gt; season, p.adjust.method &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;BH&amp;#34;&lt;/span&gt;) &lt;span style="color:#f92672"&gt;%&amp;gt;%&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;ungroup&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Compact letter display per depth&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;letters_df &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; dunn_depth &lt;span style="color:#f92672"&gt;%&amp;gt;%&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;mutate&lt;/span&gt;(comp &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;paste&lt;/span&gt;(group1, group2, sep &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;-&amp;#34;&lt;/span&gt;)) &lt;span style="color:#f92672"&gt;%&amp;gt;%&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;select&lt;/span&gt;(depth_m, comp, p.adj) &lt;span style="color:#f92672"&gt;%&amp;gt;%&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;group_split&lt;/span&gt;(depth_m) &lt;span style="color:#f92672"&gt;%&amp;gt;%&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;lapply&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;function&lt;/span&gt;(df) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; vec &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;setNames&lt;/span&gt;(df&lt;span style="color:#f92672"&gt;$&lt;/span&gt;p.adj, df&lt;span style="color:#f92672"&gt;$&lt;/span&gt;comp)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; L &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; multcompView&lt;span style="color:#f92672"&gt;::&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;multcompLetters&lt;/span&gt;(vec, threshold &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0.05&lt;/span&gt;)&lt;span style="color:#f92672"&gt;$&lt;/span&gt;Letters
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; tibble&lt;span style="color:#f92672"&gt;::&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;tibble&lt;/span&gt;(season &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;names&lt;/span&gt;(L), .label &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;unname&lt;/span&gt;(L))
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }) &lt;span style="color:#f92672"&gt;%&amp;gt;%&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; { &lt;span style="color:#a6e22e"&gt;bind_rows&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;mapply&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;function&lt;/span&gt;(df, d) &lt;span style="color:#a6e22e"&gt;mutate&lt;/span&gt;(df, depth_m &lt;span style="color:#f92672"&gt;=&lt;/span&gt; d),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ., &lt;span style="color:#a6e22e"&gt;unique&lt;/span&gt;(dunn_depth&lt;span style="color:#f92672"&gt;$&lt;/span&gt;depth_m), SIMPLIFY &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;FALSE&lt;/span&gt;)) }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;p_D &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;ggplot&lt;/span&gt;(adiv_pd, &lt;span style="color:#a6e22e"&gt;aes&lt;/span&gt;(season, aMPD, fill &lt;span style="color:#f92672"&gt;=&lt;/span&gt; season)) &lt;span style="color:#f92672"&gt;+&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;geom_boxplot&lt;/span&gt;(width &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0.7&lt;/span&gt;, alpha &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0.85&lt;/span&gt;, outlier.shape &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;21&lt;/span&gt;) &lt;span style="color:#f92672"&gt;+&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;geom_jitter&lt;/span&gt;(width &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0.15&lt;/span&gt;, height &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;, size &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1.6&lt;/span&gt;, alpha &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0.6&lt;/span&gt;) &lt;span style="color:#f92672"&gt;+&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;geom_text&lt;/span&gt;(data &lt;span style="color:#f92672"&gt;=&lt;/span&gt; letters_df,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;aes&lt;/span&gt;(x &lt;span style="color:#f92672"&gt;=&lt;/span&gt; season, y &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;max&lt;/span&gt;(adiv_pd&lt;span style="color:#f92672"&gt;$&lt;/span&gt;aMPD)&lt;span style="color:#f92672"&gt;*&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;1.05&lt;/span&gt;, label &lt;span style="color:#f92672"&gt;=&lt;/span&gt; .label),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; inherit.aes &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;FALSE&lt;/span&gt;, vjust &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;, size &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;3.4&lt;/span&gt;) &lt;span style="color:#f92672"&gt;+&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;facet_grid&lt;/span&gt;(cols &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;vars&lt;/span&gt;(depth_m), drop &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;FALSE&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; labeller &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;labeller&lt;/span&gt;(depth_m &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;c&lt;/span&gt;(`5` &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;5 m&amp;#34;&lt;/span&gt;, `20` &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;20 m&amp;#34;&lt;/span&gt;))) &lt;span style="color:#f92672"&gt;+&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;scale_fill_manual&lt;/span&gt;(values &lt;span style="color:#f92672"&gt;=&lt;/span&gt; pal_season, drop &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;FALSE&lt;/span&gt;) &lt;span style="color:#f92672"&gt;+&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;labs&lt;/span&gt;(x &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;NULL&lt;/span&gt;, y &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;Abundance-weighted MPD&amp;#34;&lt;/span&gt;) &lt;span style="color:#f92672"&gt;+&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;theme_bw&lt;/span&gt;(base_size &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;11&lt;/span&gt;) &lt;span style="color:#f92672"&gt;+&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;theme&lt;/span&gt;(legend.position &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;none&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Key finding: Fall communities at 5 m are phylogenetically more clustered than Summer or Winter — environmental filtering pulls the surface community toward closely related lineages during the productive autumn period.&lt;/p&gt;
&lt;h3 id="assembly-and-export"&gt;Assembly and export&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-r" data-lang="r"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;library&lt;/span&gt;(cowplot); &lt;span style="color:#a6e22e"&gt;library&lt;/span&gt;(ggplotify)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Extract legends from B and C, remove from panels&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;leg_B &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; cowplot&lt;span style="color:#f92672"&gt;::&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;get_legend&lt;/span&gt;(p_B &lt;span style="color:#f92672"&gt;+&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;theme&lt;/span&gt;(legend.position &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;right&amp;#34;&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;leg_C &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; cowplot&lt;span style="color:#f92672"&gt;::&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;get_legend&lt;/span&gt;(p_C &lt;span style="color:#f92672"&gt;+&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;theme&lt;/span&gt;(legend.position &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;right&amp;#34;&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;p_B_clean &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; p_B &lt;span style="color:#f92672"&gt;+&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;theme&lt;/span&gt;(legend.position &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;none&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;p_C_clean &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; p_C &lt;span style="color:#f92672"&gt;+&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;theme&lt;/span&gt;(legend.position &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;none&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;p_D_clean &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; p_D &lt;span style="color:#f92672"&gt;+&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;theme&lt;/span&gt;(legend.position &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;none&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Render B (with PERMANOVA inset) to canvas for cowplot alignment&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;p_B_inset &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; p_B_clean &lt;span style="color:#f92672"&gt;+&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; patchwork&lt;span style="color:#f92672"&gt;::&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;inset_element&lt;/span&gt;(tab_pw_plot, left&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;0.02&lt;/span&gt;, bottom&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;0.58&lt;/span&gt;, right&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;0.48&lt;/span&gt;, top&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;0.98&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;p_B_canvas &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; ggplotify&lt;span style="color:#f92672"&gt;::&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;as.ggplot&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;function&lt;/span&gt;() &lt;span style="color:#a6e22e"&gt;print&lt;/span&gt;(p_B_inset))
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Align and assemble&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;bottom_right &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; cowplot&lt;span style="color:#f92672"&gt;::&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;plot_grid&lt;/span&gt;(p_C_clean, p_D_clean, ncol &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; labels &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;c&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;C&amp;#34;&lt;/span&gt;,&lt;span style="color:#e6db74"&gt;&amp;#34;D&amp;#34;&lt;/span&gt;), label_fontface &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;bold&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;right_col &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; cowplot&lt;span style="color:#f92672"&gt;::&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;plot_grid&lt;/span&gt;(p_B_canvas, bottom_right, ncol &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; labels &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;c&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;B&amp;#34;&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;NULL&lt;/span&gt;), rel_heights &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;c&lt;/span&gt;(&lt;span style="color:#ae81ff"&gt;1.05&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;1.00&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;right_full &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; cowplot&lt;span style="color:#f92672"&gt;::&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;plot_grid&lt;/span&gt;(right_col,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; cowplot&lt;span style="color:#f92672"&gt;::&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;plot_grid&lt;/span&gt;(leg_B, leg_C, ncol &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ncol &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;, rel_widths &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;c&lt;/span&gt;(&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;0.20&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;fig1 &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; cowplot&lt;span style="color:#f92672"&gt;::&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;plot_grid&lt;/span&gt;(p_A &lt;span style="color:#f92672"&gt;+&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;labs&lt;/span&gt;(title &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;NULL&lt;/span&gt;), right_full,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ncol &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;, labels &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;c&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;A&amp;#34;&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;NULL&lt;/span&gt;), rel_widths &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;c&lt;/span&gt;(&lt;span style="color:#ae81ff"&gt;1.15&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;1.60&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;ggsave&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;Figure1.pdf&amp;#34;&lt;/span&gt;, fig1, width &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;13&lt;/span&gt;, height &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;9&lt;/span&gt;, units &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;in&amp;#34;&lt;/span&gt;, useDingbats &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;FALSE&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;figure&gt;
&lt;img src="https://www.castrolab.org/img/comau-walkthrough/Figure1.png" /&gt;
&lt;/figure&gt;
&lt;em&gt;Figure 1. (A) Map of Comau Fjord with 12 sampling sites. (B) PCoA of Bray–Curtis dissimilarities coloured by season; PERMANOVA R² = 0.273, P = 0.001. (C) Phylum-level relative abundance as stacked area plots by calendar date at 5 m and 20 m. (D) Abundance-weighted MPD (aMPD) by season and depth.&lt;/em&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="figure-2--why-do-communities-differ"&gt;Figure 2 — Why do communities differ?&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Script:&lt;/strong&gt; &lt;code&gt;Figure2_final.R&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Figure 1 showed &lt;em&gt;that&lt;/em&gt; communities differ by season; Figure 2 asks &lt;em&gt;what environmental variables drive that variation&lt;/em&gt;, and whether the fjord is dispersal-limited or seasonally forced.&lt;/p&gt;
&lt;h3 id="collinearity-filtering-vif"&gt;Collinearity filtering (VIF)&lt;/h3&gt;
&lt;p&gt;Environmental predictors in a fjord are highly collinear (temperature co-varies with salinity, nutrients co-vary with productivity). Before constrained ordination, we iteratively remove predictors with VIF &amp;gt; 10 using &lt;code&gt;drop_high_vif_vegan()&lt;/code&gt; from &lt;code&gt;utils.R&lt;/code&gt;. This leaves a set of largely independent variables whose individual contributions can be interpreted.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-r" data-lang="r"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;source&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;utils.R&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;library&lt;/span&gt;(vegan); &lt;span style="color:#a6e22e"&gt;library&lt;/span&gt;(mgcv); &lt;span style="color:#a6e22e"&gt;library&lt;/span&gt;(ggtext)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ps &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;load_ps&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;meta &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;as&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;sample_data&lt;/span&gt;(ps), &lt;span style="color:#e6db74"&gt;&amp;#34;data.frame&amp;#34;&lt;/span&gt;) &lt;span style="color:#f92672"&gt;%&amp;gt;%&lt;/span&gt; tibble&lt;span style="color:#f92672"&gt;::&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;rownames_to_column&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;SampleID&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;meta&lt;span style="color:#f92672"&gt;$&lt;/span&gt;season &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;factor&lt;/span&gt;(meta&lt;span style="color:#f92672"&gt;$&lt;/span&gt;season, levels &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;c&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;Fall&amp;#34;&lt;/span&gt;,&lt;span style="color:#e6db74"&gt;&amp;#34;Summer&amp;#34;&lt;/span&gt;,&lt;span style="color:#e6db74"&gt;&amp;#34;Winter&amp;#34;&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;meta&lt;span style="color:#f92672"&gt;$&lt;/span&gt;depth_m &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;suppressWarnings&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;as.numeric&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;as.character&lt;/span&gt;(meta&lt;span style="color:#f92672"&gt;$&lt;/span&gt;depth_m)))
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Community (relative abundances, samples as rows)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Y_counts &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;as&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;otu_table&lt;/span&gt;(ps), &lt;span style="color:#e6db74"&gt;&amp;#34;matrix&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (&lt;span style="color:#a6e22e"&gt;taxa_are_rows&lt;/span&gt;(ps)) Y_counts &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;t&lt;/span&gt;(Y_counts)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;rs &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;rowSums&lt;/span&gt;(Y_counts); rs[rs &lt;span style="color:#f92672"&gt;==&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;] &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Y_rel &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;sweep&lt;/span&gt;(Y_counts, &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;, rs, &lt;span style="color:#e6db74"&gt;&amp;#34;/&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Predictor groups&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;vars_nutrients &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;c&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;nitrate_uM&amp;#34;&lt;/span&gt;,&lt;span style="color:#e6db74"&gt;&amp;#34;nitrite_uM&amp;#34;&lt;/span&gt;,&lt;span style="color:#e6db74"&gt;&amp;#34;phosphate_uM&amp;#34;&lt;/span&gt;,&lt;span style="color:#e6db74"&gt;&amp;#34;silicate_uM&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;vars_physicals &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;c&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;salinity_PSU&amp;#34;&lt;/span&gt;,&lt;span style="color:#e6db74"&gt;&amp;#34;temperature_C&amp;#34;&lt;/span&gt;,&lt;span style="color:#e6db74"&gt;&amp;#34;pH&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;vars_productivity &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;c&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;chlorophyll_A_ugL&amp;#34;&lt;/span&gt;,&lt;span style="color:#e6db74"&gt;&amp;#34;C_total_ug&amp;#34;&lt;/span&gt;,&lt;span style="color:#e6db74"&gt;&amp;#34;N_total_ug&amp;#34;&lt;/span&gt;,&lt;span style="color:#e6db74"&gt;&amp;#34;C_N_ratio&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;vars_all &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;unique&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;c&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;intersect&lt;/span&gt;(vars_nutrients, &lt;span style="color:#a6e22e"&gt;colnames&lt;/span&gt;(meta)),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;intersect&lt;/span&gt;(vars_physicals, &lt;span style="color:#a6e22e"&gt;colnames&lt;/span&gt;(meta)),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;intersect&lt;/span&gt;(vars_productivity, &lt;span style="color:#a6e22e"&gt;colnames&lt;/span&gt;(meta))))
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;X_num &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;as.data.frame&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;lapply&lt;/span&gt;(meta[, vars_all, drop&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;FALSE&lt;/span&gt;],
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;function&lt;/span&gt;(v) &lt;span style="color:#a6e22e"&gt;suppressWarnings&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;as.numeric&lt;/span&gt;(v))))
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;rownames&lt;/span&gt;(X_num) &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; meta&lt;span style="color:#f92672"&gt;$&lt;/span&gt;SampleID
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;common &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;intersect&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;rownames&lt;/span&gt;(Y_rel), &lt;span style="color:#a6e22e"&gt;rownames&lt;/span&gt;(X_num))
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Y_rel &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; Y_rel[common,]; X_num &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; X_num[common,]; meta &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; meta&lt;span style="color:#a6e22e"&gt;[match&lt;/span&gt;(common, meta&lt;span style="color:#f92672"&gt;$&lt;/span&gt;SampleID),]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cc &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;complete.cases&lt;/span&gt;(X_num, meta&lt;span style="color:#f92672"&gt;$&lt;/span&gt;depth_m, meta&lt;span style="color:#f92672"&gt;$&lt;/span&gt;season)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Y_rel &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; Y_rel[cc,]; X_num &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; X_num[cc,]; meta &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; meta[cc,]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;X &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;as.data.frame&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;scale&lt;/span&gt;(X_num))
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;X_vif &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;drop_high_vif_vegan&lt;/span&gt;(X, Y_rel, thr &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;10&lt;/span&gt;) &lt;span style="color:#75715e"&gt;# iterative VIF filter from utils.R&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="panel-a--partial-dbrda"&gt;Panel A — Partial dbRDA&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Distance-based redundancy analysis&lt;/strong&gt; (&lt;code&gt;capscale&lt;/code&gt; in vegan) is the constrained analogue of PCoA. Conditioning on depth and season partials them out so the plot shows only the residual environmental signal after removing those large effects.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-r" data-lang="r"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;env_partial &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;cbind&lt;/span&gt;(X_vif, depth_m &lt;span style="color:#f92672"&gt;=&lt;/span&gt; meta&lt;span style="color:#f92672"&gt;$&lt;/span&gt;depth_m, season &lt;span style="color:#f92672"&gt;=&lt;/span&gt; meta&lt;span style="color:#f92672"&gt;$&lt;/span&gt;season)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;form_partial &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;as.formula&lt;/span&gt;(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;paste&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;Y_rel ~&amp;#34;&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;paste&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;colnames&lt;/span&gt;(X_vif), collapse &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34; + &amp;#34;&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;+ Condition(depth_m) + Condition(season)&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;mod_partial &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;capscale&lt;/span&gt;(form_partial, data &lt;span style="color:#f92672"&gt;=&lt;/span&gt; env_partial, distance &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;bray&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Global test&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;anova&lt;/span&gt;(mod_partial, permutations &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;999&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# adj. R² = 0.50, P = 0.001&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Term-by-term (marginal) significance&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;anova&lt;/span&gt;(mod_partial, permutations &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;999&lt;/span&gt;, by &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;term&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Extract site and biplot scores for plotting&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sc_sites &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;scores&lt;/span&gt;(mod_partial, display &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;sites&amp;#34;&lt;/span&gt;, scaling &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;) &lt;span style="color:#f92672"&gt;%&amp;gt;%&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;as.data.frame&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sc_bp &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;scores&lt;/span&gt;(mod_partial, display &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;bp&amp;#34;&lt;/span&gt;, scaling &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;) &lt;span style="color:#f92672"&gt;%&amp;gt;%&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;as.data.frame&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sc_sites&lt;span style="color:#f92672"&gt;$&lt;/span&gt;SampleID &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;rownames&lt;/span&gt;(sc_sites)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;plot_df &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;left_join&lt;/span&gt;(sc_sites, meta, by &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;SampleID&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;eig &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; mod_partial&lt;span style="color:#f92672"&gt;$&lt;/span&gt;CCA&lt;span style="color:#f92672"&gt;$&lt;/span&gt;eig
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;lab_x &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;sprintf&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;dbRDA1 (%.1f%%)&amp;#34;&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;100&lt;/span&gt;&lt;span style="color:#f92672"&gt;*&lt;/span&gt;eig[1]&lt;span style="color:#f92672"&gt;/&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;sum&lt;/span&gt;(eig))
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;lab_y &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;sprintf&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;dbRDA2 (%.1f%%)&amp;#34;&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;100&lt;/span&gt;&lt;span style="color:#f92672"&gt;*&lt;/span&gt;eig[2]&lt;span style="color:#f92672"&gt;/&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;sum&lt;/span&gt;(eig))
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;arrow_mul &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; vegan&lt;span style="color:#f92672"&gt;:::&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;ordiArrowMul&lt;/span&gt;(mod_partial, display &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;bp&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sc_bp&lt;span style="color:#f92672"&gt;$&lt;/span&gt;arrow_x &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; sc_bp&lt;span style="color:#f92672"&gt;$&lt;/span&gt;CAP1 &lt;span style="color:#f92672"&gt;*&lt;/span&gt; arrow_mul; sc_bp&lt;span style="color:#f92672"&gt;$&lt;/span&gt;arrow_y &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; sc_bp&lt;span style="color:#f92672"&gt;$&lt;/span&gt;CAP2 &lt;span style="color:#f92672"&gt;*&lt;/span&gt; arrow_mul
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;p2A &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;ggplot&lt;/span&gt;(plot_df, &lt;span style="color:#a6e22e"&gt;aes&lt;/span&gt;(x &lt;span style="color:#f92672"&gt;=&lt;/span&gt; CAP1, y &lt;span style="color:#f92672"&gt;=&lt;/span&gt; CAP2)) &lt;span style="color:#f92672"&gt;+&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;geom_point&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;aes&lt;/span&gt;(color &lt;span style="color:#f92672"&gt;=&lt;/span&gt; season, shape &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;factor&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;ifelse&lt;/span&gt;(depth_m&lt;span style="color:#f92672"&gt;==&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;5&lt;/span&gt;,&lt;span style="color:#e6db74"&gt;&amp;#34;5 m&amp;#34;&lt;/span&gt;,&lt;span style="color:#e6db74"&gt;&amp;#34;20 m&amp;#34;&lt;/span&gt;))),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; size &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;2.5&lt;/span&gt;, alpha &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0.9&lt;/span&gt;) &lt;span style="color:#f92672"&gt;+&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;scale_color_manual&lt;/span&gt;(values &lt;span style="color:#f92672"&gt;=&lt;/span&gt; pal_season) &lt;span style="color:#f92672"&gt;+&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;scale_shape_manual&lt;/span&gt;(values &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;c&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;5 m&amp;#34;&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;16&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34;20 m&amp;#34;&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;17&lt;/span&gt;)) &lt;span style="color:#f92672"&gt;+&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;geom_segment&lt;/span&gt;(data &lt;span style="color:#f92672"&gt;=&lt;/span&gt; sc_bp, &lt;span style="color:#a6e22e"&gt;aes&lt;/span&gt;(x&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;, y&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;, xend&lt;span style="color:#f92672"&gt;=&lt;/span&gt;arrow_x, yend&lt;span style="color:#f92672"&gt;=&lt;/span&gt;arrow_y),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; arrow &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;arrow&lt;/span&gt;(length &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;unit&lt;/span&gt;(&lt;span style="color:#ae81ff"&gt;0.25&lt;/span&gt;,&lt;span style="color:#e6db74"&gt;&amp;#34;cm&amp;#34;&lt;/span&gt;)), linewidth &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0.5&lt;/span&gt;) &lt;span style="color:#f92672"&gt;+&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ggrepel&lt;span style="color:#f92672"&gt;::&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;geom_text_repel&lt;/span&gt;(data &lt;span style="color:#f92672"&gt;=&lt;/span&gt; sc_bp, &lt;span style="color:#a6e22e"&gt;aes&lt;/span&gt;(x&lt;span style="color:#f92672"&gt;=&lt;/span&gt;arrow_x, y&lt;span style="color:#f92672"&gt;=&lt;/span&gt;arrow_y, label&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;rownames&lt;/span&gt;(sc_bp)),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; size &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;3&lt;/span&gt;) &lt;span style="color:#f92672"&gt;+&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;labs&lt;/span&gt;(x &lt;span style="color:#f92672"&gt;=&lt;/span&gt; lab_x, y &lt;span style="color:#f92672"&gt;=&lt;/span&gt; lab_y) &lt;span style="color:#f92672"&gt;+&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;theme_bw&lt;/span&gt;(base_size &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;11&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;pH&lt;/strong&gt; shows the strongest alignment in ordination space — ecologically meaningful because Comau&amp;rsquo;s deep waters are aragonite-undersaturated, and pH fluctuates seasonally as photosynthesis and respiration shift the carbonate equilibrium &lt;a href="https://consensus.app/papers/details/23f24763557b5ea29efac6fa0cf069d0/?utm_source=claude_desktop"&gt;Garcia-Herrera et al. 2022&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id="panel-b--unique-variance-fractions"&gt;Panel B — Unique variance fractions&lt;/h3&gt;
&lt;p&gt;Each predictor group&amp;rsquo;s unique contribution is estimated by conditioning on the other two groups plus depth and season. This partitions the explained variance into components attributable to nutrients, physical variables, and productivity.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-r" data-lang="r"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;fit_unique &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;function&lt;/span&gt;(Y, X_main, X_condlist, extra_cond &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;NULL&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; dat &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;do.call&lt;/span&gt;(cbind, &lt;span style="color:#a6e22e"&gt;c&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;list&lt;/span&gt;(X_main), X_condlist,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (&lt;span style="color:#f92672"&gt;!&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;is.null&lt;/span&gt;(extra_cond)) &lt;span style="color:#a6e22e"&gt;list&lt;/span&gt;(extra_cond) &lt;span style="color:#66d9ef"&gt;else&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;NULL&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;colnames&lt;/span&gt;(dat) &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;make.unique&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;colnames&lt;/span&gt;(dat))
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; k &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;ncol&lt;/span&gt;(X_main)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; form &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;paste&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;Y ~&amp;#34;&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;paste&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;colnames&lt;/span&gt;(dat)[1&lt;span style="color:#f92672"&gt;:&lt;/span&gt;k], collapse&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34; + &amp;#34;&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;+ Condition(&amp;#34;&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;paste&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;colnames&lt;/span&gt;(dat)[&lt;span style="color:#f92672"&gt;-&lt;/span&gt;(&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt;k)], collapse&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34; + &amp;#34;&lt;/span&gt;), &lt;span style="color:#e6db74"&gt;&amp;#34;)&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; mod &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;capscale&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;as.formula&lt;/span&gt;(form), data &lt;span style="color:#f92672"&gt;=&lt;/span&gt; dat, distance &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;bray&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;list&lt;/span&gt;(R2 &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;RsquareAdj&lt;/span&gt;(mod), anova &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;anova&lt;/span&gt;(mod, permutations &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;999&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;extra_cond &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;data.frame&lt;/span&gt;(depth_m &lt;span style="color:#f92672"&gt;=&lt;/span&gt; meta&lt;span style="color:#f92672"&gt;$&lt;/span&gt;depth_m, season &lt;span style="color:#f92672"&gt;=&lt;/span&gt; meta&lt;span style="color:#f92672"&gt;$&lt;/span&gt;season)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;X_N &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; X_vif[, &lt;span style="color:#a6e22e"&gt;intersect&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;colnames&lt;/span&gt;(X_vif), vars_nutrients), drop&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;FALSE&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;X_P &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; X_vif[, &lt;span style="color:#a6e22e"&gt;intersect&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;colnames&lt;/span&gt;(X_vif), vars_physicals), drop&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;FALSE&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;X_R &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; X_vif[, &lt;span style="color:#a6e22e"&gt;intersect&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;colnames&lt;/span&gt;(X_vif), vars_productivity), drop&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;FALSE&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;uN &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;fit_unique&lt;/span&gt;(Y_rel, X_N, &lt;span style="color:#a6e22e"&gt;list&lt;/span&gt;(X_P, X_R), extra_cond) &lt;span style="color:#75715e"&gt;# Physical adj.R² = 0.073&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;uP &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;fit_unique&lt;/span&gt;(Y_rel, X_P, &lt;span style="color:#a6e22e"&gt;list&lt;/span&gt;(X_N, X_R), extra_cond) &lt;span style="color:#75715e"&gt;# Nutrients adj.R² = 0.034&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;uR &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;fit_unique&lt;/span&gt;(Y_rel, X_R, &lt;span style="color:#a6e22e"&gt;list&lt;/span&gt;(X_N, X_P), extra_cond) &lt;span style="color:#75715e"&gt;# Productivity adj.R² = 0.017&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="panel-c--gam-responses-to-ph"&gt;Panel C — GAM responses to pH&lt;/h3&gt;
&lt;p&gt;The six MAGs most strongly aligned with the pH axis are identified from the dbRDA species scores (projection onto the pH biplot vector), then modelled with GAMs on CLR-transformed abundances. CLR transformation (log-ratio with geometric mean) makes the data compositionally safe for regression.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-r" data-lang="r"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# CLR transformation (once, over full community)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;clr_transform &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;function&lt;/span&gt;(x, pseudocount &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1e-6&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; x &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;as.matrix&lt;/span&gt;(x)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; x &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;sweep&lt;/span&gt;(x, &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;rowSums&lt;/span&gt;(x), &lt;span style="color:#e6db74"&gt;&amp;#34;/&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;log&lt;/span&gt;((x &lt;span style="color:#f92672"&gt;+&lt;/span&gt; pseudocount) &lt;span style="color:#f92672"&gt;/&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;exp&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;rowMeans&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;log&lt;/span&gt;(x &lt;span style="color:#f92672"&gt;+&lt;/span&gt; pseudocount))))
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Y_all &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;as&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;otu_table&lt;/span&gt;(ps), &lt;span style="color:#e6db74"&gt;&amp;#34;matrix&amp;#34;&lt;/span&gt;); &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (&lt;span style="color:#a6e22e"&gt;taxa_are_rows&lt;/span&gt;(ps)) Y_all &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;t&lt;/span&gt;(Y_all)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;clr_all &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;clr_transform&lt;/span&gt;(Y_all)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Project species scores onto the pH biplot vector&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sp &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;scores&lt;/span&gt;(mod_partial, display &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;species&amp;#34;&lt;/span&gt;, scaling &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;) &lt;span style="color:#f92672"&gt;%&amp;gt;%&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;as.data.frame&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;bp &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;scores&lt;/span&gt;(mod_partial, display &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;bp&amp;#34;&lt;/span&gt;, scaling &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;) &lt;span style="color:#f92672"&gt;%&amp;gt;%&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;as.data.frame&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;v &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;as.numeric&lt;/span&gt;(bp[&lt;span style="color:#e6db74"&gt;&amp;#34;pH&amp;#34;&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;c&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;CAP1&amp;#34;&lt;/span&gt;,&lt;span style="color:#e6db74"&gt;&amp;#34;CAP2&amp;#34;&lt;/span&gt;)]); u &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; v &lt;span style="color:#f92672"&gt;/&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;sqrt&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;sum&lt;/span&gt;(v^2))
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;proj &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;as.matrix&lt;/span&gt;(sp[, &lt;span style="color:#a6e22e"&gt;c&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;CAP1&amp;#34;&lt;/span&gt;,&lt;span style="color:#e6db74"&gt;&amp;#34;CAP2&amp;#34;&lt;/span&gt;)]) &lt;span style="color:#f92672"&gt;%*%&lt;/span&gt; u
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sel_MAGs &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;rownames&lt;/span&gt;(sp)&lt;span style="color:#a6e22e"&gt;[order&lt;/span&gt;(proj, decreasing &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;TRUE&lt;/span&gt;)][1&lt;span style="color:#f92672"&gt;:&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;6&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Fit GAM per MAG; predict smooths at modal depth/season&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;df_clr &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;as.data.frame&lt;/span&gt;(clr_all[, sel_MAGs]) &lt;span style="color:#f92672"&gt;%&amp;gt;%&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; tibble&lt;span style="color:#f92672"&gt;::&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;rownames_to_column&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;SampleID&amp;#34;&lt;/span&gt;) &lt;span style="color:#f92672"&gt;%&amp;gt;%&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;pivot_longer&lt;/span&gt;(&lt;span style="color:#f92672"&gt;-&lt;/span&gt;SampleID, names_to &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;MAG&amp;#34;&lt;/span&gt;, values_to &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;CLR_abund&amp;#34;&lt;/span&gt;) &lt;span style="color:#f92672"&gt;%&amp;gt;%&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;left_join&lt;/span&gt;(meta, by &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;SampleID&amp;#34;&lt;/span&gt;) &lt;span style="color:#f92672"&gt;%&amp;gt;%&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;filter&lt;/span&gt;(&lt;span style="color:#f92672"&gt;!&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;is.na&lt;/span&gt;(pH), &lt;span style="color:#f92672"&gt;!&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;is.na&lt;/span&gt;(CLR_abund))
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;rng &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;range&lt;/span&gt;(df_clr&lt;span style="color:#f92672"&gt;$&lt;/span&gt;pH, na.rm &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;TRUE&lt;/span&gt;); grid &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;seq&lt;/span&gt;(rng[1], rng[2], length.out &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;100&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ref_depth &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;as.numeric&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;names&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;sort&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;table&lt;/span&gt;(df_clr&lt;span style="color:#f92672"&gt;$&lt;/span&gt;depth_m), decreasing&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;TRUE&lt;/span&gt;))[1])
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ref_season &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;names&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;sort&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;table&lt;/span&gt;(df_clr&lt;span style="color:#f92672"&gt;$&lt;/span&gt;season), decreasing&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;TRUE&lt;/span&gt;))[1]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;mods &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; df_clr &lt;span style="color:#f92672"&gt;%&amp;gt;%&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;group_by&lt;/span&gt;(MAG) &lt;span style="color:#f92672"&gt;%&amp;gt;%&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;group_map&lt;/span&gt;(&lt;span style="color:#f92672"&gt;~&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;gam&lt;/span&gt;(CLR_abund &lt;span style="color:#f92672"&gt;~&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;s&lt;/span&gt;(pH, k&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;5&lt;/span&gt;) &lt;span style="color:#f92672"&gt;+&lt;/span&gt; depth_m &lt;span style="color:#f92672"&gt;+&lt;/span&gt; season, data&lt;span style="color:#f92672"&gt;=&lt;/span&gt;.x, method&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;REML&amp;#34;&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;names&lt;/span&gt;(mods) &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;unique&lt;/span&gt;(df_clr&lt;span style="color:#f92672"&gt;$&lt;/span&gt;MAG)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;smooths_pH &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;bind_rows&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;lapply&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;names&lt;/span&gt;(mods), &lt;span style="color:#66d9ef"&gt;function&lt;/span&gt;(m) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; nd &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;data.frame&lt;/span&gt;(pH&lt;span style="color:#f92672"&gt;=&lt;/span&gt;grid, depth_m&lt;span style="color:#f92672"&gt;=&lt;/span&gt;ref_depth,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; season&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;factor&lt;/span&gt;(ref_season, levels&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;levels&lt;/span&gt;(df_clr&lt;span style="color:#f92672"&gt;$&lt;/span&gt;season)))
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; pr &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;predict&lt;/span&gt;(mods[[m]], newdata&lt;span style="color:#f92672"&gt;=&lt;/span&gt;nd, se.fit&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;TRUE&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;tibble&lt;/span&gt;(MAG&lt;span style="color:#f92672"&gt;=&lt;/span&gt;m, pH&lt;span style="color:#f92672"&gt;=&lt;/span&gt;grid, fit&lt;span style="color:#f92672"&gt;=&lt;/span&gt;pr&lt;span style="color:#f92672"&gt;$&lt;/span&gt;fit, lwr&lt;span style="color:#f92672"&gt;=&lt;/span&gt;pr&lt;span style="color:#f92672"&gt;$&lt;/span&gt;fit&lt;span style="color:#ae81ff"&gt;-1.96&lt;/span&gt;&lt;span style="color:#f92672"&gt;*&lt;/span&gt;pr&lt;span style="color:#f92672"&gt;$&lt;/span&gt;se.fit, upr&lt;span style="color:#f92672"&gt;=&lt;/span&gt;pr&lt;span style="color:#f92672"&gt;$&lt;/span&gt;fit&lt;span style="color:#ae81ff"&gt;+1.96&lt;/span&gt;&lt;span style="color:#f92672"&gt;*&lt;/span&gt;pr&lt;span style="color:#f92672"&gt;$&lt;/span&gt;se.fit)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}))
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;p2C &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;ggplot&lt;/span&gt;(smooths_pH, &lt;span style="color:#a6e22e"&gt;aes&lt;/span&gt;(x&lt;span style="color:#f92672"&gt;=&lt;/span&gt;pH, y&lt;span style="color:#f92672"&gt;=&lt;/span&gt;fit)) &lt;span style="color:#f92672"&gt;+&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;geom_ribbon&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;aes&lt;/span&gt;(ymin&lt;span style="color:#f92672"&gt;=&lt;/span&gt;lwr, ymax&lt;span style="color:#f92672"&gt;=&lt;/span&gt;upr), fill&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;grey85&amp;#34;&lt;/span&gt;, alpha&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;0.7&lt;/span&gt;) &lt;span style="color:#f92672"&gt;+&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;geom_line&lt;/span&gt;(linewidth&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;, color&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;#3182BD&amp;#34;&lt;/span&gt;) &lt;span style="color:#f92672"&gt;+&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;facet_wrap&lt;/span&gt;(&lt;span style="color:#f92672"&gt;~&lt;/span&gt; MAG, scales&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;free_y&amp;#34;&lt;/span&gt;, ncol&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;3&lt;/span&gt;) &lt;span style="color:#f92672"&gt;+&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;labs&lt;/span&gt;(x&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;pH&amp;#34;&lt;/span&gt;, y&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;CLR abundance&amp;#34;&lt;/span&gt;) &lt;span style="color:#f92672"&gt;+&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;theme_bw&lt;/span&gt;(base_size&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;11&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="panel-d--distance-decay-mrm"&gt;Panel D — Distance-decay (MRM)&lt;/h3&gt;
&lt;p&gt;Multiple regression on distance matrices tests which type of separation (geographic, environmental, or temporal) best predicts community dissimilarity. The &lt;code&gt;build_station_level()&lt;/code&gt;, &lt;code&gt;build_distances()&lt;/code&gt;, and &lt;code&gt;run_mrm()&lt;/code&gt; functions in &lt;code&gt;utils.R&lt;/code&gt; handle the distance matrix construction.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-r" data-lang="r"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# These helpers are defined in utils.R&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;res_5m &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; sta &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;build_station_level&lt;/span&gt;(ps, depth_value &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;5&lt;/span&gt;, depth_tolerance &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0.6&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; dists &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;build_distances&lt;/span&gt;(sta&lt;span style="color:#f92672"&gt;$&lt;/span&gt;X_sta, sta&lt;span style="color:#f92672"&gt;$&lt;/span&gt;md_sta, use_time &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;TRUE&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;run_mrm&lt;/span&gt;(A&lt;span style="color:#f92672"&gt;=&lt;/span&gt;dists&lt;span style="color:#f92672"&gt;$&lt;/span&gt;A, B&lt;span style="color:#f92672"&gt;=&lt;/span&gt;dists&lt;span style="color:#f92672"&gt;$&lt;/span&gt;B, C&lt;span style="color:#f92672"&gt;=&lt;/span&gt;dists&lt;span style="color:#f92672"&gt;$&lt;/span&gt;C, D&lt;span style="color:#f92672"&gt;=&lt;/span&gt;dists&lt;span style="color:#f92672"&gt;$&lt;/span&gt;D, nperm&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;9999&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;res_20m &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; sta &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;build_station_level&lt;/span&gt;(ps, depth_value &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;20&lt;/span&gt;, depth_tolerance &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0.6&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; dists &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;build_distances&lt;/span&gt;(sta&lt;span style="color:#f92672"&gt;$&lt;/span&gt;X_sta, sta&lt;span style="color:#f92672"&gt;$&lt;/span&gt;md_sta, use_time &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;TRUE&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;run_mrm&lt;/span&gt;(A&lt;span style="color:#f92672"&gt;=&lt;/span&gt;dists&lt;span style="color:#f92672"&gt;$&lt;/span&gt;A, B&lt;span style="color:#f92672"&gt;=&lt;/span&gt;dists&lt;span style="color:#f92672"&gt;$&lt;/span&gt;B, C&lt;span style="color:#f92672"&gt;=&lt;/span&gt;dists&lt;span style="color:#f92672"&gt;$&lt;/span&gt;C, D&lt;span style="color:#f92672"&gt;=&lt;/span&gt;dists&lt;span style="color:#f92672"&gt;$&lt;/span&gt;D, nperm&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;9999&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Result: seasonal time distance is the strongest predictor at both depths&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# β ≈ 0.02, P &amp;lt; 0.002; geographic distance is not significant&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The fjord is not dispersal-limited; it is seasonally forced. This is consistent with &lt;a href="https://consensus.app/papers/details/bc749bd6dd9756dcb444599c4ca13b2f/?utm_source=claude_desktop"&gt;Tamayo-Leiva et al. 2021&lt;/a&gt;, who found widespread microbial dispersion across hundreds of kilometres of Patagonian fjords.&lt;/p&gt;
&lt;h3 id="assembly-and-export-1"&gt;Assembly and export&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-r" data-lang="r"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;library&lt;/span&gt;(cowplot)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;leg_unified &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;get_legend&lt;/span&gt;(p2A &lt;span style="color:#f92672"&gt;+&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;theme&lt;/span&gt;(legend.position&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;right&amp;#34;&lt;/span&gt;, legend.box&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;vertical&amp;#34;&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;fig2 &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;plot_grid&lt;/span&gt;(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;plot_grid&lt;/span&gt;(p2A &lt;span style="color:#f92672"&gt;+&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;theme&lt;/span&gt;(legend.position&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;none&amp;#34;&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; p2B &lt;span style="color:#f92672"&gt;+&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;theme&lt;/span&gt;(legend.position&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;none&amp;#34;&lt;/span&gt;), ncol&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;, labels&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;c&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;A&amp;#34;&lt;/span&gt;,&lt;span style="color:#e6db74"&gt;&amp;#34;B&amp;#34;&lt;/span&gt;)),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;plot_grid&lt;/span&gt;(p2C &lt;span style="color:#f92672"&gt;+&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;theme&lt;/span&gt;(legend.position&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;none&amp;#34;&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; p2D &lt;span style="color:#f92672"&gt;+&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;theme&lt;/span&gt;(legend.position&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;none&amp;#34;&lt;/span&gt;), ncol&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;, labels&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;c&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;C&amp;#34;&lt;/span&gt;,&lt;span style="color:#e6db74"&gt;&amp;#34;D&amp;#34;&lt;/span&gt;)),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ncol&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;) &lt;span style="color:#f92672"&gt;%&amp;gt;%&lt;/span&gt; { &lt;span style="color:#a6e22e"&gt;plot_grid&lt;/span&gt;(., &lt;span style="color:#a6e22e"&gt;ggdraw&lt;/span&gt;(leg_unified), ncol&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;, rel_widths&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;c&lt;/span&gt;(&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;0.15&lt;/span&gt;)) }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;ggsave&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;Figure2.pdf&amp;#34;&lt;/span&gt;, fig2, width&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;300&lt;/span&gt;, height&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;180&lt;/span&gt;, units&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;mm&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;figure&gt;
&lt;img src="https://www.castrolab.org/img/comau-walkthrough/Figure2.png" /&gt;
&lt;/figure&gt;
&lt;em&gt;Figure 2. (A) Partial dbRDA conditioned on depth and season (adj. R² = 0.50). (B) Unique variance fractions by predictor group. (C) GAM smooths of CLR abundance vs. pH for the six MAGs most strongly aligned with the pH axis. (D) MRM distance-decay coefficients at 5 m and 20 m.&lt;/em&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="figure-3--what-are-they-doing"&gt;Figure 3 — What are they doing?&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Script:&lt;/strong&gt; &lt;code&gt;Figure3_final.R&lt;/code&gt; — also writes &lt;code&gt;fig3_shared_objects.RDS&lt;/code&gt;, which Figures 4 and 5 read.&lt;/p&gt;
&lt;p&gt;Taxonomy tells us &lt;em&gt;who&lt;/em&gt; is there; this figure asks &lt;em&gt;what those organisms are doing&lt;/em&gt; by quantifying abundance-weighted functional potential from the DRAM gene annotation matrix.&lt;/p&gt;
&lt;h3 id="mag--gene-matrix-reconciliation"&gt;MAG × gene matrix reconciliation&lt;/h3&gt;
&lt;p&gt;The hits matrix covers 677 MAGs (the full, pre-dereplication set); the phyloseq object holds 513 dereplicated MAGs. Always intersect before any analysis so you are working with the same organisms in both matrices.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-r" data-lang="r"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;source&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;utils.R&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;library&lt;/span&gt;(vegan); &lt;span style="color:#a6e22e"&gt;library&lt;/span&gt;(ape)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ps &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;load_ps&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;H_tbl &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; readr&lt;span style="color:#f92672"&gt;::&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;read_csv&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;gene_bin_mat.collapsed.v6.csv&amp;#34;&lt;/span&gt;, show_col_types&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;FALSE&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;genes &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; H_tbl&lt;span style="color:#f92672"&gt;$&lt;/span&gt;gene
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;H_mat &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;as.matrix&lt;/span&gt;(H_tbl[, &lt;span style="color:#a6e22e"&gt;setdiff&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;names&lt;/span&gt;(H_tbl), &lt;span style="color:#e6db74"&gt;&amp;#34;gene&amp;#34;&lt;/span&gt;)])
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;rownames&lt;/span&gt;(H_mat) &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; genes
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;otu &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;as&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;otu_table&lt;/span&gt;(ps), &lt;span style="color:#e6db74"&gt;&amp;#34;matrix&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;A_counts &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (&lt;span style="color:#a6e22e"&gt;taxa_are_rows&lt;/span&gt;(ps)) &lt;span style="color:#a6e22e"&gt;t&lt;/span&gt;(otu) &lt;span style="color:#66d9ef"&gt;else&lt;/span&gt; otu &lt;span style="color:#75715e"&gt;# samples × MAGs&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;row_sums &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;rowSums&lt;/span&gt;(A_counts); row_sums[row_sums &lt;span style="color:#f92672"&gt;==&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;] &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;A_rel &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;sweep&lt;/span&gt;(A_counts, &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;, row_sums, &lt;span style="color:#e6db74"&gt;&amp;#34;/&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;MAG_common &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;intersect&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;colnames&lt;/span&gt;(A_rel), &lt;span style="color:#a6e22e"&gt;colnames&lt;/span&gt;(H_mat))
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;A_rel_use &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; A_rel[, MAG_common, drop&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;FALSE&lt;/span&gt;] &lt;span style="color:#75715e"&gt;# samples × M&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;H_use &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; H_mat[, MAG_common, drop&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;FALSE&lt;/span&gt;] &lt;span style="color:#75715e"&gt;# genes × M&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 513 MAGs in ps → intersection with 677-MAG annotation set&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;message&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;sprintf&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;Intersection: %d MAGs&amp;#34;&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;length&lt;/span&gt;(MAG_common)))
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="abundance-weighted-functional-potential"&gt;Abundance-weighted functional potential&lt;/h3&gt;
&lt;p&gt;We combine the abundance matrix &lt;strong&gt;A&lt;/strong&gt; (samples × MAGs) with the hit matrix &lt;strong&gt;H&lt;/strong&gt; (genes × MAGs) to produce per-sample gene potentials &lt;strong&gt;P = A Hᵀ&lt;/strong&gt; (samples × genes). This converts &amp;ldquo;this genome has this gene&amp;rdquo; into &amp;ldquo;this process is being performed at approximately this rate, given how abundant that genome is.&amp;rdquo;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-r" data-lang="r"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;P_raw &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; A_rel_use &lt;span style="color:#f92672"&gt;%*%&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;t&lt;/span&gt;(H_use) &lt;span style="color:#75715e"&gt;# samples × genes&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;P_raw &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;as.matrix&lt;/span&gt;(P_raw); &lt;span style="color:#a6e22e"&gt;colnames&lt;/span&gt;(P_raw) &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;rownames&lt;/span&gt;(H_use)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Row-normalize (compositional fingerprint per sample)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;row_tot &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;rowSums&lt;/span&gt;(P_raw); P_rel &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;sweep&lt;/span&gt;(P_raw, &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;ifelse&lt;/span&gt;(row_tot&lt;span style="color:#f92672"&gt;==&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;,&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;,row_tot), &lt;span style="color:#e6db74"&gt;&amp;#34;/&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Hellinger transform for ordination&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;gene_cols &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;colnames&lt;/span&gt;(P_rel)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;P_hell &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; vegan&lt;span style="color:#f92672"&gt;::&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;decostand&lt;/span&gt;(P_rel, method&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;hellinger&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="pathway-dictionary-and-pathway-totals"&gt;Pathway dictionary and pathway totals&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-r" data-lang="r"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;pathway_dict &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;list&lt;/span&gt;(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Respiration_ETC &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;c&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;CydA&amp;#34;&lt;/span&gt;,&lt;span style="color:#e6db74"&gt;&amp;#34;CyoA&amp;#34;&lt;/span&gt;,&lt;span style="color:#e6db74"&gt;&amp;#34;CoxA&amp;#34;&lt;/span&gt;,&lt;span style="color:#e6db74"&gt;&amp;#34;CcoN&amp;#34;&lt;/span&gt;,&lt;span style="color:#e6db74"&gt;&amp;#34;NuoF&amp;#34;&lt;/span&gt;,&lt;span style="color:#e6db74"&gt;&amp;#34;FrdA&amp;#34;&lt;/span&gt;,&lt;span style="color:#e6db74"&gt;&amp;#34;SdhA&amp;#34;&lt;/span&gt;,&lt;span style="color:#e6db74"&gt;&amp;#34;AtpA&amp;#34;&lt;/span&gt;,&lt;span style="color:#e6db74"&gt;&amp;#34;FCC&amp;#34;&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Carbon_core &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;c&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;RbcL&amp;#34;&lt;/span&gt;,&lt;span style="color:#e6db74"&gt;&amp;#34;PEPC&amp;#34;&lt;/span&gt;,&lt;span style="color:#e6db74"&gt;&amp;#34;AcnB&amp;#34;&lt;/span&gt;,&lt;span style="color:#e6db74"&gt;&amp;#34;CA&amp;#34;&lt;/span&gt;,&lt;span style="color:#e6db74"&gt;&amp;#34;CoxL&amp;#34;&lt;/span&gt;,&lt;span style="color:#e6db74"&gt;&amp;#34;MDH&amp;#34;&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; B12_cobalamin &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;c&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;BluB&amp;#34;&lt;/span&gt;,&lt;span style="color:#e6db74"&gt;&amp;#34;BtuCDF&amp;#34;&lt;/span&gt;,&lt;span style="color:#e6db74"&gt;&amp;#34;CobA&amp;#34;&lt;/span&gt;,&lt;span style="color:#e6db74"&gt;&amp;#34;CobC&amp;#34;&lt;/span&gt;,&lt;span style="color:#e6db74"&gt;&amp;#34;CobU&amp;#34;&lt;/span&gt;,&lt;span style="color:#e6db74"&gt;&amp;#34;CbiG&amp;#34;&lt;/span&gt;,&lt;span style="color:#e6db74"&gt;&amp;#34;IsiB&amp;#34;&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; DMSP_Methyl &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;c&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;dmdA&amp;#34;&lt;/span&gt;,&lt;span style="color:#e6db74"&gt;&amp;#34;dmdB&amp;#34;&lt;/span&gt;,&lt;span style="color:#e6db74"&gt;&amp;#34;dmdD&amp;#34;&lt;/span&gt;,&lt;span style="color:#e6db74"&gt;&amp;#34;dddL&amp;#34;&lt;/span&gt;,&lt;span style="color:#e6db74"&gt;&amp;#34;DddP&amp;#34;&lt;/span&gt;,&lt;span style="color:#e6db74"&gt;&amp;#34;mddA&amp;#34;&lt;/span&gt;,&lt;span style="color:#e6db74"&gt;&amp;#34;dmoA&amp;#34;&lt;/span&gt;,&lt;span style="color:#e6db74"&gt;&amp;#34;Tmm&amp;#34;&lt;/span&gt;,&lt;span style="color:#e6db74"&gt;&amp;#34;mtoX&amp;#34;&lt;/span&gt;,&lt;span style="color:#e6db74"&gt;&amp;#34;dorA&amp;#34;&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Nitrogen_cycle &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;c&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;AmoA&amp;#34;&lt;/span&gt;,&lt;span style="color:#e6db74"&gt;&amp;#34;AmoB&amp;#34;&lt;/span&gt;,&lt;span style="color:#e6db74"&gt;&amp;#34;AmoC&amp;#34;&lt;/span&gt;,&lt;span style="color:#e6db74"&gt;&amp;#34;NxrA&amp;#34;&lt;/span&gt;,&lt;span style="color:#e6db74"&gt;&amp;#34;NapA&amp;#34;&lt;/span&gt;,&lt;span style="color:#e6db74"&gt;&amp;#34;NarG&amp;#34;&lt;/span&gt;,&lt;span style="color:#e6db74"&gt;&amp;#34;NirK&amp;#34;&lt;/span&gt;,&lt;span style="color:#e6db74"&gt;&amp;#34;NirS&amp;#34;&lt;/span&gt;,&lt;span style="color:#e6db74"&gt;&amp;#34;NrfA&amp;#34;&lt;/span&gt;,&lt;span style="color:#e6db74"&gt;&amp;#34;NorB&amp;#34;&lt;/span&gt;,&lt;span style="color:#e6db74"&gt;&amp;#34;NosZ&amp;#34;&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Sulfur_cycle &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;c&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;Sqr&amp;#34;&lt;/span&gt;,&lt;span style="color:#e6db74"&gt;&amp;#34;SoxB&amp;#34;&lt;/span&gt;,&lt;span style="color:#e6db74"&gt;&amp;#34;DsrA&amp;#34;&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Methane_redox &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;c&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;PmoA&amp;#34;&lt;/span&gt;,&lt;span style="color:#e6db74"&gt;&amp;#34;Mcr&amp;#34;&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Phototrophy &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;c&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;PsaA&amp;#34;&lt;/span&gt;,&lt;span style="color:#e6db74"&gt;&amp;#34;PsbA&amp;#34;&lt;/span&gt;,&lt;span style="color:#e6db74"&gt;&amp;#34;RHO&amp;#34;&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Hydrogenases &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;c&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;NiFe&amp;#34;&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Detox_misc &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;c&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;ArsC&amp;#34;&lt;/span&gt;,&lt;span style="color:#e6db74"&gt;&amp;#34;RdhA&amp;#34;&lt;/span&gt;,&lt;span style="color:#e6db74"&gt;&amp;#34;ARO&amp;#34;&lt;/span&gt;,&lt;span style="color:#e6db74"&gt;&amp;#34;FdhA&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;avail &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;function&lt;/span&gt;(g) &lt;span style="color:#a6e22e"&gt;intersect&lt;/span&gt;(g, &lt;span style="color:#a6e22e"&gt;colnames&lt;/span&gt;(P_raw))
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Per-sample pathway totals from P_raw&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sd &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;as.data.frame&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;sample_data&lt;/span&gt;(ps))
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;season_vec &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; sd&lt;span style="color:#f92672"&gt;$&lt;/span&gt;season
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;P_raw_tbl &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; tibble&lt;span style="color:#f92672"&gt;::&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;as_tibble&lt;/span&gt;(P_raw, rownames&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;sample&amp;#34;&lt;/span&gt;) &lt;span style="color:#f92672"&gt;%&amp;gt;%&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;mutate&lt;/span&gt;(season &lt;span style="color:#f92672"&gt;=&lt;/span&gt; season_vec, .after&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;sample&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;pathway_totals &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;tibble&lt;/span&gt;(sample&lt;span style="color:#f92672"&gt;=&lt;/span&gt;P_raw_tbl&lt;span style="color:#f92672"&gt;$&lt;/span&gt;sample, season&lt;span style="color:#f92672"&gt;=&lt;/span&gt;P_raw_tbl&lt;span style="color:#f92672"&gt;$&lt;/span&gt;season)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; (nm &lt;span style="color:#66d9ef"&gt;in&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;names&lt;/span&gt;(pathway_dict))
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; pathway_totals[[nm]] &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;rowSums&lt;/span&gt;(P_raw_tbl[, &lt;span style="color:#a6e22e"&gt;avail&lt;/span&gt;(pathway_dict[[nm]]), drop&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;FALSE&lt;/span&gt;])
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="identifying-sentinel-genes-by-ω"&gt;Identifying sentinel genes by ω²&lt;/h3&gt;
&lt;p&gt;For each pathway, sentinel genes are those with the highest ω² effect size across seasons — the genes that carry the most seasonal signal.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-r" data-lang="r"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;compute_effect &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;function&lt;/span&gt;(df) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; fit &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;aov&lt;/span&gt;(val &lt;span style="color:#f92672"&gt;~&lt;/span&gt; season, data&lt;span style="color:#f92672"&gt;=&lt;/span&gt;df)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; sm &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;summary&lt;/span&gt;(fit)[[1]]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ss &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; sm[,&lt;span style="color:#e6db74"&gt;&amp;#34;Sum Sq&amp;#34;&lt;/span&gt;]; ms &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; sm[,&lt;span style="color:#e6db74"&gt;&amp;#34;Mean Sq&amp;#34;&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; omega2 &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;max&lt;/span&gt;((ss[1] &lt;span style="color:#f92672"&gt;-&lt;/span&gt; sm[1,&lt;span style="color:#e6db74"&gt;&amp;#34;Df&amp;#34;&lt;/span&gt;]&lt;span style="color:#f92672"&gt;*&lt;/span&gt;ms[2]) &lt;span style="color:#f92672"&gt;/&lt;/span&gt; (&lt;span style="color:#a6e22e"&gt;sum&lt;/span&gt;(ss) &lt;span style="color:#f92672"&gt;+&lt;/span&gt; ms[2]), &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;tibble&lt;/span&gt;(F&lt;span style="color:#f92672"&gt;=&lt;/span&gt;sm[1,&lt;span style="color:#e6db74"&gt;&amp;#34;F value&amp;#34;&lt;/span&gt;], p&lt;span style="color:#f92672"&gt;=&lt;/span&gt;sm[1,&lt;span style="color:#e6db74"&gt;&amp;#34;Pr(&amp;gt;F)&amp;#34;&lt;/span&gt;], omega2&lt;span style="color:#f92672"&gt;=&lt;/span&gt;omega2)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;gene_effects &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; P_raw_tbl &lt;span style="color:#f92672"&gt;%&amp;gt;%&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;pivot_longer&lt;/span&gt;(&lt;span style="color:#f92672"&gt;-&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;c&lt;/span&gt;(sample,season), names_to&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;gene&amp;#34;&lt;/span&gt;, values_to&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;val&amp;#34;&lt;/span&gt;) &lt;span style="color:#f92672"&gt;%&amp;gt;%&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;group_by&lt;/span&gt;(gene) &lt;span style="color:#f92672"&gt;%&amp;gt;%&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;group_modify&lt;/span&gt;(&lt;span style="color:#f92672"&gt;~&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;compute_effect&lt;/span&gt;(.x)) &lt;span style="color:#f92672"&gt;%&amp;gt;%&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;ungroup&lt;/span&gt;() &lt;span style="color:#f92672"&gt;%&amp;gt;%&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;mutate&lt;/span&gt;(p_adj &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;p.adjust&lt;/span&gt;(p, method&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;BH&amp;#34;&lt;/span&gt;)) &lt;span style="color:#f92672"&gt;%&amp;gt;%&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;arrange&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;desc&lt;/span&gt;(omega2))
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;pathway_lookup &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; tibble&lt;span style="color:#f92672"&gt;::&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;enframe&lt;/span&gt;(pathway_dict, name&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;pathway&amp;#34;&lt;/span&gt;, value&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;gene&amp;#34;&lt;/span&gt;) &lt;span style="color:#f92672"&gt;%&amp;gt;%&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; tidyr&lt;span style="color:#f92672"&gt;::&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;unnest_longer&lt;/span&gt;(gene) &lt;span style="color:#f92672"&gt;%&amp;gt;%&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; dplyr&lt;span style="color:#f92672"&gt;::&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;semi_join&lt;/span&gt;(gene_effects, by&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;gene&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sentinels &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; gene_effects &lt;span style="color:#f92672"&gt;%&amp;gt;%&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;inner_join&lt;/span&gt;(pathway_lookup, by&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;gene&amp;#34;&lt;/span&gt;) &lt;span style="color:#f92672"&gt;%&amp;gt;%&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;group_by&lt;/span&gt;(pathway) &lt;span style="color:#f92672"&gt;%&amp;gt;%&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;arrange&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;desc&lt;/span&gt;(omega2), .by_group&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;TRUE&lt;/span&gt;) &lt;span style="color:#f92672"&gt;%&amp;gt;%&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;slice_head&lt;/span&gt;(n&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;3&lt;/span&gt;) &lt;span style="color:#f92672"&gt;%&amp;gt;%&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;ungroup&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="key-findings"&gt;Key findings&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Pathway&lt;/th&gt;
&lt;th&gt;Sentinel gene(s)&lt;/th&gt;
&lt;th&gt;Peak season&lt;/th&gt;
&lt;th&gt;ω²&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Methane redox&lt;/td&gt;
&lt;td&gt;&lt;em&gt;mcrA&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Summer&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;0.41–0.42&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Sulfur cycling&lt;/td&gt;
&lt;td&gt;&lt;em&gt;dsrA&lt;/em&gt;, &lt;em&gt;sqr&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Fall&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;0.44–0.48&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;B₁₂/cobalamin&lt;/td&gt;
&lt;td&gt;&lt;em&gt;bluB&lt;/em&gt;, &lt;em&gt;cobU&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Fall&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;0.32–0.35&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Photosystem II&lt;/td&gt;
&lt;td&gt;&lt;em&gt;psbA&lt;/em&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Winter&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;0.41&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Nitrogen cycle&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;Weak&lt;/td&gt;
&lt;td&gt;0.08&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Phototrophy (rhodopsins)&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;None&lt;/td&gt;
&lt;td&gt;≈ 0&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;The Winter &lt;em&gt;psbA&lt;/em&gt; peak coincides with the Cyanobacteria bloom in Figure 1. The Fall enrichment of sulfur and B₁₂ genes likely reflects remineralisation of summer-bloom biomass, consistent with phytoplankton–bacteria coupling in Patagonian fjords &lt;a href="https://consensus.app/papers/details/e6f4b7e9d4535a26aeaa49b2b8ddf54e/?utm_source=claude_desktop"&gt;Montero et al. 2011&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id="panels-ad-and-export"&gt;Panels A–D and export&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-r" data-lang="r"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;main_pathways &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;c&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;Methane_redox&amp;#34;&lt;/span&gt;,&lt;span style="color:#e6db74"&gt;&amp;#34;Carbon_core&amp;#34;&lt;/span&gt;,&lt;span style="color:#e6db74"&gt;&amp;#34;Sulfur_cycle&amp;#34;&lt;/span&gt;,&lt;span style="color:#e6db74"&gt;&amp;#34;B12_cobalamin&amp;#34;&lt;/span&gt;,&lt;span style="color:#e6db74"&gt;&amp;#34;Nitrogen_cycle&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;meta_samp &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;as&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;sample_data&lt;/span&gt;(ps), &lt;span style="color:#e6db74"&gt;&amp;#34;data.frame&amp;#34;&lt;/span&gt;) &lt;span style="color:#f92672"&gt;%&amp;gt;%&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; tibble&lt;span style="color:#f92672"&gt;::&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;rownames_to_column&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;sample&amp;#34;&lt;/span&gt;) &lt;span style="color:#f92672"&gt;%&amp;gt;%&lt;/span&gt; dplyr&lt;span style="color:#f92672"&gt;::&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;select&lt;/span&gt;(sample, season, depth_m)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Panel A: pathway totals by season × depth&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ptA &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; pathway_totals &lt;span style="color:#f92672"&gt;%&amp;gt;%&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;pivot_longer&lt;/span&gt;(&lt;span style="color:#f92672"&gt;-&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;c&lt;/span&gt;(sample,season), names_to&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;pathway&amp;#34;&lt;/span&gt;, values_to&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;potential&amp;#34;&lt;/span&gt;) &lt;span style="color:#f92672"&gt;%&amp;gt;%&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;left_join&lt;/span&gt;(meta_samp, by&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;c&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;sample&amp;#34;&lt;/span&gt;,&lt;span style="color:#e6db74"&gt;&amp;#34;season&amp;#34;&lt;/span&gt;)) &lt;span style="color:#f92672"&gt;%&amp;gt;%&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;filter&lt;/span&gt;(pathway &lt;span style="color:#f92672"&gt;%in%&lt;/span&gt; main_pathways) &lt;span style="color:#f92672"&gt;%&amp;gt;%&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;mutate&lt;/span&gt;(season&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;factor&lt;/span&gt;(season, levels&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;c&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;Summer&amp;#34;&lt;/span&gt;,&lt;span style="color:#e6db74"&gt;&amp;#34;Fall&amp;#34;&lt;/span&gt;,&lt;span style="color:#e6db74"&gt;&amp;#34;Winter&amp;#34;&lt;/span&gt;)),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; depth_m&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;factor&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;as.character&lt;/span&gt;(depth_m), levels&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;c&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;5&amp;#34;&lt;/span&gt;,&lt;span style="color:#e6db74"&gt;&amp;#34;20&amp;#34;&lt;/span&gt;)))
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;panelA_summary &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; ptA &lt;span style="color:#f92672"&gt;%&amp;gt;%&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;group_by&lt;/span&gt;(pathway, season, depth_m) &lt;span style="color:#f92672"&gt;%&amp;gt;%&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;summarise&lt;/span&gt;(mean&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;mean&lt;/span&gt;(potential,na.rm&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;TRUE&lt;/span&gt;), se&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;sd&lt;/span&gt;(potential,na.rm&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;TRUE&lt;/span&gt;)&lt;span style="color:#f92672"&gt;/&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;sqrt&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;n&lt;/span&gt;()), .groups&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;drop&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Panel C: sentinel gene z-score heatmap (see script for full sentinel_long construction)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Panel D: PCoA on Hellinger-transformed P_rel&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;dist_h &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;dist&lt;/span&gt;(P_hell, method&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;euclidean&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;pcoa_res &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; ape&lt;span style="color:#f92672"&gt;::&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;pcoa&lt;/span&gt;(dist_h)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;scores &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;as.data.frame&lt;/span&gt;(pcoa_res&lt;span style="color:#f92672"&gt;$&lt;/span&gt;vectors[, &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;])
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;colnames&lt;/span&gt;(scores)[1&lt;span style="color:#f92672"&gt;:&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;] &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;c&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;Axis.1&amp;#34;&lt;/span&gt;,&lt;span style="color:#e6db74"&gt;&amp;#34;Axis.2&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;scores&lt;span style="color:#f92672"&gt;$&lt;/span&gt;sample &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;rownames&lt;/span&gt;(scores)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;scores &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; dplyr&lt;span style="color:#f92672"&gt;::&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;left_join&lt;/span&gt;(scores, meta_samp, by&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;sample&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# PERMANOVA on functional PCoA&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;adonis2&lt;/span&gt;(P_hell &lt;span style="color:#f92672"&gt;~&lt;/span&gt; season &lt;span style="color:#f92672"&gt;*&lt;/span&gt; depth_m, data&lt;span style="color:#f92672"&gt;=&lt;/span&gt;meta_samp, permutations&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;999&lt;/span&gt;, method&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;euclidean&amp;#34;&lt;/span&gt;, by&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;margin&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# season R² ≈ 0.18, depth R² ≈ 0.10&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Save shared objects for Figures 4 and 5&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;saveRDS&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;list&lt;/span&gt;(A_rel_use&lt;span style="color:#f92672"&gt;=&lt;/span&gt;A_rel_use, H_use&lt;span style="color:#f92672"&gt;=&lt;/span&gt;H_use,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; pathway_dict&lt;span style="color:#f92672"&gt;=&lt;/span&gt;pathway_dict, main_pathways&lt;span style="color:#f92672"&gt;=&lt;/span&gt;main_pathways),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;fig3_shared_objects.RDS&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;ggsave&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;Figure3.pdf&amp;#34;&lt;/span&gt;, final_fig3, width&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;12&lt;/span&gt;, height&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;10&lt;/span&gt;, units&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;in&amp;#34;&lt;/span&gt;, device&lt;span style="color:#f92672"&gt;=&lt;/span&gt;cairo_pdf)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;figure&gt;
&lt;img src="https://www.castrolab.org/img/comau-walkthrough/Figure3.png" /&gt;
&lt;/figure&gt;
&lt;em&gt;Figure 3. (A) Seasonal pathway totals (mean ± SE) at 5 m and 20 m. (B) Sentinel gene dynamics. (C) Z-scored seasonal heatmap of sentinel genes. (D) PCoA of Hellinger-transformed gene potentials; PERMANOVA season R² ≈ 0.18, depth R² ≈ 0.10.&lt;/em&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="figure-4--which-lineages-carry-which-functions"&gt;Figure 4 — Which lineages carry which functions?&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Script:&lt;/strong&gt; &lt;code&gt;Figure4_final.R&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;We know &lt;em&gt;what&lt;/em&gt; functions are enriched in each season (Figure 3); now we ask &lt;em&gt;which families&lt;/em&gt; are responsible by laying functional potential onto the phylogeny. This requires collapsing the MAG phylogeny to family level and computing per-family pathway z-scores.&lt;/p&gt;
&lt;h3 id="load-shared-objects-and-build-per-mag-pathway-potentials"&gt;Load shared objects and build per-MAG pathway potentials&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-r" data-lang="r"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;source&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;utils.R&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;library&lt;/span&gt;(ggtree); &lt;span style="color:#a6e22e"&gt;library&lt;/span&gt;(ggtreeExtra); &lt;span style="color:#a6e22e"&gt;library&lt;/span&gt;(ggnewscale)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ps &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;load_ps&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (&lt;span style="color:#f92672"&gt;!&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;exists&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;A_rel_use&amp;#34;&lt;/span&gt;)) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; fig3 &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;readRDS&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;fig3_shared_objects.RDS&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;list2env&lt;/span&gt;(fig3, envir&lt;span style="color:#f92672"&gt;=&lt;/span&gt;.GlobalEnv)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;fig3_paths &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;unique&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;c&lt;/span&gt;(main_pathways, &lt;span style="color:#e6db74"&gt;&amp;#34;Phototrophy&amp;#34;&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;gene_cols_H &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;rownames&lt;/span&gt;(H_use)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;avail &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;function&lt;/span&gt;(g) &lt;span style="color:#a6e22e"&gt;intersect&lt;/span&gt;(g, gene_cols_H)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;mag_ids &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;colnames&lt;/span&gt;(H_use)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Per-MAG pathway hit counts&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;mag_path_hits &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;do.call&lt;/span&gt;(cbind, &lt;span style="color:#a6e22e"&gt;lapply&lt;/span&gt;(fig3_paths, &lt;span style="color:#66d9ef"&gt;function&lt;/span&gt;(pw) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; gg &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;avail&lt;/span&gt;(pathway_dict[[pw]])
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (&lt;span style="color:#a6e22e"&gt;length&lt;/span&gt;(gg)&lt;span style="color:#f92672"&gt;==&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;) &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;rep&lt;/span&gt;(&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;length&lt;/span&gt;(mag_ids)))
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;colSums&lt;/span&gt;(H_use[gg, , drop&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;FALSE&lt;/span&gt;], na.rm&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;TRUE&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}))
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;colnames&lt;/span&gt;(mag_path_hits) &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; fig3_paths; &lt;span style="color:#a6e22e"&gt;rownames&lt;/span&gt;(mag_path_hits) &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; mag_ids
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Weight by mean MAG relative abundance across all samples&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;mag_mean_abund &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;colMeans&lt;/span&gt;(A_rel_use, na.rm&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;TRUE&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;mag_path_potential &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;sweep&lt;/span&gt;(mag_path_hits, &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;, mag_mean_abund&lt;span style="color:#a6e22e"&gt;[rownames&lt;/span&gt;(mag_path_hits)], `*`)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="collapse-to-family-level-compute-z-scores"&gt;Collapse to family level, compute z-scores&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-r" data-lang="r"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;tx &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;as.data.frame&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;tax_table&lt;/span&gt;(ps))
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;mag_tax &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; tx &lt;span style="color:#f92672"&gt;%&amp;gt;%&lt;/span&gt; tibble&lt;span style="color:#f92672"&gt;::&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;rownames_to_column&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;MAG_id&amp;#34;&lt;/span&gt;) &lt;span style="color:#f92672"&gt;%&amp;gt;%&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; dplyr&lt;span style="color:#f92672"&gt;::&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;select&lt;/span&gt;(MAG_id, Family, Phylum) &lt;span style="color:#f92672"&gt;%&amp;gt;%&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; dplyr&lt;span style="color:#f92672"&gt;::&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;filter&lt;/span&gt;(MAG_id &lt;span style="color:#f92672"&gt;%in%&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;rownames&lt;/span&gt;(mag_path_potential))
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;fam_path_potential &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; mag_tax &lt;span style="color:#f92672"&gt;%&amp;gt;%&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; dplyr&lt;span style="color:#f92672"&gt;::&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;select&lt;/span&gt;(MAG_id, Family) &lt;span style="color:#f92672"&gt;%&amp;gt;%&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;left_join&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;as.data.frame&lt;/span&gt;(mag_path_potential) &lt;span style="color:#f92672"&gt;%&amp;gt;%&lt;/span&gt; tibble&lt;span style="color:#f92672"&gt;::&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;rownames_to_column&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;MAG_id&amp;#34;&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; by&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;MAG_id&amp;#34;&lt;/span&gt;) &lt;span style="color:#f92672"&gt;%&amp;gt;%&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;group_by&lt;/span&gt;(Family) &lt;span style="color:#f92672"&gt;%&amp;gt;%&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;summarise&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;across&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;all_of&lt;/span&gt;(fig3_paths), &lt;span style="color:#f92672"&gt;~&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;sum&lt;/span&gt;(.x, na.rm&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;TRUE&lt;/span&gt;)), .groups&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;drop&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Collapse phylogeny to Family&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ps_fam &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;tax_glom&lt;/span&gt;(ps, taxrank&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;Family&amp;#34;&lt;/span&gt;, NArm&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;TRUE&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;fam_vec &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;as.character&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;tax_table&lt;/span&gt;(ps_fam)[, &lt;span style="color:#e6db74"&gt;&amp;#34;Family&amp;#34;&lt;/span&gt;])
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;fam_vec&lt;span style="color:#a6e22e"&gt;[is.na&lt;/span&gt;(fam_vec) &lt;span style="color:#f92672"&gt;|&lt;/span&gt; fam_vec&lt;span style="color:#f92672"&gt;==&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;&amp;#34;&lt;/span&gt;] &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;Unassigned_Family&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;taxa_names&lt;/span&gt;(ps_fam) &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;make.unique&lt;/span&gt;(fam_vec, sep&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;__&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;td &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;as.treedata&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;phy_tree&lt;/span&gt;(ps_fam))
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;tip_map &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;tibble&lt;/span&gt;(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Tip &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;taxa_names&lt;/span&gt;(ps_fam),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Family &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;as.character&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;tax_table&lt;/span&gt;(ps_fam)[,&lt;span style="color:#e6db74"&gt;&amp;#34;Family&amp;#34;&lt;/span&gt;]),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Phylum &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;as.character&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;tax_table&lt;/span&gt;(ps_fam)[,&lt;span style="color:#e6db74"&gt;&amp;#34;Phylum&amp;#34;&lt;/span&gt;])
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;) &lt;span style="color:#f92672"&gt;%&amp;gt;%&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;mutate&lt;/span&gt;(Family &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;if_else&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;is.na&lt;/span&gt;(Family)&lt;span style="color:#f92672"&gt;|&lt;/span&gt;Family&lt;span style="color:#f92672"&gt;==&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;&amp;#34;&lt;/span&gt;,&lt;span style="color:#e6db74"&gt;&amp;#34;Unassigned_Family&amp;#34;&lt;/span&gt;,Family),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Phylum &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;if_else&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;is.na&lt;/span&gt;(Phylum)&lt;span style="color:#f92672"&gt;|&lt;/span&gt;Phylum&lt;span style="color:#f92672"&gt;==&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;&amp;#34;&lt;/span&gt;,&lt;span style="color:#e6db74"&gt;&amp;#34;Other&amp;#34;&lt;/span&gt;,Phylum))
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Build tip × pathway matrix and z-score column-wise&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;heat_mat &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; tip_map &lt;span style="color:#f92672"&gt;%&amp;gt;%&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;left_join&lt;/span&gt;(fam_path_potential, by&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;Family&amp;#34;&lt;/span&gt;) &lt;span style="color:#f92672"&gt;%&amp;gt;%&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;arrange&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;match&lt;/span&gt;(Tip, td&lt;span style="color:#f92672"&gt;@&lt;/span&gt;phylo&lt;span style="color:#f92672"&gt;$&lt;/span&gt;tip.label)) &lt;span style="color:#f92672"&gt;%&amp;gt;%&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; dplyr&lt;span style="color:#f92672"&gt;::&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;select&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;all_of&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;c&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;Tip&amp;#34;&lt;/span&gt;, fig3_paths))) &lt;span style="color:#f92672"&gt;%&amp;gt;%&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; tibble&lt;span style="color:#f92672"&gt;::&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;column_to_rownames&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;Tip&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;safe_z &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;function&lt;/span&gt;(x) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; x&lt;span style="color:#a6e22e"&gt;[is.na&lt;/span&gt;(x)] &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;; s &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;sd&lt;/span&gt;(x, na.rm&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;TRUE&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (&lt;span style="color:#f92672"&gt;!&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;is.finite&lt;/span&gt;(s) &lt;span style="color:#f92672"&gt;||&lt;/span&gt; s&lt;span style="color:#f92672"&gt;==&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;) &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;rep&lt;/span&gt;(&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;length&lt;/span&gt;(x)))
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; (x &lt;span style="color:#f92672"&gt;-&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;mean&lt;/span&gt;(x, na.rm&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;TRUE&lt;/span&gt;)) &lt;span style="color:#f92672"&gt;/&lt;/span&gt; s
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;heat_scaled &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;as.data.frame&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;apply&lt;/span&gt;(heat_mat, &lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;, safe_z))
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;colnames&lt;/span&gt;(heat_scaled) &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;gsub&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;_&amp;#34;&lt;/span&gt;,&lt;span style="color:#e6db74"&gt;&amp;#34; &amp;#34;&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;colnames&lt;/span&gt;(heat_scaled))
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;z_lim &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;max&lt;/span&gt;(&lt;span style="color:#ae81ff"&gt;1.5&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;as.numeric&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;quantile&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;abs&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;unlist&lt;/span&gt;(heat_scaled)), &lt;span style="color:#ae81ff"&gt;0.98&lt;/span&gt;, na.rm&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;TRUE&lt;/span&gt;)))
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="plot-circular-tree--geom_fruit-heatmap-ring"&gt;Plot: circular tree + &lt;code&gt;geom_fruit&lt;/code&gt; heatmap ring&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;geom_fruit&lt;/code&gt; from &lt;code&gt;ggtreeExtra&lt;/code&gt; is used instead of &lt;code&gt;gheatmap&lt;/code&gt; because it handles circular layouts correctly without conflicting with ggplot2&amp;rsquo;s coordinate system. &lt;code&gt;new_scale_fill()&lt;/code&gt; from &lt;code&gt;ggnewscale&lt;/code&gt; separates the Phylum colour scale from the heatmap fill scale.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-r" data-lang="r"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;heat_long &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; heat_scaled &lt;span style="color:#f92672"&gt;%&amp;gt;%&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; tibble&lt;span style="color:#f92672"&gt;::&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;rownames_to_column&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;Tip&amp;#34;&lt;/span&gt;) &lt;span style="color:#f92672"&gt;%&amp;gt;%&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;pivot_longer&lt;/span&gt;(&lt;span style="color:#f92672"&gt;-&lt;/span&gt;Tip, names_to&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;Pathway&amp;#34;&lt;/span&gt;, values_to&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;z_score&amp;#34;&lt;/span&gt;) &lt;span style="color:#f92672"&gt;%&amp;gt;%&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;mutate&lt;/span&gt;(Pathway &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;factor&lt;/span&gt;(Pathway, levels&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;colnames&lt;/span&gt;(heat_scaled)))
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;p_out &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;ggtree&lt;/span&gt;(td, layout&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;circular&amp;#34;&lt;/span&gt;, linewidth&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;0.3&lt;/span&gt;) &lt;span style="color:#f92672"&gt;%&amp;lt;+%&lt;/span&gt; tip_map &lt;span style="color:#f92672"&gt;+&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;geom_tippoint&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;aes&lt;/span&gt;(color&lt;span style="color:#f92672"&gt;=&lt;/span&gt;Phylum), size&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;2.5&lt;/span&gt;, alpha&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;0.95&lt;/span&gt;) &lt;span style="color:#f92672"&gt;+&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;scale_color_manual&lt;/span&gt;(values&lt;span style="color:#f92672"&gt;=&lt;/span&gt;pal_phylum, na.value&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;#BFBFBF&amp;#34;&lt;/span&gt;, name&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;Phylum&amp;#34;&lt;/span&gt;) &lt;span style="color:#f92672"&gt;+&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;geom_tiplab2&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;aes&lt;/span&gt;(label&lt;span style="color:#f92672"&gt;=&lt;/span&gt;Family), size&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;2.7&lt;/span&gt;, offset&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;0.07&lt;/span&gt;) &lt;span style="color:#f92672"&gt;+&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;new_scale_fill&lt;/span&gt;() &lt;span style="color:#f92672"&gt;+&lt;/span&gt; &lt;span style="color:#75715e"&gt;# reset fill scale for heatmap&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;geom_fruit&lt;/span&gt;(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; data &lt;span style="color:#f92672"&gt;=&lt;/span&gt; heat_long,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; geom &lt;span style="color:#f92672"&gt;=&lt;/span&gt; geom_tile,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; mapping &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;aes&lt;/span&gt;(y&lt;span style="color:#f92672"&gt;=&lt;/span&gt;Tip, x&lt;span style="color:#f92672"&gt;=&lt;/span&gt;Pathway, fill&lt;span style="color:#f92672"&gt;=&lt;/span&gt;z_score),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; offset &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0.15&lt;/span&gt;, &lt;span style="color:#75715e"&gt;# gap between tip labels and heatmap ring&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; pwidth &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0.58&lt;/span&gt;, &lt;span style="color:#75715e"&gt;# heatmap ring width relative to tree radius&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; axis.params &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;list&lt;/span&gt;(axis&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;x&amp;#34;&lt;/span&gt;, text.angle&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;45&lt;/span&gt;, text.size&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;3&lt;/span&gt;, hjust&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; grid.params &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;list&lt;/span&gt;(linetype&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;blank&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ) &lt;span style="color:#f92672"&gt;+&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;scale_fill_gradient2&lt;/span&gt;(low&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;#313695&amp;#34;&lt;/span&gt;, mid&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;white&amp;#34;&lt;/span&gt;, high&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;#A50026&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; midpoint&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;, limits&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;c&lt;/span&gt;(&lt;span style="color:#f92672"&gt;-&lt;/span&gt;z_lim, z_lim), oob&lt;span style="color:#f92672"&gt;=&lt;/span&gt;scales&lt;span style="color:#f92672"&gt;::&lt;/span&gt;squish,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; name&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;Pathway enrichment
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;(family z-score)&amp;#34;&lt;/span&gt;) &lt;span style="color:#f92672"&gt;+&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;theme&lt;/span&gt;(legend.position&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;right&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;ggsave&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;Figure4.pdf&amp;#34;&lt;/span&gt;, p_out, width&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;450&lt;/span&gt;, height&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;400&lt;/span&gt;, units&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;mm&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="key-findings-1"&gt;Key findings&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Rhodobacteraceae&lt;/strong&gt;: carbon core z = 7.53, sulfur z = 2.12 — broad multifunctionality; known to dominate responses to phytoplankton exudates in Patagonian fjords &lt;a href="https://consensus.app/papers/details/06f9a7cca1365c0b93ad50285952269e/?utm_source=claude_desktop"&gt;Valdés-Castro et al. 2022&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Flavobacteriaceae&lt;/strong&gt;: B₁₂ z = 7.94, carbon z = 6.64 — organic matter processing specialists; keystone taxa in benthic networks under aquaculture pressure &lt;a href="https://consensus.app/papers/details/b27c6761f1265418a5d8b74f81a2a3a2/?utm_source=claude_desktop"&gt;Zárate et al. 2025&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Thioglobaceae&lt;/strong&gt;: sulfur z = 0.92 — sulfur oxidisers first identified in Comau&amp;rsquo;s chemosynthetic mats &lt;a href="https://consensus.app/papers/details/7e8acad00eb5577c845a2ca66cd1d766/?utm_source=claude_desktop"&gt;Ugalde et al. 2013&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Planctomycetaceae / Pirellulaceae&lt;/strong&gt;: consistently below average across all pathways&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure&gt;
&lt;img src="https://www.castrolab.org/img/comau-walkthrough/Figure4.png" /&gt;
&lt;/figure&gt;
&lt;em&gt;Figure 4. Circular family-level phylogeny with outer heatmap ring showing pathway enrichment z-scores. Tip dots are coloured by Phylum. Red = above-average enrichment; blue = below-average.&lt;/em&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="figure-5--how-are-communities-assembled"&gt;Figure 5 — &lt;em&gt;How&lt;/em&gt; are communities assembled?&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Script:&lt;/strong&gt; &lt;code&gt;Figure5_final.R&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Figures 1–4 describe &lt;em&gt;what&lt;/em&gt; communities look like and &lt;em&gt;why&lt;/em&gt; they vary. Figure 5 addresses the mechanistic question: do communities form by chance, or is there a directional force (competition or filtering) at work? The answer differs strikingly between depths.&lt;/p&gt;
&lt;h3 id="standardised-effect-sizes-ses--the-logic"&gt;Standardised effect sizes (SES) — the logic&lt;/h3&gt;
&lt;p&gt;Raw diversity metrics conflate signal with richness. SES removes this dependence by comparing observed values to a null distribution from permuted communities:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;SES = (observed − mean(null)) / sd(null)
&lt;/code&gt;&lt;/pre&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;SES&lt;/th&gt;
&lt;th&gt;Ecological interpretation&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;&amp;gt; 0&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Community is more diverse than random → &lt;strong&gt;limiting similarity&lt;/strong&gt; / niche partitioning&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;≈ 0&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;No departure from random assembly&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;&amp;lt; 0&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Community is less diverse than random → &lt;strong&gt;habitat filtering&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="panel-a--ses-mpd-phylogenetic-assembly"&gt;Panel A — SES-MPD (phylogenetic assembly)&lt;/h3&gt;
&lt;p&gt;Two null models are used to bracket the result. The &lt;strong&gt;richness&lt;/strong&gt; null preserves per-sample species richness; the &lt;strong&gt;frequency&lt;/strong&gt; null additionally preserves species-level occurrence frequencies across samples. Agreement between both nulls strengthens inference.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-r" data-lang="r"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;source&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;utils.R&amp;#34;&lt;/span&gt;); &lt;span style="color:#a6e22e"&gt;library&lt;/span&gt;(picante); &lt;span style="color:#a6e22e"&gt;library&lt;/span&gt;(parallel)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ps &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;load_ps&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (&lt;span style="color:#f92672"&gt;!&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;exists&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;A_rel_use&amp;#34;&lt;/span&gt;)) { fig3 &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;readRDS&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;fig3_shared_objects.RDS&amp;#34;&lt;/span&gt;); &lt;span style="color:#a6e22e"&gt;list2env&lt;/span&gt;(fig3, envir&lt;span style="color:#f92672"&gt;=&lt;/span&gt;.GlobalEnv) }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;set.seed&lt;/span&gt;(&lt;span style="color:#ae81ff"&gt;123&lt;/span&gt;); runs &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;999&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Community matrix (samples × taxa), relative abundances&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;otu &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;as&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;otu_table&lt;/span&gt;(ps), &lt;span style="color:#e6db74"&gt;&amp;#34;matrix&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;comm_counts &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (&lt;span style="color:#a6e22e"&gt;taxa_are_rows&lt;/span&gt;(ps)) &lt;span style="color:#a6e22e"&gt;t&lt;/span&gt;(otu) &lt;span style="color:#66d9ef"&gt;else&lt;/span&gt; otu
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;comm_rel &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;sweep&lt;/span&gt;(comm_counts, &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;rowSums&lt;/span&gt;(comm_counts), &lt;span style="color:#e6db74"&gt;&amp;#34;/&amp;#34;&lt;/span&gt;); comm_rel&lt;span style="color:#a6e22e"&gt;[is.na&lt;/span&gt;(comm_rel)] &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Rarity filter: drop taxa with prevalence &amp;lt; 2 AND max RA &amp;lt; 1e-4&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;keep_taxa &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;colSums&lt;/span&gt;(comm_rel &lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;) &lt;span style="color:#f92672"&gt;&amp;gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;2&lt;/span&gt; &lt;span style="color:#f92672"&gt;|&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;apply&lt;/span&gt;(comm_rel, &lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;, max) &lt;span style="color:#f92672"&gt;&amp;gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1e-4&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;comm_rel &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; comm_rel[, keep_taxa, drop&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;TRUE&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Align tree and community&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;phy &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;phy_tree&lt;/span&gt;(ps)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;mp &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; picante&lt;span style="color:#f92672"&gt;::&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;match.phylo.comm&lt;/span&gt;(phy, comm_rel)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Dphy &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; ape&lt;span style="color:#f92672"&gt;::&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;cophenetic.phylo&lt;/span&gt;(mp&lt;span style="color:#f92672"&gt;$&lt;/span&gt;phy)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Parallel SES-MPD runner (uses mclapply on Unix; parLapply on Windows)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;run_ses_parallel &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;function&lt;/span&gt;(comm, D, null_model, runs, ncores&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;NA_integer_&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; n &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;nrow&lt;/span&gt;(comm)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; cores &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (&lt;span style="color:#a6e22e"&gt;is.na&lt;/span&gt;(ncores)) &lt;span style="color:#a6e22e"&gt;max&lt;/span&gt;(&lt;span style="color:#ae81ff"&gt;1L&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;min&lt;/span&gt;(parallel&lt;span style="color:#f92672"&gt;::&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;detectCores&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;TRUE&lt;/span&gt;)&lt;span style="color:#ae81ff"&gt;-1L&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;8L&lt;/span&gt;)) &lt;span style="color:#66d9ef"&gt;else&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;as.integer&lt;/span&gt;(ncores)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; blocks &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;split&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;seq_len&lt;/span&gt;(n), &lt;span style="color:#a6e22e"&gt;ceiling&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;seq_along&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;seq_len&lt;/span&gt;(n)) &lt;span style="color:#f92672"&gt;/&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;ceiling&lt;/span&gt;(n&lt;span style="color:#f92672"&gt;/&lt;/span&gt;cores)))
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; run_block &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;function&lt;/span&gt;(idx)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; picante&lt;span style="color:#f92672"&gt;::&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;ses.mpd&lt;/span&gt;(mp&lt;span style="color:#f92672"&gt;$&lt;/span&gt;comm[idx,,drop&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;FALSE&lt;/span&gt;], D, null.model&lt;span style="color:#f92672"&gt;=&lt;/span&gt;null_model,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; runs&lt;span style="color:#f92672"&gt;=&lt;/span&gt;runs, abundance.weighted&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;TRUE&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (.Platform&lt;span style="color:#f92672"&gt;$&lt;/span&gt;OS.type &lt;span style="color:#f92672"&gt;==&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;windows&amp;#34;&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; cl &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; parallel&lt;span style="color:#f92672"&gt;::&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;makeCluster&lt;/span&gt;(cores)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;on.exit&lt;/span&gt;(parallel&lt;span style="color:#f92672"&gt;::&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;stopCluster&lt;/span&gt;(cl), add&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;TRUE&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; parallel&lt;span style="color:#f92672"&gt;::&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;clusterEvalQ&lt;/span&gt;(cl, &lt;span style="color:#a6e22e"&gt;library&lt;/span&gt;(picante))
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; res &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; parallel&lt;span style="color:#f92672"&gt;::&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;parLapply&lt;/span&gt;(cl, blocks, run_block)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; } &lt;span style="color:#66d9ef"&gt;else&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; res &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; parallel&lt;span style="color:#f92672"&gt;::&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;mclapply&lt;/span&gt;(blocks, run_block, mc.cores&lt;span style="color:#f92672"&gt;=&lt;/span&gt;cores)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; dplyr&lt;span style="color:#f92672"&gt;::&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;bind_rows&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;lapply&lt;/span&gt;(res, &lt;span style="color:#66d9ef"&gt;function&lt;/span&gt;(r) { r&lt;span style="color:#f92672"&gt;$&lt;/span&gt;sample &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;rownames&lt;/span&gt;(r); tibble&lt;span style="color:#f92672"&gt;::&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;as_tibble&lt;/span&gt;(r) }))
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;meta_aln &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;as&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;sample_data&lt;/span&gt;(ps), &lt;span style="color:#e6db74"&gt;&amp;#34;data.frame&amp;#34;&lt;/span&gt;) &lt;span style="color:#f92672"&gt;%&amp;gt;%&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; tibble&lt;span style="color:#f92672"&gt;::&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;rownames_to_column&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;sample&amp;#34;&lt;/span&gt;) &lt;span style="color:#f92672"&gt;%&amp;gt;%&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; dplyr&lt;span style="color:#f92672"&gt;::&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;filter&lt;/span&gt;(sample &lt;span style="color:#f92672"&gt;%in%&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;rownames&lt;/span&gt;(mp&lt;span style="color:#f92672"&gt;$&lt;/span&gt;comm)) &lt;span style="color:#f92672"&gt;%&amp;gt;%&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;mutate&lt;/span&gt;(season &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;factor&lt;/span&gt;(season, levels&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;c&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;Summer&amp;#34;&lt;/span&gt;,&lt;span style="color:#e6db74"&gt;&amp;#34;Fall&amp;#34;&lt;/span&gt;,&lt;span style="color:#e6db74"&gt;&amp;#34;Winter&amp;#34;&lt;/span&gt;)),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; depth_m &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;factor&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;as.character&lt;/span&gt;(depth_m), levels&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;c&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;5&amp;#34;&lt;/span&gt;,&lt;span style="color:#e6db74"&gt;&amp;#34;20&amp;#34;&lt;/span&gt;)))
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ses_rich &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;run_ses_parallel&lt;/span&gt;(mp&lt;span style="color:#f92672"&gt;$&lt;/span&gt;comm, Dphy, &lt;span style="color:#e6db74"&gt;&amp;#34;richness&amp;#34;&lt;/span&gt;, runs) &lt;span style="color:#f92672"&gt;%&amp;gt;%&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;left_join&lt;/span&gt;(meta_aln, by&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;sample&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ses_freq &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;run_ses_parallel&lt;/span&gt;(mp&lt;span style="color:#f92672"&gt;$&lt;/span&gt;comm, Dphy, &lt;span style="color:#e6db74"&gt;&amp;#34;frequency&amp;#34;&lt;/span&gt;, runs) &lt;span style="color:#f92672"&gt;%&amp;gt;%&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;left_join&lt;/span&gt;(meta_aln, by&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;sample&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="panel-b--ses-fdis-functional-dispersion"&gt;Panel B — SES-FDis (functional dispersion)&lt;/h3&gt;
&lt;p&gt;FDis is the abundance-weighted mean distance of each organism to the community-weighted centroid in trait space. The trait space is defined by log1p-standardised pathway hit counts across the six Figure 3 pathways. Because there is no standard null for FDis, we implement permutation-based SES directly.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-r" data-lang="r"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Trait matrix: log1p + column-standardise pathway hits&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;fig3_paths &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;unique&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;c&lt;/span&gt;(main_pathways, &lt;span style="color:#e6db74"&gt;&amp;#34;Phototrophy&amp;#34;&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;mag_ids &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;colnames&lt;/span&gt;(H_use)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;avail &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;function&lt;/span&gt;(g) &lt;span style="color:#a6e22e"&gt;intersect&lt;/span&gt;(g, &lt;span style="color:#a6e22e"&gt;rownames&lt;/span&gt;(H_use))
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;mag_path_hits &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;do.call&lt;/span&gt;(cbind, &lt;span style="color:#a6e22e"&gt;lapply&lt;/span&gt;(fig3_paths, &lt;span style="color:#66d9ef"&gt;function&lt;/span&gt;(pw) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; gg &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;avail&lt;/span&gt;(pathway_dict[[pw]])
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (&lt;span style="color:#a6e22e"&gt;length&lt;/span&gt;(gg)&lt;span style="color:#f92672"&gt;==&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;) &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;rep&lt;/span&gt;(&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;length&lt;/span&gt;(mag_ids)))
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;colSums&lt;/span&gt;(H_use[gg,,drop&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;FALSE&lt;/span&gt;], na.rm&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;TRUE&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}))
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;colnames&lt;/span&gt;(mag_path_hits) &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; fig3_paths; &lt;span style="color:#a6e22e"&gt;rownames&lt;/span&gt;(mag_path_hits) &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; mag_ids
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;comm &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; A_rel_use[meta_aln&lt;span style="color:#f92672"&gt;$&lt;/span&gt;sample,, drop&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;FALSE&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;traits_raw &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; mag_path_hits&lt;span style="color:#a6e22e"&gt;[intersect&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;colnames&lt;/span&gt;(comm), &lt;span style="color:#a6e22e"&gt;rownames&lt;/span&gt;(mag_path_hits)),,drop&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;FALSE&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;comm &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; comm[, &lt;span style="color:#a6e22e"&gt;rownames&lt;/span&gt;(traits_raw), drop&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;FALSE&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;traits_use &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;scale&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;log1p&lt;/span&gt;(traits_raw)); traits_use&lt;span style="color:#a6e22e"&gt;[is.na&lt;/span&gt;(traits_use)] &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;traits_use &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; traits_use[, &lt;span style="color:#a6e22e"&gt;apply&lt;/span&gt;(traits_use,&lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;,sd)&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;, drop&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;FALSE&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Fast abundance-weighted FDis&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;fast_fdis &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;function&lt;/span&gt;(comm, traits) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; W &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; comm &lt;span style="color:#f92672"&gt;/&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;rowSums&lt;/span&gt;(comm); T &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;as.matrix&lt;/span&gt;(traits); C &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; W &lt;span style="color:#f92672"&gt;%*%&lt;/span&gt; T
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;vapply&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;seq_len&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;nrow&lt;/span&gt;(W)), &lt;span style="color:#66d9ef"&gt;function&lt;/span&gt;(s) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; cs &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;as.numeric&lt;/span&gt;(C[s,]); dev &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;sweep&lt;/span&gt;(T,&lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;,cs,&lt;span style="color:#e6db74"&gt;&amp;#34;-&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;sum&lt;/span&gt;(W[s,] &lt;span style="color:#f92672"&gt;*&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;sqrt&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;rowSums&lt;/span&gt;(dev^2)))
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }, &lt;span style="color:#a6e22e"&gt;numeric&lt;/span&gt;(&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Fobs &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;fast_fdis&lt;/span&gt;(comm, traits_use)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Fnull &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;replicate&lt;/span&gt;(&lt;span style="color:#ae81ff"&gt;999&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;fast_fdis&lt;/span&gt;(comm, traits_use&lt;span style="color:#a6e22e"&gt;[sample&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;nrow&lt;/span&gt;(traits_use)),,drop&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;FALSE&lt;/span&gt;]))
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;SES_FDis &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; (Fobs &lt;span style="color:#f92672"&gt;-&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;rowMeans&lt;/span&gt;(Fnull)) &lt;span style="color:#f92672"&gt;/&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;apply&lt;/span&gt;(Fnull,&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;,sd)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;dfC &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;tibble&lt;/span&gt;(sample&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;rownames&lt;/span&gt;(comm), SES_FDis&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;as.numeric&lt;/span&gt;(SES_FDis)) &lt;span style="color:#f92672"&gt;%&amp;gt;%&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;left_join&lt;/span&gt;(meta_aln, by&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;sample&amp;#34;&lt;/span&gt;) &lt;span style="color:#f92672"&gt;%&amp;gt;%&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;filter&lt;/span&gt;(&lt;span style="color:#f92672"&gt;!&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;is.na&lt;/span&gt;(season), &lt;span style="color:#f92672"&gt;!&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;is.na&lt;/span&gt;(depth_m), &lt;span style="color:#a6e22e"&gt;is.finite&lt;/span&gt;(SES_FDis))
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="panel-c--ses-cwsd-per-pathway-functional-dispersion"&gt;Panel C — SES-CWSD (per-pathway functional dispersion)&lt;/h3&gt;
&lt;p&gt;SES-CWSD extends FDis to each trait axis individually, showing which specific pathways are over- or under-dispersed within communities.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-r" data-lang="r"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# CWSD: per-trait standard deviation weighted by abundance&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;C_obs &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; (comm &lt;span style="color:#f92672"&gt;/&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;rowSums&lt;/span&gt;(comm)) &lt;span style="color:#f92672"&gt;%*%&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;as.matrix&lt;/span&gt;(traits_use)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;CWSD_obs &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;t&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;vapply&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;seq_len&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;nrow&lt;/span&gt;(comm)), &lt;span style="color:#66d9ef"&gt;function&lt;/span&gt;(s) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; cs &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;as.numeric&lt;/span&gt;(C_obs[s,]); W &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; comm[s,] &lt;span style="color:#f92672"&gt;/&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;sum&lt;/span&gt;(comm[s,])
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; dev &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;sweep&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;as.matrix&lt;/span&gt;(traits_use), &lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;, cs, &lt;span style="color:#e6db74"&gt;&amp;#34;-&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;sqrt&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;colSums&lt;/span&gt;(W &lt;span style="color:#f92672"&gt;*&lt;/span&gt; (dev^2)))
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}, &lt;span style="color:#a6e22e"&gt;numeric&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;ncol&lt;/span&gt;(traits_use))))
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;rownames&lt;/span&gt;(CWSD_obs) &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;rownames&lt;/span&gt;(comm)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Null: permute MAG trait labels 999 times (frequency null)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;set.seed&lt;/span&gt;(&lt;span style="color:#ae81ff"&gt;123&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;null_cwsd &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;replicate&lt;/span&gt;(&lt;span style="color:#ae81ff"&gt;999&lt;/span&gt;, {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; T_perm &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;as.matrix&lt;/span&gt;(traits_use)&lt;span style="color:#a6e22e"&gt;[sample&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;nrow&lt;/span&gt;(traits_use)),,drop&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;FALSE&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; C_p &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; (comm &lt;span style="color:#f92672"&gt;/&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;rowSums&lt;/span&gt;(comm)) &lt;span style="color:#f92672"&gt;%*%&lt;/span&gt; T_perm
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;t&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;vapply&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;seq_len&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;nrow&lt;/span&gt;(comm)), &lt;span style="color:#66d9ef"&gt;function&lt;/span&gt;(s) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; cs &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;as.numeric&lt;/span&gt;(C_p[s,]); W &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; comm[s,] &lt;span style="color:#f92672"&gt;/&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;sum&lt;/span&gt;(comm[s,])
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; dev &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;sweep&lt;/span&gt;(T_perm, &lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;, cs, &lt;span style="color:#e6db74"&gt;&amp;#34;-&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;sqrt&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;colSums&lt;/span&gt;(W &lt;span style="color:#f92672"&gt;*&lt;/span&gt; (dev^2)))
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }, &lt;span style="color:#a6e22e"&gt;numeric&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;ncol&lt;/span&gt;(traits_use))))
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}, simplify&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;array&amp;#34;&lt;/span&gt;) &lt;span style="color:#75715e"&gt;# samples × traits × 999&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;mu_null &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;apply&lt;/span&gt;(null_cwsd, &lt;span style="color:#a6e22e"&gt;c&lt;/span&gt;(&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;,&lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;), mean)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sd_null &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;apply&lt;/span&gt;(null_cwsd, &lt;span style="color:#a6e22e"&gt;c&lt;/span&gt;(&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;,&lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;), sd); sd_null[sd_null&lt;span style="color:#f92672"&gt;==&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;] &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;SES_CWSD &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; (CWSD_obs &lt;span style="color:#f92672"&gt;-&lt;/span&gt; mu_null) &lt;span style="color:#f92672"&gt;/&lt;/span&gt; sd_null
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;dfD &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;as.data.frame&lt;/span&gt;(SES_CWSD) &lt;span style="color:#f92672"&gt;%&amp;gt;%&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; tibble&lt;span style="color:#f92672"&gt;::&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;rownames_to_column&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;sample&amp;#34;&lt;/span&gt;) &lt;span style="color:#f92672"&gt;%&amp;gt;%&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;pivot_longer&lt;/span&gt;(&lt;span style="color:#f92672"&gt;-&lt;/span&gt;sample, names_to&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;trait&amp;#34;&lt;/span&gt;, values_to&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;SES_CWSD&amp;#34;&lt;/span&gt;) &lt;span style="color:#f92672"&gt;%&amp;gt;%&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;left_join&lt;/span&gt;(meta_aln, by&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;sample&amp;#34;&lt;/span&gt;) &lt;span style="color:#f92672"&gt;%&amp;gt;%&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;filter&lt;/span&gt;(&lt;span style="color:#f92672"&gt;!&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;is.na&lt;/span&gt;(season), &lt;span style="color:#f92672"&gt;!&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;is.na&lt;/span&gt;(depth_m), &lt;span style="color:#a6e22e"&gt;is.finite&lt;/span&gt;(SES_CWSD))
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="assembly-and-export-2"&gt;Assembly and export&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-r" data-lang="r"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;library&lt;/span&gt;(patchwork)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;fig5 &lt;span style="color:#f92672"&gt;&amp;lt;-&lt;/span&gt; (p_freq &lt;span style="color:#f92672"&gt;+&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;labs&lt;/span&gt;(title&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;NULL&lt;/span&gt;)) &lt;span style="color:#f92672"&gt;+&lt;/span&gt; &lt;span style="color:#75715e"&gt;# Panel A: SES-MPD (frequency null)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; (p_4C &lt;span style="color:#f92672"&gt;+&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;labs&lt;/span&gt;(title&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;NULL&lt;/span&gt;)) &lt;span style="color:#f92672"&gt;+&lt;/span&gt; &lt;span style="color:#75715e"&gt;# Panel B: SES-FDis&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; (p_4D &lt;span style="color:#f92672"&gt;+&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;labs&lt;/span&gt;(title&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;NULL&lt;/span&gt;)) &lt;span style="color:#f92672"&gt;+&lt;/span&gt; &lt;span style="color:#75715e"&gt;# Panel C: SES-CWSD per pathway&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;plot_layout&lt;/span&gt;(design&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;AB
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;CC&amp;#34;&lt;/span&gt;, guides&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;collect&amp;#34;&lt;/span&gt;) &lt;span style="color:#f92672"&gt;&amp;amp;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;theme&lt;/span&gt;(legend.position&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;bottom&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;ggsave&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;Figure5.pdf&amp;#34;&lt;/span&gt;, fig5, width&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;180&lt;/span&gt;, height&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;160&lt;/span&gt;, units&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;mm&amp;#34;&lt;/span&gt;, device&lt;span style="color:#f92672"&gt;=&lt;/span&gt;cairo_pdf)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="key-findings-2"&gt;Key findings&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;5 m, Summer and Winter&lt;/strong&gt;: SES-MPD ≈ +4 to +6, SES-FDis &amp;gt; +1.5 → &lt;strong&gt;limiting similarity&lt;/strong&gt; dominates at the surface&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;20 m, Winter&lt;/strong&gt;: SES-MPD &amp;lt; −5 → strong &lt;strong&gt;habitat filtering&lt;/strong&gt; at depth&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Phototrophy at 5 m (Summer/Fall)&lt;/strong&gt;: SES-CWSD &amp;gt; +2 → many phylogenetically distant lineages share phototrophic potential, consistent with competition for light&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This depth-dependent contrast in assembly mechanisms is consistent with long-term time-series evidence that surface and near-seafloor communities show the strongest seasonal signals while intermediate depths are more temporally stable &lt;a href="https://consensus.app/papers/details/2399f60ab4ab59888e0584bbe99ab54e/?utm_source=claude_desktop"&gt;Cram et al. 2014&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;figure&gt;
&lt;img src="https://www.castrolab.org/img/comau-walkthrough/Figure5.png" /&gt;
&lt;/figure&gt;
&lt;em&gt;Figure 5. (A) SES-MPD (phylogenetic structure). (B) SES-FDis (functional dispersion). (C) SES-CWSD per pathway. Values &amp;gt; 0 = overdispersion (limiting similarity); values &amp;lt; 0 = clustering (habitat filtering).&lt;/em&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="anthropogenic-context-and-conservation-relevance"&gt;Anthropogenic context and conservation relevance&lt;/h2&gt;
&lt;p&gt;The microbial dynamics documented here are embedded in a system under three overlapping pressures:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;1. Salmon aquaculture&lt;/strong&gt; — nutrient loading, salmon feed DOM, and antibiotic use alter bacterioplankton composition and function &lt;a href="https://consensus.app/papers/details/339430a7c9ff5de295998d86913c9108/?utm_source=claude_desktop"&gt;Olsen et al. 2017&lt;/a&gt;; &lt;a href="https://consensus.app/papers/details/7e77446cd68f52dea081cdfaeb6ed91e/?utm_source=claude_desktop"&gt;Montero et al. 2022&lt;/a&gt;. Communities already carry elevated ARGs &lt;a href="https://consensus.app/papers/details/f7e862b4e7a954f78bd9d44a39e9d74f/?utm_source=claude_desktop"&gt;Guajardo-Leiva et al. 2023&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2. Harmful algal blooms&lt;/strong&gt; — the same seasonal forcing driving natural community dynamics can trigger catastrophic events under anomalous atmospheric conditions, as documented by the 2021 &lt;em&gt;Heterosigma akashiwo&lt;/em&gt; bloom that killed ~6,000 tonnes of farmed salmon &lt;a href="https://consensus.app/papers/details/03ecb7a1d54052c5bc8803d0d39a84c5/?utm_source=claude_desktop"&gt;Díaz et al. 2022&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;3. Climate change&lt;/strong&gt; — rising surface temperatures threaten to reduce microbial diversity by eliminating key taxa (Flavobacteriaceae, Rhodobacteraceae, Cenarchaeaceae) central to organic matter cycling &lt;a href="https://consensus.app/papers/details/c1c546dcfc6a5c26a3a11a7a399877bb/?utm_source=claude_desktop"&gt;Gutiérrez et al. 2018&lt;/a&gt;. Reduced glacier melt would lower silicon supply, potentially shifting phytoplankton communities from diatoms toward non-silicified taxa with downstream bacterioplankton effects &lt;a href="https://consensus.app/papers/details/3a75f222614a5089a8b0f429f911442e/?utm_source=claude_desktop"&gt;Olsen et al. 2014&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The baseline community dynamics described here provide the reference state against which all of these perturbations can be evaluated.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="adapting-this-workflow-to-your-own-data"&gt;Adapting this workflow to your own data&lt;/h2&gt;
&lt;p&gt;The core pipeline is general to any MAG or OTU-based metagenomics study:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;What to change&lt;/th&gt;
&lt;th&gt;Where&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Point &lt;code&gt;load_ps()&lt;/code&gt; to your phyloseq object&lt;/td&gt;
&lt;td&gt;&lt;code&gt;utils.R&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Update &lt;code&gt;pal_phylum&lt;/code&gt; with your phyla&lt;/td&gt;
&lt;td&gt;&lt;code&gt;utils.R&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Replace the gene hit matrix&lt;/td&gt;
&lt;td&gt;&lt;code&gt;gene_bin_mat.collapsed.v6.csv&lt;/code&gt; — column names must match MAG IDs in the phyloseq object&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Update sentinel gene lists&lt;/td&gt;
&lt;td&gt;&lt;code&gt;pathway_dict&lt;/code&gt; in &lt;code&gt;Figure3_final.R&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Change season boundaries (Northern Hemisphere)&lt;/td&gt;
&lt;td&gt;&lt;code&gt;get_season_sh&lt;/code&gt; in &lt;code&gt;utils.R&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Use a different gradient axis instead of depth&lt;/td&gt;
&lt;td&gt;Replace &lt;code&gt;depth_m&lt;/code&gt; throughout — any two-level environmental factor works&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id="references"&gt;References&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://consensus.app/papers/details/f7e862b4e7a954f78bd9d44a39e9d74f/?utm_source=claude_desktop"&gt;A First Insight into the Microbial and Viral Communities of Comau Fjord&lt;/a&gt; — Guajardo-Leiva et al., 2023, &lt;em&gt;Microorganisms&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://consensus.app/papers/details/cbfdcfaa837a5ca3960edb5d2ea9b38a/?utm_source=claude_desktop"&gt;Spatially and Temporally Explicit Metagenomes and MAGs from the Comau Fjord&lt;/a&gt; — Castro-Nallar et al., 2023, &lt;em&gt;Microbiology Resource Announcements&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://consensus.app/papers/details/7e8acad00eb5577c845a2ca66cd1d766/?utm_source=claude_desktop"&gt;Microbial Life in a Fjord: Metagenomic Analysis of a Microbial Mat&lt;/a&gt; — Ugalde et al., 2013, &lt;em&gt;PLoS ONE&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://consensus.app/papers/details/339430a7c9ff5de295998d86913c9108/?utm_source=claude_desktop"&gt;Responses in bacterial community structure to waste nutrients from aquaculture&lt;/a&gt; — Olsen et al., 2017, &lt;em&gt;Aquaculture Environment Interactions&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://consensus.app/papers/details/3a75f222614a5089a8b0f429f911442e/?utm_source=claude_desktop"&gt;Responses in the microbial food web to increased rates of nutrient supply&lt;/a&gt; — Olsen et al., 2014, &lt;em&gt;Aquaculture Environment Interactions&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://consensus.app/papers/details/7e77446cd68f52dea081cdfaeb6ed91e/?utm_source=claude_desktop"&gt;The Effect of Salmon Food-Derived DOM and Glacial Melting on Bacterioplankton&lt;/a&gt; — Montero et al., 2022, &lt;em&gt;Frontiers in Microbiology&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://consensus.app/papers/details/b27c6761f1265418a5d8b74f81a2a3a2/?utm_source=claude_desktop"&gt;Capturing the spatial structure of the benthic microbiome under aquaculture&lt;/a&gt; — Zárate et al., 2025, &lt;em&gt;BMC Microbiology&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://consensus.app/papers/details/03ecb7a1d54052c5bc8803d0d39a84c5/?utm_source=claude_desktop"&gt;The impact of local and climate change drivers on HAB formation in a Patagonian fjord&lt;/a&gt; — Díaz et al., 2022, &lt;em&gt;Science of the Total Environment&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://consensus.app/papers/details/c1c546dcfc6a5c26a3a11a7a399877bb/?utm_source=claude_desktop"&gt;Linking Seasonal Reduction of Microbial Diversity to Winter Temperature&lt;/a&gt; — Gutiérrez et al., 2018, &lt;em&gt;Frontiers in Marine Science&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://consensus.app/papers/details/bc749bd6dd9756dcb444599c4ca13b2f/?utm_source=claude_desktop"&gt;Influence of Estuarine Water on the Microbial Community Structure of Patagonian Fjords&lt;/a&gt; — Tamayo-Leiva et al., 2021&lt;/p&gt;
&lt;p&gt;&lt;a href="https://consensus.app/papers/details/e6f4b7e9d4535a26aeaa49b2b8ddf54e/?utm_source=claude_desktop"&gt;Seasonal variability of primary production in a Patagonian fjord&lt;/a&gt; — Montero et al., 2011, &lt;em&gt;Continental Shelf Research&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://consensus.app/papers/details/06f9a7cca1365c0b93ad50285952269e/?utm_source=claude_desktop"&gt;Assessment of Microbial Community Composition Changes with Phytoplankton-Derived Exudates&lt;/a&gt; — Valdés-Castro et al., 2022, &lt;em&gt;Diversity&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://consensus.app/papers/details/23f24763557b5ea29efac6fa0cf069d0/?utm_source=claude_desktop"&gt;Seasonal and diel variations in zooplankton in Comau Fjord&lt;/a&gt; — Garcia-Herrera et al., 2022, &lt;em&gt;PeerJ&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://consensus.app/papers/details/5aa3cfc863bf5c3eb79b82ed0d08fc3b/?utm_source=claude_desktop"&gt;Depth-Dependent Diversity Patterns in Comau Fjord&lt;/a&gt; — Villalobos et al., 2021&lt;/p&gt;
&lt;p&gt;&lt;a href="https://consensus.app/papers/details/768d4425db7757088e9556ccae323dba/?utm_source=claude_desktop"&gt;Exploring the Diversity and Antimicrobial Potential of Marine Actinobacteria from Comau Fjord&lt;/a&gt; — Undabarrena et al., 2016, &lt;em&gt;Frontiers in Microbiology&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://consensus.app/papers/details/2399f60ab4ab59888e0584bbe99ab54e/?utm_source=claude_desktop"&gt;Seasonal and interannual variability of marine bacterioplankton throughout the water column&lt;/a&gt; — Cram et al., 2014, &lt;em&gt;The ISME Journal&lt;/em&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="session-info"&gt;Session info&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-r" data-lang="r"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sessioninfo&lt;span style="color:#f92672"&gt;::&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;session_info&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Save this output alongside your figures. Bioconductor packages (&lt;code&gt;phyloseq&lt;/code&gt;, &lt;code&gt;ggtree&lt;/code&gt;, &lt;code&gt;ggtreeExtra&lt;/code&gt;) evolve rapidly and version mismatches are the most common source of non-reproducibility.&lt;/p&gt;</description></item></channel></rss>