5: Environmental Correlations and Species Associations
| Type | Name | Link |
|---|---|---|
| Slides | Correlation lecture slides | 💾 BCB743_06_correlations.pdf |
| Data | The Doubs River data | 💾 Doubs.RData |
- correlations among environmental variables as joint expressions of a river gradient
- reading a correlation matrix, and visualising it as a heatmap
- collinearity, and why it constrains later regression and ordination
- Pearson against Spearman when variables are skewed
- species associations as co-occurrence structure, measured with the Jaccard index
You met correlation as an inferential tool in BCB744, Chapter 9, where a single coefficient summarised the association between one pair of variables at a time. Here I revisit the idea with environmental data and many variables at once. A correlation matrix for a river system is interpreted as an analysis of how one spatial gradient structures the whole dataset, and this is what later ordination and constrained methods build on.
Set-Up the Analysis Environment
The Doubs River Data
David Zelený describes the background to the data on his excellent website, and further information is presented in the book Numerical Ecology with R by Borcard et al. (2011). These data are a beautiful example of how gradients structure biodiversity. It will be in your own interest to fully understand how the various environmental factors used as explanatory variables vary along a riverine gradient from the source to the terminus of the river.
The environmental table env holds 30 sites (rows) and 11 measured variables (columns). Reading the correlation matrix later is much easier once the variable codes are familiar, so I set them out here:
| Code | Variable | Units |
|---|---|---|
dfs |
distance from source | km |
ele |
elevation | m a.s.l. |
slo |
channel slope | ‰ |
dis |
mean minimum discharge | m³ s⁻¹ |
pH |
water pH | (dimensionless) |
har |
total hardness (calcium) | mg L⁻¹ |
pho |
phosphate | mg L⁻¹ |
nit |
nitrate | mg L⁻¹ |
amm |
ammonium | mg L⁻¹ |
oxy |
dissolved oxygen | mg L⁻¹ |
bod |
biological oxygen demand | mg L⁻¹ |
dfs ele slo dis pH har pho nit amm oxy bod
1 0.3 934 48.0 0.84 7.9 45 0.01 0.20 0.00 12.2 2.7
2 2.2 932 3.0 1.00 8.0 40 0.02 0.20 0.10 10.3 1.9
3 10.2 914 3.7 1.80 8.3 52 0.05 0.22 0.05 10.5 3.5
4 18.5 854 3.2 2.53 8.0 72 0.10 0.21 0.00 11.0 1.3
5 21.5 849 2.3 2.64 8.1 84 0.38 0.52 0.20 8.0 6.2
Correlations Between Environmental Variables
Correlation refers to the statistical association between two continuous variables. It measures the extent to which changes in one variable correspond to changes in another, but it is silent on causation by itself. Correlations range from -1 to +1, with -1 a perfect negative correlation, +1 a perfect positive correlation, and 0 no correlation. A positive correlation means that as one variable increases the other also increases; a negative correlation means that as one increases the other decreases. The most common method is the Pearson correlation coefficient, with rank-based alternatives for ordinal variables or monotonic but non-linear patterns. The mechanics of choosing and testing a single coefficient are covered in BCB744, Chapter 9; here I use those tools on a whole environmental table.
In a system such as the Doubs River, correlations among environmental variables are not a collection of independent pairwise relationships. Many of them are joint expressions of a single, spatially ordered gradient that extends from the headwaters to the river mouth. Elevation, distance from source, slope, nutrient concentrations, oxygen availability, and organic load are structurally linked through longitudinal transport, cumulative catchment effects, and the downstream integration of physical and biogeochemical processes. Strong correlations here often reflect the coherence of the riverine gradient rather than discrete ecological links between variable pairs. Recognising this takes interpretation from isolated variable-to-variable associations towards an integrative understanding of how multivariate environmental structure follows from spatial ordering along the river continuum.
- One spatial gradient (source to mouth) orders most of the variables.
- Variables that track that gradient become mutually correlated as a by-product.
- A strong correlation is therefore often evidence of shared gradient position, not of a direct link between the two variables.
I do not need to standardise the variables, as one would for Euclidean distances, although in some instances a transformation might be needed:
dfs ele slo dis pH har pho nit amm oxy bod
dfs 1.00 -0.94 -0.38 0.95 0.01 0.70 0.48 0.75 0.41 -0.51 0.39
ele -0.94 1.00 0.44 -0.87 -0.04 -0.74 -0.44 -0.76 -0.38 0.36 -0.34
slo -0.38 0.44 1.00 -0.34 -0.22 -0.53 -0.19 -0.31 -0.17 0.31 -0.18
dis 0.95 -0.87 -0.34 1.00 0.02 0.70 0.39 0.61 0.29 -0.36 0.25
pH 0.01 -0.04 -0.22 0.02 1.00 0.09 -0.08 -0.05 -0.12 0.18 -0.15
har 0.70 -0.74 -0.53 0.70 0.09 1.00 0.36 0.51 0.29 -0.38 0.34
pho 0.48 -0.44 -0.19 0.39 -0.08 0.36 1.00 0.80 0.97 -0.72 0.89
nit 0.75 -0.76 -0.31 0.61 -0.05 0.51 0.80 1.00 0.80 -0.63 0.64
amm 0.41 -0.38 -0.17 0.29 -0.12 0.29 0.97 0.80 1.00 -0.72 0.89
oxy -0.51 0.36 0.31 -0.36 0.18 -0.38 -0.72 -0.63 -0.72 1.00 -0.84
bod 0.39 -0.34 -0.18 0.25 -0.15 0.34 0.89 0.64 0.89 -0.84 1.00
Visualise the Matrix
An \(11 \times 11\) table of numbers is hard to scan. The same information becomes legible at a glance as a heatmap, where colour encodes the sign and saturation encodes the strength of each correlation (Figure 1).
Code
Reading the Matrix
A matrix is only useful once you can read it. Four of the strongest entries are worth walking through, since each one traces back to the river gradient rather than to a private relationship between the two variables.
-
dfsanddis= 0.95. Distance from source and discharge rise together: the further down the river, the more water the channel carries as tributaries accumulate. -
dfsandele= -0.94. Elevation falls as distance from source increases. The river loses height as it runs downstream, so the two are almost mirror images. -
phoandamm= 0.97. Phosphate and ammonium track each other closely, consistent with nutrients accumulating together in the lower, more enriched reaches. -
oxyandbod= -0.84. Dissolved oxygen falls as biological oxygen demand rises, consistent with oxygen being consumed as organic load increases downstream.
None of these four pairs needs a direct causal link to explain the correlation. Each variable changes monotonically along the river, so any two of them appear correlated simply because both are ordered by position. The same logic explains the block of mutually correlated nutrient variables (pho, nit, amm, bod) in the top-left of Figure 1: they rise together downstream, and so they rise together in the matrix.
Collinearity
Because these variables are jointly structured by an altitudinal (or some other geographical) gradient, high pairwise correlations also signal substantial collinearity within the environmental dataset, and this has consequences for later analyses. When strongly correlated predictors are treated as independent covariates, as in multiple regression or constrained ordination, their shared variance is hard to disentangle, parameter estimates become unstable, and an apparent effect may reflect gradient position rather than a distinct environmental influence. Understood this way, the correlation matrix is a diagnostic view of the multivariate redundancy that spatial ordering imposes. Spotting that redundancy early shapes decisions about variable selection, dimensional reduction, and whether a modelling framework that assumes near-independent predictors is appropriate at all.
- Strongly correlated predictors share variance.
- That shared variance cannot be split cleanly between them.
- Regression and constrained-ordination coefficients become unstable.
- Dimensional reduction (such as PCA) or variable selection is often preferable.
The same redundancy is treated in detail in BCB744, Chapter 16, and its effect on fitted coefficients is shown in BCB744, Chapter 14. It returns in this course when I reach constrained ordination, where variance inflation factors (VIF) are used to flag and prune collinear predictors.
Pearson or Spearman?
Pearson correlation is used above for convenience and familiarity, but it describes linear association on the original measurement scale and can be strongly affected by skew and leverage. The coefficient itself does not require a distributional assumption as a descriptor; those assumptions matter when formal tests and confidence intervals are attached to it. Phosphate, ammonium, and biological oxygen demand are right-skewed, with most sites at low values and a few enriched downstream sites having large ones (Figure 2). Slope is the most extreme case, dropping from steep headwater reaches to a near-flat lower river.
Code
Under skew, Pearson’s r mixes the strength of an association with the leverage of a few extreme sites. A rank-based alternative, namely Spearman’s \(\rho\), changes the question by measuring the relative ordering of values rather than their magnitudes. Comparing the two is a useful diagnostic as it shows whether a relationship is affected by a monotonic trend along the gradient or by a handful of influential observations. Slope against discharge makes the contrast concrete.
Code
Pearson's product-moment correlation
data: env$slo and env$dis
t = -1.9398, df = 28, p-value = 0.06254
alternative hypothesis: true correlation is not equal to 0
95 percent confidence interval:
-0.62673732 0.01836381
sample estimates:
cor
-0.3441825
Spearman's rank correlation rho
data: env$slo and env$dis
S = 8195.6, p-value = 2.325e-08
alternative hypothesis: true rho is not equal to 0
sample estimates:
rho
-0.8232723
Pearson reports a weak relationship (\(r \approx -0.34\)), while Spearman reports a strong one (\(\rho \approx -0.82\)). The two disagree because steep slopes occur only in the upper river where discharge is low, so the ranks line up almost perfectly even though the raw spacing does not: the handful of very steep headwater sites flattens the Pearson estimate. The reverse pattern appears for pho and amm, where Pearson (0.97) sits well above Spearman (0.72); there the near-perfect Pearson value is partly the leverage of a few high-nutrient downstream sites. The worked Spearman example in BCB744, Chapter 9 follows the same thinking on a single variable pair.
- Pearson measures linear co-variation and is pulled by extreme values.
- Spearman measures monotonic co-variation on ranks and resists skew.
- A large gap between the two flags a relationship carried either by a few influential sites or by a monotonic pattern that is not straight.
Stating the choice of coefficient in these terms turns the analysis into a considered approach where the shape of the data informs the statistical tool applied to it.
Statistical Significance
The matrix can also be returned with p-values attached, to establish which correlations are statistically distinguishable from zero:
dfs ele slo dis pH har pho nit amm oxy bod
dfs 1.00 -0.94 -0.38 0.95 0.01 0.70 0.48 0.75 0.41 -0.51 0.39
ele -0.94 1.00 0.44 -0.87 -0.04 -0.74 -0.44 -0.76 -0.38 0.36 -0.34
slo -0.38 0.44 1.00 -0.34 -0.22 -0.53 -0.19 -0.31 -0.17 0.31 -0.18
dis 0.95 -0.87 -0.34 1.00 0.02 0.70 0.39 0.61 0.29 -0.36 0.25
pH 0.01 -0.04 -0.22 0.02 1.00 0.09 -0.08 -0.05 -0.12 0.18 -0.15
har 0.70 -0.74 -0.53 0.70 0.09 1.00 0.36 0.51 0.29 -0.38 0.34
pho 0.48 -0.44 -0.19 0.39 -0.08 0.36 1.00 0.80 0.97 -0.72 0.89
nit 0.75 -0.76 -0.31 0.61 -0.05 0.51 0.80 1.00 0.80 -0.63 0.64
amm 0.41 -0.38 -0.17 0.29 -0.12 0.29 0.97 0.80 1.00 -0.72 0.89
oxy -0.51 0.36 0.31 -0.36 0.18 -0.38 -0.72 -0.63 -0.72 1.00 -0.84
bod 0.39 -0.34 -0.18 0.25 -0.15 0.34 0.89 0.64 0.89 -0.84 1.00
n= 30
P
dfs ele slo dis pH har pho nit amm oxy
dfs 0.0000 0.0365 0.0000 0.9771 0.0000 0.0076 0.0000 0.0251 0.0040
ele 0.0000 0.0146 0.0000 0.8447 0.0000 0.0144 0.0000 0.0376 0.0493
slo 0.0365 0.0146 0.0625 0.2362 0.0028 0.3067 0.0997 0.3593 0.1006
dis 0.0000 0.0000 0.0625 0.9147 0.0000 0.0355 0.0004 0.1136 0.0522
pH 0.9771 0.8447 0.2362 0.9147 0.6405 0.6619 0.7976 0.5134 0.3494
har 0.0000 0.0000 0.0028 0.0000 0.6405 0.0481 0.0039 0.1191 0.0370
pho 0.0076 0.0144 0.3067 0.0355 0.6619 0.0481 0.0000 0.0000 0.0000
nit 0.0000 0.0000 0.0997 0.0004 0.7976 0.0039 0.0000 0.0000 0.0002
amm 0.0251 0.0376 0.3593 0.1136 0.5134 0.1191 0.0000 0.0000 0.0000
oxy 0.0040 0.0493 0.1006 0.0522 0.3494 0.0370 0.0000 0.0002 0.0000
bod 0.0309 0.0677 0.3546 0.1770 0.4232 0.0619 0.0000 0.0001 0.0000 0.0000
bod
dfs 0.0309
ele 0.0677
slo 0.3546
dis 0.1770
pH 0.4232
har 0.0619
pho 0.0000
nit 0.0001
amm 0.0000
oxy 0.0000
bod
Treat a small p-value here as a sign that a pattern is consistent across the 30 sites, not as proof of a separable mechanism linking the two variables. The reason for that caution is set out below, and it becomes important once these variables are subject to ordination or regression.
The p-values reported for these correlations must be used carefully. With 30 sites arranged along a strongly ordered riverine gradient, the assumption of independent observations that underpins classical significance testing is only weakly met. Many of these variables co-vary not because of distinct pairwise relationships, but because they are jointly structured by position along the continuum. Small p-values then arise as a by-product of gradient coherence rather than as evidence for separable or mechanistic links.
Read this way, the p-value works mainly as a descriptive indicator of consistency across sites, not as a hypothesis test in the conventional sense (H0: there is no statistically significant relationship among a variable pair along the length of the Doubs River). Treating it as a yes/no marker for “significant” against “non-significant” can hide the very multivariate dependence that motivates the analysis, and it encourages interpretive habits that mislead once these variables enter ordination or regression-based frameworks. The same non-independence problem, set out generally, appears in BCB744, Chapter 9.
Associations Between Species
Species association is used here in a strictly statistical sense, to denote patterns of joint occurrence across sampling sites. An association describes whether two species tend to be recorded at the same sites more or less often than expected from their individual distributions, without implying any underlying ecological mechanism.
Such patterns may arise from shared responses to environmental gradients, similar habitat tolerances, or the spatial structuring of sites, as much as from direct biological interactions. The methods used here, based on dissimilarity measures such as the Jaccard index, operate only on presence-absence or abundance patterns, and so they are agnostic to the processes that generate those patterns.
An association matrix summarises co-occurrence structure but does not establish interaction, dependency, or ecological coupling between species. Two species may co-occur because they share a habitat preference, not because either responds to the other.
A Worked Jaccard Example
Before computing an association matrix for the fish, it helps to see how the Jaccard index turns co-occurrence into a number. Consider two species recorded across five sites, where 1 marks presence and 0 marks absence:
| Site | Species A | Species B |
|---|---|---|
| 1 | 1 | 1 |
| 2 | 1 | 0 |
| 3 | 1 | 1 |
| 4 | 0 | 1 |
| 5 | 0 | 0 |
Three quantities summarise the pair: the sites where both occur (\(a = 2\), sites 1 and 3), the sites where only A occurs (\(b = 1\), site 2), and the sites where only B occurs (\(c = 1\), site 4). Sites where neither occurs (site 5) are ignored. The binary Jaccard similarity is the shared fraction of occupied sites, \(a/(a+b+c) = 2/4 = 0.5\), and the Jaccard distance is its complement, \(1 - 0.5 = 0.5\).
speciesA
speciesB 0.5
The value 0.5 confirms the hand calculation. The two ideas to remember are that Jaccard is a dissimilarity (lower means more alike), and that the “neither present” sites contribute nothing to it.
The Fish-Species Association Matrix
The Doubs fish dataset records abundances on a 0-to-5 scale across the 30 sites, and it is insightful to examine the properties of an association matrix:
Cogo Satr Phph Babl Thth Teso Chna Pato Lele Sqce Baba Albi Gogo Eslu Pefl
1 0 3 0 0 0 0 0 0 0 0 0 0 0 0 0
2 0 5 4 3 0 0 0 0 0 0 0 0 0 0 0
3 0 5 5 5 0 0 0 0 0 0 0 0 0 1 0
4 0 4 5 5 0 0 0 0 0 1 0 0 1 2 2
5 0 2 3 2 0 0 0 0 5 2 0 0 2 4 4
6 0 3 4 5 0 0 0 0 1 2 0 0 1 1 1
Rham Legi Scer Cyca Titi Abbr Icme Gyce Ruru Blbj Alal Anan
1 0 0 0 0 0 0 0 0 0 0 0 0
2 0 0 0 0 0 0 0 0 0 0 0 0
3 0 0 0 0 0 0 0 0 0 0 0 0
4 0 0 0 0 1 0 0 0 0 0 0 0
5 0 0 2 0 3 0 0 0 5 0 0 0
6 0 0 0 0 2 0 0 0 1 0 0 0
To calculate associations between species, I first need to transpose the data, so that each row is a species and each column a site:
Now I can calculate the association matrix. The first version uses the abundances directly:
Cogo Satr Phph Babl Thth Teso Chna
Cogo 0.0000000 0.7368421 0.7794118 0.7945205 0.3333333 0.4545455 0.9354839
Satr 0.7368421 0.0000000 0.3108108 0.4705882 0.7368421 0.7333333 0.9583333
Phph 0.7794118 0.3108108 0.0000000 0.2804878 0.7794118 0.7571429 0.9113924
Babl 0.7945205 0.4705882 0.2804878 0.0000000 0.8108108 0.7397260 0.8481013
Thth 0.3333333 0.7368421 0.7794118 0.8108108 0.0000000 0.5833333 0.9000000
Teso 0.4545455 0.7333333 0.7571429 0.7397260 0.5833333 0.0000000 0.8787879
Chna 0.9354839 0.9583333 0.9113924 0.8481013 0.9000000 0.8787879 0.0000000
Pato 0.8918919 0.9078947 0.7948718 0.7307692 0.9210526 0.7500000 0.4827586
Lele 0.8627451 0.8235294 0.7386364 0.6666667 0.9056604 0.7346939 0.6136364
Sqce 0.8360656 0.7978723 0.7346939 0.6562500 0.8730159 0.8281250 0.7017544
Pato Lele Sqce
Cogo 0.8918919 0.8627451 0.8360656
Satr 0.9078947 0.8235294 0.7978723
Phph 0.7948718 0.7386364 0.7346939
Babl 0.7307692 0.6666667 0.6562500
Thth 0.9210526 0.9056604 0.8730159
Teso 0.7500000 0.7346939 0.8281250
Chna 0.4827586 0.6136364 0.7017544
Pato 0.0000000 0.5000000 0.6774194
Lele 0.5000000 0.0000000 0.4531250
Sqce 0.6774194 0.4531250 0.0000000
The second reduces the data to presence and absence (binary = TRUE):
Cogo Satr Phph Babl Thth Teso Chna
Cogo 0.0000000 0.5294118 0.6000000 0.6666667 0.2222222 0.4000000 0.8888889
Satr 0.5294118 0.0000000 0.2380952 0.3600000 0.5294118 0.6111111 0.8846154
Phph 0.6000000 0.2380952 0.0000000 0.1666667 0.6000000 0.6000000 0.7692308
Babl 0.6666667 0.3600000 0.1666667 0.0000000 0.6666667 0.6666667 0.6153846
Thth 0.2222222 0.5294118 0.6000000 0.6666667 0.0000000 0.4000000 0.8235294
Teso 0.4000000 0.6111111 0.6000000 0.6666667 0.4000000 0.0000000 0.7500000
Chna 0.8888889 0.8846154 0.7692308 0.6153846 0.8235294 0.7500000 0.0000000
Pato 0.8125000 0.8333333 0.7083333 0.6000000 0.8125000 0.6428571 0.2307692
Lele 0.8181818 0.6538462 0.5384615 0.3846154 0.8181818 0.7000000 0.4210526
Sqce 0.7307692 0.5517241 0.3928571 0.2500000 0.7307692 0.7307692 0.5200000
Pato Lele Sqce
Cogo 0.8125000 0.8181818 0.7307692
Satr 0.8333333 0.6538462 0.5517241
Phph 0.7083333 0.5384615 0.3928571
Babl 0.6000000 0.3846154 0.2500000
Thth 0.8125000 0.8181818 0.7307692
Teso 0.6428571 0.7000000 0.7307692
Chna 0.2307692 0.4210526 0.5200000
Pato 0.0000000 0.3888889 0.5600000
Lele 0.3888889 0.0000000 0.2800000
Sqce 0.5600000 0.2800000 0.0000000
Interpreting these matrices requires attention to what each form of the Jaccard index reflects. On abundance data, vegdist(method = "jaccard") uses vegan’s quantitative Jaccard distance, \(2B/(1+B)\), where \(B\) is Bray-Curtis dissimilarity; it is therefore not the same index as the binary set-Jaccard calculated by hand above. It responds both to whether two species co-occur and to how their abundances are distributed across shared sites. Under this specification, species that occur together often but differ greatly in dominance can appear less closely associated than species with similar abundances, even when their occupancy patterns are comparable. The binary version removes abundance information and keeps only shared presence or absence, isolating co-occurrence structure from dominance. Recall that the index is a dissimilarity, namely lower values correspond to stronger co-occurrence and higher values to weaker. Judging an association as “strong” or “weak” therefore depends both on the magnitude of the distance and on how that distance was constructed. Assessing the abundance-weighted and binary matrices side by side shows that association is not an intrinsic property of a species pair, but a consequence of the analytical view applied to it, a distinction that returns when these distances drive clustering and ordination.
Reading the Fish Matrix
The fish matrix records the same longitudinal gradient as the environmental one, now expressed through which species share sites. Rather than scan all 27 species at once, I pull out six that span the river, from the cool upper reaches to the lowland sites, using the binary matrix:
Cogo Satr Phph Abbr Blbj Anan
Cogo 0.00 0.53 0.60 1.00 1.00 0.88
Satr 0.53 0.00 0.24 0.96 0.96 0.88
Phph 0.60 0.24 0.00 0.84 0.85 0.76
Abbr 1.00 0.96 0.84 0.00 0.10 0.18
Blbj 1.00 0.96 0.85 0.10 0.00 0.25
Anan 0.88 0.88 0.76 0.18 0.25 0.00
-
AbbrandBlbj= 0.10. Common bream and silver bream, two lowland cyprinids, are recorded at almost the same sites: a low distance marks strong co-occurrence. -
SatrandPhph= 0.24. Brown trout and minnow share the cool upper reaches, so they too co-occur strongly. -
CogoandAbbr= 1.00. Bullhead (an upper-river species) and bream (a lowland species) share no site at all, namely the maximum Jaccard distance and complete mutual exclusion.
Read as blocks, the sub-matrix splits in two. The upper-river species (Cogo, Satr, Phph) sit at low distances among themselves and at high distances from the lowland species (Abbr, Blbj, Anan), which in turn group together. The association matrix therefore recovers the source-to-mouth ordering already seen in the environmental correlations, now written in the co-occurrence of species rather than the co-variation of measurements. That two-block structure is what clustering and ordination will formalise in the chapters that follow.
Bringing It Together
The chapter has used four ideas that are easy to conflate, so let me separate them:
| Concept | What it measures | Typical use |
|---|---|---|
| Correlation | relationship between two variables | environmental data |
| Collinearity | shared structure among predictors | regression diagnostics |
| Association | species co-occurrence pattern | community ecology |
| Jaccard distance | species dissimilarity | ordination, clustering |
Looking Forward
The analyses in this chapter are EDA and diagnostic steps that the later modelling choices build on, although they are also insightful in themselves: interpreting these matrices gives a deeper feel for the structure of one’s data. Strong correlations among environmental variables indicate redundancy that constrains how the predictors can be used together, namely collinearity inflates variance, destabilises parameter estimates, and undermines attempts to attribute effects to individual covariates. Where that holds, treating each variable as an independent explanatory factor becomes statistically problematic. The correlation matrix is therefore a first step before further analyses, revealing when dimensional reduction or an alternative representation of environmental structure is needed before formal modelling proceeds.
The same applies to species associations. Patterns of co-occurrence summarised in an association matrix anticipate the distributional shape of species in multivariate space. High redundancy among species warns of compressed ordination structures, while weak or uneven associations often translate into elongated gradients or dispersed configurations. This will become clear in my first ordination analyses. So, by examining correlations and associations at this early stage, I describe the data and diagnose their effective dimensionality at the same time, which motivates the transition towards ordination, clustering, and constrained multivariate methods in the chapters that follow.
References
Reuse
Citation
@online{smit2026,
author = {Smit, A. J.},
title = {5: {Environmental} {Correlations} and {Species}
{Associations}},
date = {2026-06-15},
url = {https://tangledbank.netlify.app/BCB743/correlations.html},
langid = {en}
}
