Data are loaded in a matrix configured for multivariate analyses (i.e. observations in rows, variables in columns). We load the output of preprocessing scripts and removed the polygons that contained undetermined data and only bare susbtratum for 2015, 2018 & 2020. The column bare substratum was removed. Each matrix is stored for each year separately. Each row corresponds to a group of polygons. Polygons were assigned to a given group according to their proximity and the total area they sum up together to reach approximately the size of the largest polygon drawn in 3D (i.e. 1.7 m²). The histogram below describes the surfaces of each group of polygons computed.
In each of these matrices, data are organised as follow: 1. each row corresponds to a group to which is assigned two IDs, the sum of all polygons assigned to that group, coordinates of the group centroid (i.e. mean of polygons’ centroid weighted by their specific area) and the side.
head(Matrix_RDA_group_2015[,1:7],10)
## Original_ID ID_tot Area Centroid_x Centroid_y Centroid_z Side
## 1 260 1 1.983091 14.00839 -9.669603 11.564273 ES
## 2 257 2 1.799056 13.45408 -8.645261 11.254791 ES
## 3 254 3 1.931393 14.21711 -9.652415 10.361668 ES
## 4 249 4 1.565404 13.92157 -8.293676 9.816375 ES
## 5 247 5 1.754464 14.34365 -9.351373 9.201676 ES
## 6 243 6 1.579983 13.81203 -9.786435 8.293649 ES
## 7 256 7 1.422055 12.71541 -8.121112 11.275338 ES
## 8 244 8 1.593894 13.02906 -7.269152 9.229354 ES
## 9 242 9 1.351696 14.04972 -7.976499 8.601580 ES
## 10 253 10 1.723426 12.20112 -8.564667 10.476200 ES
Matrix_RDA_group_2015[,8:20] = Matrix_RDA_group_2015[,8:20]/Matrix_RDA_group_2015$Area
Matrix_RDA_group_2018[,8:20] = Matrix_RDA_group_2018[,8:20]/Matrix_RDA_group_2018$Area
Matrix_RDA_group_2020[,8:20] = Matrix_RDA_group_2020[,8:20]/Matrix_RDA_group_2020$Area
head(Matrix_RDA_group_2015[,8:20],10)
## Large B. azoricus Medium B. azoricus Small B. azoricus
## 1 0.62784992 0.32455845 0.02801790
## 2 0.04803632 0.63404183 0.27305581
## 3 0.57379727 0.05802035 0.00000000
## 4 0.00000000 0.90909750 0.09090250
## 5 0.57154545 0.25070580 0.00000000
## 6 0.52378556 0.00000000 0.00000000
## 7 0.00000000 0.86843126 0.13156874
## 8 0.00000000 0.82819410 0.17180590
## 9 0.12713548 0.73445941 0.02618499
## 10 0.31732690 0.39826262 0.25230251
## white hydrothermal deposit Empty shell Hydrozoan sp. Amorphous sulphur
## 1 0.00000000 0 0 0
## 2 0.00000000 0 0 0
## 3 0.03633720 0 0 0
## 4 0.00000000 0 0 0
## 5 0.06488362 0 0 0
## 6 0.37820810 0 0 0
## 7 0.00000000 0 0 0
## 8 0.00000000 0 0 0
## 9 0.00000000 0 0 0
## 10 0.00000000 0 0 0
## Zoanthid sp. Microbial mat S. mesatlantica Phymorhynchus sp. M. fortunata
## 1 0 0.7730584 0.0000000 0 0.00000000
## 2 0 0.2750248 0.0000000 0 0.00000000
## 3 0 0.2902998 0.8042291 0 0.00000000
## 4 0 0.6192059 0.0000000 0 0.00000000
## 5 0 0.6483385 0.6497420 0 0.00000000
## 6 0 0.0000000 0.4005854 0 0.02822113
## 7 0 0.2086696 0.0000000 0 0.00000000
## 8 0 0.1308291 0.0000000 0 0.00000000
## 9 0 0.7608667 0.5473211 0 0.00000000
## 10 0 0.7836366 0.6733563 0 0.00000000
## P. smaragdina
## 1 0
## 2 0
## 3 0
## 4 0
## 5 0
## 6 0
## 7 0
## 8 0
## 9 0
## 10 0
head(Matrix_RDA_group_2015[,21:25],10)
## Main smoker Secondary smoker Diffusion zone Flange Topographic change
## 1 0.1833138 0.2992664 0.08255605 0.003294837 1.0446882
## 2 0.1417707 0.2918170 0.09660745 0.003617790 0.8658826
## 3 0.3986712 0.7386391 0.19708229 0.003215369 1.1793672
## 4 0.2654811 0.5492500 0.22769658 0.003641328 0.9972748
## 5 0.6415041 2.7474817 0.68290602 0.003212541 1.8679686
## 6 0.4921507 11.8343732 5.14803919 0.002969702 5.3476480
## 7 0.0982040 0.2340368 0.08625154 0.003779044 0.6673483
## 8 0.1548733 0.2941247 0.17854449 0.003925524 0.7718310
## 9 0.3327573 0.7531478 0.40910400 0.003624202 1.2978646
## 10 0.1068804 0.5303387 0.17617608 0.003493348 1.2980379
We perform a PCA with cover data for 2015. These data were log-transformed and then Chord-transformed
cov_2015 = Matrix_RDA_group_2015[,8:20]
env_2015 = Matrix_RDA_group_2015[,21:25]
cov_chord_2015 = decostand(log1p(cov_2015), "normalize")
cov_chord_pca_2015 = rda(cov_chord_2015)
#screeplot(cov_chord_pca, bstick=TRUE)
proportion_explained_2015 = sum(summary(cov_chord_pca_2015, display=NULL)[["cont"]][["importance"]][2,1:2])*100
cleanplot.pca(cov_chord_pca_2015)
mtext(paste0("Proportion of variance explained ", round(proportion_explained_2015), " %"), side=3)
The first two PCA axes demonstrate the spatial zonation in vent assemblages. The quartile II is mostly influenced by S. mesatlantica and less importantly by Large B. azoricus and by the white material therefore grouping features living in warm environmental conditions, closer to the hydrothermal vents (Cuvelier et al. 2009; Husson et al. 2017; Girard et al. 2020). The lower quartiles (III and IV) group empty mussel shells and the smaller-size mussel and zoanthid assemblages, living in colder locations further away from the vent fluid exits (Husson et al. 2017; Girard et al. 2020). Finally, the quartile I groups assemblages of medium mussels and microbial mats which occur in intermediate conditions of hydrothermal vent fluid exposure (Husson et al. 2017). In summary, these PCs clearly reflect the knowledge on the spatial distriubtion of the vent fauna we have at ET.
Still, we check for the two next axes to see how the data distribute in these PCs.
cleanplot.pca(cov_chord_pca_2015, ax1 = 3, ax2 = 4)
proportion_explained_temp = sum(summary(cov_chord_pca_2015, display=NULL)[["cont"]][["importance"]][2,3:4])*100
mtext(paste0("Proportion of variance explained ", round(proportion_explained_temp), " %"), side=3)
However, it does not remain informative as for the first two axes as it discriminates the distribution of colder assemblages.
We perform a RDA to check for any influence of environmental variables.
cov_chord_rda_2015 = rda(cov_chord_2015, env_2015)
triplot.rda(cov_chord_rda_2015, ax1=1, ax2=2)
## -----------------------------------------------------------------------
## Site constraints (lc) selected. To obtain site scores that are weighted
## sums of species scores (default in vegan), argument site.sc must be set
## to wa.
## -----------------------------------------------------------------------
##
##
## No factor, hence levels cannot be plotted with symbols;
## 'plot.centr' is set to FALSE
We clearly see the influence of the hydrothermal activity on the distribution of assemblages. The flanges appear to have a different effect mostly explaining the distribution of intermediate to warm hydrothermal assemblages (i.e. medium top large-mussel assemblage). Cold assemblages locating on the other side of the triplot, their distribution in the ET hdyrothermal edifice may be restricted to areas with low hydrothermal vent fluid exposure. The RDA model is significant.
anova(cov_chord_rda_2015)
## Permutation test for rda under reduced model
## Permutation: free
## Number of permutations: 999
##
## Model: rda(X = cov_chord_2015, Y = env_2015)
## Df Variance F Pr(>F)
## Model 5 0.08829 8.6724 0.001 ***
## Residual 194 0.39500
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
We redo PCA and RDA analyses for 2018 and 2020 to compare among the three time replicates how these relationships changed in time.
PCA biplots are presented as a series starting from the top for 2015 then 2018 and at the bottom, 2020.
par(mfrow=c(3,1))
cleanplot.pca(cov_chord_pca_2015)
## Warning in arrows(0, 0, spe.sc[, ax1], spe.sc[, ax2], length = ahead, angle =
## aangle, : zero-length arrow is of indeterminate angle and so skipped
mtext(paste0("Proportion of variance explained ", round(proportion_explained_2015), " %"), side=3)
cleanplot.pca(cov_chord_pca_2018)
## Warning in arrows(0, 0, spe.sc[, ax1], spe.sc[, ax2], length = ahead, angle =
## aangle, : zero-length arrow is of indeterminate angle and so skipped
proportion_explained_2018 = sum(summary(cov_chord_pca_2018, display=NULL)[["cont"]][["importance"]][2,1:2])*100
mtext(paste0("Proportion of variance explained ", round(proportion_explained_2018), " %"), side=3)
cleanplot.pca(cov_chord_pca_2020)
proportion_explained_2020 = sum(summary(cov_chord_pca_2020, display=NULL)[["cont"]][["importance"]][2,1:2])*100
mtext(paste0("Proportion of variance explained ", round(proportion_explained_2020), " %"), side=3)
We clearly see the stability among the years as the PCs are redrawn almost exactly the same year after year, explaining the same share of the variance (~55.5%). This demonstrates that stability predominates in the dataset. We may need to divide our dataset to better look for variability patterns if there are any of interest (see spatial exploration of the data with 3D mapping plots). Variability is however observed for microbial mats. As expected these microbial assemblages can undergo rapid variations through time (Van Audenhaege et al., in review). As a recall, our exploratory analyses depicted a large decline in microbial mat cover from 2015 to 2020.
We now proceed to RDA comparisons among years independently.
par(mfrow=c(3,1))
triplot.rda(cov_chord_rda_2015)
## -----------------------------------------------------------------------
## Site constraints (lc) selected. To obtain site scores that are weighted
## sums of species scores (default in vegan), argument site.sc must be set
## to wa.
## -----------------------------------------------------------------------
##
##
## No factor, hence levels cannot be plotted with symbols;
## 'plot.centr' is set to FALSE
mtext(paste0("Proportion of variance explained: Constrained ", round(sum(summary(cov_chord_rda_2015, display=NULL)[["cont"]][["importance"]][2,1:2])*100), " %", "and unconstrained ", round(sum(summary(cov_chord_rda_2015, display=NULL)[["cont"]][["importance"]][2,ncol(env_2015)+1:ncol(env_2015)+2])*100), " [%]"), side=3)
triplot.rda(cov_chord_rda_2018)
## -----------------------------------------------------------------------
## Site constraints (lc) selected. To obtain site scores that are weighted
## sums of species scores (default in vegan), argument site.sc must be set
## to wa.
## -----------------------------------------------------------------------
##
##
## No factor, hence levels cannot be plotted with symbols;
## 'plot.centr' is set to FALSE
mtext(paste0("Proportion of variance explained: Constrained ", round(sum(summary(cov_chord_rda_2018, display=NULL)[["cont"]][["importance"]][2,1:2])*100), " %", "and unconstrained ", round(sum(summary(cov_chord_rda_2018, display=NULL)[["cont"]][["importance"]][2,ncol(env_2018)+1:ncol(env_2018)+2])*100), " [%]"), side=3)
triplot.rda(cov_chord_rda_2020)
## -----------------------------------------------------------------------
## Site constraints (lc) selected. To obtain site scores that are weighted
## sums of species scores (default in vegan), argument site.sc must be set
## to wa.
## -----------------------------------------------------------------------
##
##
## No factor, hence levels cannot be plotted with symbols;
## 'plot.centr' is set to FALSE
mtext(paste0("Proportion of variance explained: Constrained ", round(sum(summary(cov_chord_rda_2020, display=NULL)[["cont"]][["importance"]][2,1:2])*100), " %", "and unconstrained ", round(sum(summary(cov_chord_rda_2020, display=NULL)[["cont"]][["importance"]][2,ncol(env_2020)+1:ncol(env_2020)+2])*100), " [%]"), side=3)
Same observation here, with slight variation on the influence of flanges onto each assemblage. Flanges were indeed observed building up considerably over time, therefore changing their position in space through time.
We now redo the analyses but this time, we will test the effect of spatial scales to explain faunal distribution. To do so, we will include the use of dbMEMs (Legendre and Legendre 2012).
Centroids = Matrix_RDA_group_2015[,4:6]
dist_all_mst = as.dist(dist.xyz(Centroids,Centroids))
mst_ = mst(dist_all_mst)
max_treshold_dbMEM = max(mst_*dist.xyz(Centroids,Centroids))
dist_all = dist.xyz(Centroids,Centroids)
dist_all[which(dist_all>max_treshold_dbMEM)]=max_treshold_dbMEM*4
We now plot in 3D the spatial relationships determined by the truncated matrix that will be used to compute dbMEMs.
if(plot3d==T){plot3d(
x=Matrix_RDA_group_2015$Centroid_x, y=Matrix_RDA_group_2015$Centroid_y, z=Matrix_RDA_group_2015$Centroid_z,
col = "green",
type = 's',
radius = .25,
xlab="x [m]", ylab="y [m]", zlab="z [m]")
for (i in 1:nrow(dist_all)){
for (j in 1:ncol(dist_all)){
if (dist_all[i,j]<=max_treshold_dbMEM){
x = c(Matrix_RDA_group_2015$Centroid_x[i],Matrix_RDA_group_2015$Centroid_x[j])
y = c(Matrix_RDA_group_2015$Centroid_y[i],Matrix_RDA_group_2015$Centroid_y[j])
z = c(Matrix_RDA_group_2015$Centroid_z[i],Matrix_RDA_group_2015$Centroid_z[j])
segments3d(x = x, y = y, z = z, radius =8, col="red")}
}
}
#legend3d("topright", legend = paste('Year', c('2015', '2018', '2020')), pch = 16, col = mycolors, cex=2.5, inset=c(0.02))
arrow3d(c(0,0,0), c(0,5,0), type = "rotation", col = "green")
arrow3d(c(0,0,0), c(-4,0,0), type = "rotation", col = "red", cex=4)
arrow3d(c(0,0,0), c(0,0,4), type = "rotation", col = "blue")
text3d(c(0,6,0), text="N")
text3d(c(-5,0,0), text="W")
text3d(c(0,0,5), text="Z(+)")
title3d(position="topcenter",main = ("Spatial relationship among group centroids used for dbMEMs"))}
dist_dbmem=as.dist(dist_all)
tr100.dbmem.tmp = dbmem(dist_dbmem, MEM.autocor = "positive")
## Warning in dudi.pco(matdist, scannf = FALSE, nf = 2): Non euclidean distance
tr100.dbmem <- as.data.frame(tr100.dbmem.tmp) # Display the eigenvalues
length(attributes(tr100.dbmem.tmp)$values)
## [1] 30
30 dbMEMs were retrieved. We look for significant spatial patterns modeled by the dbMEMs by testing them with an ANOVA .
dbmem_raw = tr100.dbmem
rda1 = rda(cov_chord_2015~.,dbmem_raw)
anova(rda1)
## Permutation test for rda under reduced model
## Permutation: free
## Number of permutations: 999
##
## Model: rda(formula = cov_chord_2015 ~ MEM1 + MEM2 + MEM3 + MEM4 + MEM5 + MEM6 + MEM7 + MEM8 + MEM9 + MEM10 + MEM11 + MEM12 + MEM13 + MEM14 + MEM15 + MEM16 + MEM17 + MEM18 + MEM19 + MEM20 + MEM21 + MEM22 + MEM23 + MEM24 + MEM25 + MEM26 + MEM27 + MEM28 + MEM29 + MEM30, data = dbmem_raw)
## Df Variance F Pr(>F)
## Model 30 0.09785 1.4301 0.001 ***
## Residual 169 0.38544
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
(rda1.R2a = RsquareAdj(rda1)$adj.r.squared)
## [1] 0.06089191
The model is significant, although the R² is low. We plot a scalogram to screen for significant dbMEMs according to the spatial scale they model (using the function built in Ecology with R, 2018)
source("C:/Lucky Strike/3D analysis/RDA/NEwR-2ed_code_data/NEwR-2ed_code_data 2/NEwR-2ed_code_data/NEwR2-Functions/scalog.R")
scalog(rda1)
The results of the scalogram show that the first six dbMEMs are significant. At broader scales, we still observe two unsignificant peaks at dbMEMs 22 & 29. After a forward selection, we investigate how these dbMEMs model those spatial scales explaining significantly the distribution of the fauna.
dbmem.fwd = forward.sel(cov_chord_2015, as.matrix(dbmem_raw),nperm=9999)
## Testing variable 1
## Testing variable 2
## Testing variable 3
## Testing variable 4
## Testing variable 5
## Testing variable 6
## Testing variable 7
## Procedure stopped (alpha criteria): pvalue for variable 7 is 0.058400 (> 0.050000)
(nb.sig.dbmem <- nrow(dbmem.fwd))
## [1] 6
(dbmem.sign <- sort(dbmem.fwd[ ,2]))
## [1] 1 2 3 4 5 6
dbmem.red <- dbmem_raw[ ,c(dbmem.sign)]
6 dbMEMs were found significant. We plot them from a downward-looking perspective. QUESTION: What results should we trust the best, the scalogram or the forward-selection ?
source("C:/Lucky Strike/3D analysis/RDA/NEwR-2ed_code_data/NEwR-2ed_code_data 2/NEwR-2ed_code_data/NEwR2-Functions/sr.value.R")
par(mfrow = c(2, 4))
for(i in 1 : ncol(dbmem.red))
{
sr.value(Centroids[,1:2],
dbmem.red[ ,i],
# sub = paste("dbMEM",i),
sub = paste("dbMEM",dbmem.sign[i]),
csub = 2)
}
These dbMEMs show different spatial patterns of faunal distribution. dbMEM1 describes broad-scale differences in terms of spatial organisation: the periphery and the summit. dbMEM2&3 describe medium-scale differences between northern and the summit communities. dbMEMs5&6 describe more differences at finer scales.
We now proceed to the delimitation of the dbMEMs This section may be useless.
# Interpretation of significant dbmems at broad and medium scales # 1
mite.dbmem.broad <-
rda(cov_chord_2015 ~ ., data = dbmem_raw[ ,c(1,2,3)])
anova(mite.dbmem.broad)
## Permutation test for rda under reduced model
## Permutation: free
## Number of permutations: 999
##
## Model: rda(formula = cov_chord_2015 ~ MEM1 + MEM2 + MEM3, data = dbmem_raw[, c(1, 2, 3)])
## Df Variance F Pr(>F)
## Model 3 0.02650 3.7901 0.001 ***
## Residual 196 0.45679
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
(axes.broad <- anova(mite.dbmem.broad, by = "axis"))
## Permutation test for rda under reduced model
## Forward tests for axes
## Permutation: free
## Number of permutations: 999
##
## Model: rda(formula = cov_chord_2015 ~ MEM1 + MEM2 + MEM3, data = dbmem_raw[, c(1, 2, 3)])
## Df Variance F Pr(>F)
## RDA1 1 0.01798 7.7153 0.001 ***
## RDA2 1 0.00621 2.6659 0.080 .
## RDA3 1 0.00231 0.9891 0.374
## Residual 196 0.45679
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
# Number of significant axes
(nb.ax.broad <-
length(which(axes.broad[ , ncol(axes.broad)] <= 0.05)))
## [1] 1
# Plot of the two significant canonical axes
mite.dbmembroad.axes <-
scores(mite.dbmem.broad,
choices = c(1,2),
display = "lc",
scaling = 1)
par(mfrow = c(1, 2))
sr.value(Centroids[,1:2], mite.dbmembroad.axes[ ,1])
sr.value(Centroids[,1:2], mite.dbmembroad.axes[ ,2])
# Interpretation of significant dbmems at broad and medium scales # 1
mite.dbmem.fine <-
rda(cov_chord_2015 ~ ., data = dbmem_raw[ ,c(4,5,6,22)])
anova(mite.dbmem.fine)
## Permutation test for rda under reduced model
## Permutation: free
## Number of permutations: 999
##
## Model: rda(formula = cov_chord_2015 ~ MEM4 + MEM5 + MEM6 + MEM22, data = dbmem_raw[, c(4, 5, 6, 22)])
## Df Variance F Pr(>F)
## Model 4 0.03302 3.5746 0.001 ***
## Residual 195 0.45028
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
(axes.fine <- anova(mite.dbmem.fine, by = "axis"))
## Permutation test for rda under reduced model
## Forward tests for axes
## Permutation: free
## Number of permutations: 999
##
## Model: rda(formula = cov_chord_2015 ~ MEM4 + MEM5 + MEM6 + MEM22, data = dbmem_raw[, c(4, 5, 6, 22)])
## Df Variance F Pr(>F)
## RDA1 1 0.01796 7.7797 0.002 **
## RDA2 1 0.00743 3.2164 0.073 .
## RDA3 1 0.00604 2.6140 0.081 .
## RDA4 1 0.00159 0.6881 0.651
## Residual 195 0.45028
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
# Number of significant axes
(nb.ax.fine <-
length(which(axes.fine[ , ncol(axes.fine)] <= 0.05)))
## [1] 1
# Plot of the two significant canonical axes
mite.dbmemfine.axes <-
scores(mite.dbmem.fine,
choices = c(1,2),
display = "lc",
scaling = 1)
par(mfrow = c(1, 2))
sr.value(Centroids[,1:2], mite.dbmemfine.axes[ ,1])
sr.value(Centroids[,1:2], mite.dbmemfine.axes[ ,2])
mite.h = cov_chord_2015
mite.XY.rda <- rda(mite.h, Centroids)
anova(mite.XY.rda)
## Permutation test for rda under reduced model
## Permutation: free
## Number of permutations: 999
##
## Model: rda(X = mite.h, Y = Centroids)
## Df Variance F Pr(>F)
## Model 3 0.05966 9.2007 0.001 ***
## Residual 196 0.42364
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
As a linear trend is present, we separate this effect by keeping only the residuals.
mite.h.det <- resid(lm(as.matrix(mite.h) ~ ., data = Centroids))
mite.xy = Centroids
mite.env = env_2015
primary_smokers <- model.matrix( ~ mite.env[ ,1])[ ,-1]
secondary_smokers <- model.matrix( ~ mite.env[ ,2])[ ,-1]
diffusion_zone = model.matrix( ~ mite.env[ ,3])[ ,-1]
flange = model.matrix( ~ mite.env[ ,4])[ ,-1]
topographic_change = model.matrix( ~ mite.env[ ,5])[ ,-1]
mite.env2 <- cbind(primary_smokers,secondary_smokers, diffusion_zone, flange,topographic_change)
colnames(mite.env2) <-
c("Primary smokers", "Secondary smokers", "Diffusion zone", "Flange", "Topographic change")
mite.env2 = as.data.frame(mite.env2)
mite.env.rda <- rda(mite.h ~., mite.env2)
(mite.env.R2a <- RsquareAdj(mite.env.rda)$adj.r.squared)
## [1] 0.1616181
mite.env.fwd <-
forward.sel(mite.h, mite.env2,
adjR2thresh = mite.env.R2a,
nperm = 9999)
## Testing variable 1
## Testing variable 2
## Testing variable 3
## Procedure stopped (adjR2thresh criteria) adjR2cum = 0.161675 with 3 variables (> 0.161618)
env.sign <- sort(mite.env.fwd$order)
env.red <- mite.env2[ ,c(env.sign)]
Secondary smokers, diffusion zone and flanges were signficant and kept for the variance partitioning of the data.
mite.dbmem = dbmem_raw
mite.dbmem.rda <- rda(mite.h ~., mite.dbmem)
anova(mite.dbmem.rda)
## Permutation test for rda under reduced model
## Permutation: free
## Number of permutations: 999
##
## Model: rda(formula = mite.h ~ MEM1 + MEM2 + MEM3 + MEM4 + MEM5 + MEM6 + MEM7 + MEM8 + MEM9 + MEM10 + MEM11 + MEM12 + MEM13 + MEM14 + MEM15 + MEM16 + MEM17 + MEM18 + MEM19 + MEM20 + MEM21 + MEM22 + MEM23 + MEM24 + MEM25 + MEM26 + MEM27 + MEM28 + MEM29 + MEM30, data = mite.dbmem)
## Df Variance F Pr(>F)
## Model 30 0.09785 1.4301 0.002 **
## Residual 169 0.38544
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
# Since the analysis is significant, compute the adjusted R2
# and run a forward selection of the dbMEM variables
(mite.dbmem.R2a <-
RsquareAdj(mite.dbmem.rda)$adj.r.squared)
## [1] 0.06089191
(mite.dbmem.fwd <-
forward.sel(mite.h,
as.matrix(mite.dbmem),
adjR2thresh = mite.dbmem.R2a, nperm=9999))
## Testing variable 1
## Testing variable 2
## Testing variable 3
## Procedure stopped (adjR2thresh criteria) adjR2cum = 0.063708 with 3 variables (> 0.060892)
## variables order R2 R2Cum AdjR2Cum F pvalue
## 1 MEM5 5 0.0332816 0.0332816 0.02839918 6.816624 2e-04
## 2 MEM1 1 0.0248216 0.0581032 0.04854079 5.191498 2e-04
# Number of significant dbMEM
(nb.sig.dbmem <- nrow(mite.dbmem.fwd))
## [1] 2
# Identify the significant dbMEM sorted in increasing order
(dbmem.sign <- sort(mite.dbmem.fwd$order))
## [1] 1 5
# Write the significant dbMEM to a new object (reduced set)
dbmem.red <- mite.dbmem[ ,c(dbmem.sign)]
If we only use undetrended data, we get 2 significant dbMEMs now with this treshold of R². We plot them in space to display how they actually model spatial relationships among sampling points.
mite.red.axes <-
scores(mite.dbmem.rda,
choices = c(1,2),
display = "lc",
scaling = 1)
par(mfrow = c(1, 2))
sr.value(Centroids[,1:2], dbmem.red[ ,1])
sr.value(Centroids[,1:2], dbmem.red[ ,2])
These dbMEMs depict differences in: dbMEM1: Periphery vs. summit; dbMEM5: Position and orientation on the summit. Perhaps, we may want to include a dbMEM like the dbMEM22 that represents better finer-scale patterns, close to the vent fluid exits. We will also try with detrended data.
mite.dbmem = dbmem_raw
mite.det.dbmem.rda <- rda(mite.h.det ~., mite.dbmem)
anova(mite.det.dbmem.rda)
## Permutation test for rda under reduced model
## Permutation: free
## Number of permutations: 999
##
## Model: rda(formula = mite.h.det ~ MEM1 + MEM2 + MEM3 + MEM4 + MEM5 + MEM6 + MEM7 + MEM8 + MEM9 + MEM10 + MEM11 + MEM12 + MEM13 + MEM14 + MEM15 + MEM16 + MEM17 + MEM18 + MEM19 + MEM20 + MEM21 + MEM22 + MEM23 + MEM24 + MEM25 + MEM26 + MEM27 + MEM28 + MEM29 + MEM30, data = mite.dbmem)
## Df Variance F Pr(>F)
## Model 30 0.07507 1.2132 0.042 *
## Residual 169 0.34857
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
# Since the analysis is significant, compute the adjusted R2
# and run a forward selection of the dbMEM variables
(mite.det.dbmem.R2a <-
RsquareAdj(mite.det.dbmem.rda)$adj.r.squared)
## [1] 0.03114347
#(mite.det.dbmem.fwd <-
# forward.sel(mite.h.det,
# as.matrix(mite.dbmem),
# adjR2thresh = mite.det.dbmem.R2a))
# Number of significant dbMEM
#(nb.sig.dbmem <- nrow(mite.det.dbmem.fwd))
# Identify the significant dbMEM sorted in increasing order
#(dbmem.sign <- sort(mite.det.dbmem.fwd$order))
# Write the significant dbMEM to a new object (reduced set)
#dbmem.red_detrended <- mite.dbmem[ ,c(dbmem.sign)]
If we only use undetrended data, we get 1 significant dbMEM. We now split by scales (i.e. broader to finer with the two significant dbMEMs) to compute the RDA results with significant dbmems used with undetrended data.
dbmem.broad <- dbmem.red[ , 1]
dbmem.fine <- dbmem.red[ , 2]
To analyse the variance partitioning, we perform partial RDA to assess the contribution of each factor and their combination (trend, environmental factors and space divided in broader and finer scales).
# Tests of the unique fractions [a], [b], [c] and [d]
# Fraction [a], pure environmental
env_stat = anova(
#rda(mite.h, env.red, cbind(mite.xy, dbmem.broad, dbmem.fine))
rda(mite.h, env.red, cbind(mite.xy, dbmem.broad, dbmem.fine))
)
if(env_stat$`Pr(>F)`[1]<=0.05&&env_stat$`Pr(>F)`[1]>0.01){text_env = "Environment*"
}else if(env_stat$`Pr(>F)`[1]<=0.01&&env_stat$`Pr(>F)`[1]>0.001){text_env = "Environment**"
}else if(env_stat$`Pr(>F)`[1]<=0.001){text_env = "Environment***"
}else{text_env = "Environment"}
# Fraction [b], pure trend
linear_stat = anova(
#rda(mite.h, mite.xy, cbind(env.red, dbmem.broad, dbmem.fine))
rda(mite.h, mite.xy, cbind(env.red, dbmem.broad, dbmem.fine))
)
if(linear_stat$`Pr(>F)`[1]<=0.05&&linear_stat$`Pr(>F)`[1]>0.01){text_linear = "Linear trend*"
}else if(linear_stat$`Pr(>F)`[1]<=0.01&&linear_stat$`Pr(>F)`[1]>0.001){text_linear = "Linear trend**"
}else if(linear_stat$`Pr(>F)`[1]<=0.001){text_linear = "Linear trend***"
}else{text_linear = "Linear trend"}
# Fraction [c], pure broad scale spatial
broad_stat = anova(rda
# (mite.h, dbmem.broad, cbind(env.red, mite.xy, dbmem.fine))
(mite.h, dbmem.broad, cbind(env.red, mite.xy, dbmem.fine))
)
if(broad_stat$`Pr(>F)`[1]<=0.05&&broad_stat$`Pr(>F)`[1]>0.01){text_broad = "Broader scale*"
}else if(broad_stat$`Pr(>F)`[1]<=0.01&&broad_stat$`Pr(>F)`[1]>0.001){text_broad = "Broader scale**"
}else if(broad_stat$`Pr(>F)`[1]<=0.001){text_broad = "Broader scale***"
}else{text_broad = "Broader scale"}
# Fraction [d], pure fine scale spatial
fine_stat = anova(rda
# (mite.h, dbmem.broad, cbind(env.red, mite.xy, dbmem.fine))
(mite.h, dbmem.fine, cbind(env.red, mite.xy, dbmem.broad))
)
if(fine_stat$`Pr(>F)`[1]<=0.05 && fine_stat$`Pr(>F)`[1]>0.01){text_fine = "Finer scale*"
}else if(fine_stat$`Pr(>F)`[1]<=0.01&&fine_stat$`Pr(>F)`[1]>0.001){text_fine = "Finer scale**"
}else if(fine_stat$`Pr(>F)`[1]<=0.001){text_fine = "Finer scale***"
}else{text_fine = "Finer scale"}
## 5. Mite - environment - trend - dbMEM variation partitioning
mite.varpart <-
#varpart(mite.h, env.red, mite.xy, dbmem.broad, dbmem.fine))
varpart(mite.h, env.red, mite.xy, dbmem.broad, dbmem.fine)
# Show the symbols of the fractions and plot their values
#par(mfrow = c(1,2))
#showvarparts(4, bg = c("red", "blue", "yellow", "green"))
plot(mite.varpart,
digits = 2,
bg = c("red", "blue", "yellow", "green"),
Xnames = c(text_env, text_linear, text_broad, text_fine)
)
mtext(paste0(expression("p-values: * \u2264 0.05, ** \u2264 0.01, *** \u2264 0.001")), side=1, line = 1)
The Euler diagram shows that all fractions explain 21.9% of the variance. The remaining variance (78.1%) illustrates the importance of other factors in explaining the spatial distribution of the ET vent fauna. The environmental variables explain significantly 7.3% of the variance. 4.2% of the variance is explained with a combination of environmental factors and linear trend. Linear trend in the data explains significantly 5.6% of the data variance depicting a low but present gradient in the response variables as well as in the environmental response variables (4.2%). dbMEMs explain poorly the data. While broad scale is not significant, the fine-scale dbMEM explains significantly only 2.1% of the variance. This is surprising for both scales. This broad-scale dbMEM may not model well the distant exposure modulated by the current, the topography and the hydrothermal vent fluid exits. The fine-scale dbMEM may represent better the local influence of vent fluid exits, although a small R² resulted from their interaction (0.7%). This dbMEM may therefore not be modeling this effect in the data.
We may have taken the most restrictive criterium to choose our dbMEMs, perhaps, we could be less restrictive and only use the scalogram ?
The code is not presented as repetitive with the section above.
mite.red.axes <-
scores(mite.dbmem.rda,
choices = c(1,2),
display = "lc",
scaling = 1)
par(mfrow = c(1, 3))
sr.value(Centroids[,1:2], dbmem.red[ ,1])
sr.value(Centroids[,1:2], dbmem.red[ ,2])
sr.value(Centroids[,1:2], dbmem.red[ ,3])
# Tests of the unique fractions [a], [b], [c] and [d]
# Fraction [a], pure environmental
env_stat = anova(
#rda(mite.h, env.red, cbind(mite.xy, dbmem.broad, dbmem.fine))
rda(mite.h, env.red, cbind(mite.xy, dbmem.broad, dbmem.fine))
)
if(env_stat$`Pr(>F)`[1]<=0.05&&env_stat$`Pr(>F)`[1]>0.01){text_env = "Environment*"
}else if(env_stat$`Pr(>F)`[1]<=0.01&&env_stat$`Pr(>F)`[1]>0.001){text_env = "Environment**"
}else if(env_stat$`Pr(>F)`[1]<=0.001){text_env = "Environment***"
}else{text_env = "Environment"}
# Fraction [b], pure trend
linear_stat = anova(
#rda(mite.h, mite.xy, cbind(env.red, dbmem.broad, dbmem.fine))
rda(mite.h, mite.xy, cbind(env.red, dbmem.broad, dbmem.fine))
)
if(linear_stat$`Pr(>F)`[1]<=0.05&&linear_stat$`Pr(>F)`[1]>0.01){text_linear = "Linear trend*"
}else if(linear_stat$`Pr(>F)`[1]<=0.01&&linear_stat$`Pr(>F)`[1]>0.001){text_linear = "Linear trend**"
}else if(linear_stat$`Pr(>F)`[1]<=0.001){text_linear = "Linear trend***"
}else{text_linear = "Linear trend"}
# Fraction [c], pure broad scale spatial
broad_stat = anova(rda
# (mite.h, dbmem.broad, cbind(env.red, mite.xy, dbmem.fine))
(mite.h, dbmem.broad, cbind(env.red, mite.xy, dbmem.fine))
)
if(broad_stat$`Pr(>F)`[1]<=0.05&&broad_stat$`Pr(>F)`[1]>0.01){text_broad = "Broader scale*"
}else if(broad_stat$`Pr(>F)`[1]<=0.01&&broad_stat$`Pr(>F)`[1]>0.001){text_broad = "Broader scale**"
}else if(broad_stat$`Pr(>F)`[1]<=0.001){text_broad = "Broader scale***"
}else{text_broad = "Broader scale"}
# Fraction [d], pure fine scale spatial
fine_stat = anova(rda
# (mite.h, dbmem.broad, cbind(env.red, mite.xy, dbmem.fine))
(mite.h, dbmem.fine, cbind(env.red, mite.xy, dbmem.broad))
)
if(fine_stat$`Pr(>F)`[1]<=0.05 && fine_stat$`Pr(>F)`[1]>0.01){text_fine = "Finer scale*"
}else if(fine_stat$`Pr(>F)`[1]<=0.01&&fine_stat$`Pr(>F)`[1]>0.001){text_fine = "Finer scale**"
}else if(fine_stat$`Pr(>F)`[1]<=0.001){text_fine = "Finer scale***"
}else{text_fine = "Finer scale"}
## 5. Mite - environment - trend - dbMEM variation partitioning
mite.varpart <-
#varpart(mite.h, env.red, mite.xy, dbmem.broad, dbmem.fine))
varpart(mite.h, env.red, mite.xy, dbmem.broad, dbmem.fine)
# Show the symbols of the fractions and plot their values
#par(mfrow = c(1,2))
#showvarparts(4, bg = c("red", "blue", "yellow", "green"))
plot(mite.varpart,
digits = 2,
bg = c("red", "blue", "yellow", "green"),
Xnames = c(text_env, text_linear, text_broad, text_fine)
)
mtext(paste0(expression("p-values: * \u2264 0.05, ** \u2264 0.01, *** \u2264 0.001")), side=1, line = 1)
mite.red.axes <-
scores(mite.dbmem.rda,
choices = c(1,2),
display = "lc",
scaling = 1)
par(mfrow = c(1, 4))
sr.value(Centroids[,1:2], dbmem.red[ ,1])
sr.value(Centroids[,1:2], dbmem.red[ ,2])
sr.value(Centroids[,1:2], dbmem.red[ ,3])
sr.value(Centroids[,1:2], dbmem.red[ ,4])
# Tests of the unique fractions [a], [b], [c] and [d]
# Fraction [a], pure environmental
env_stat = anova(
#rda(mite.h, env.red, cbind(mite.xy, dbmem.broad, dbmem.fine))
rda(mite.h, env.red, cbind(mite.xy, dbmem.broad, dbmem.fine))
)
if(env_stat$`Pr(>F)`[1]<=0.05&&env_stat$`Pr(>F)`[1]>0.01){text_env = "Environment*"
}else if(env_stat$`Pr(>F)`[1]<=0.01&&env_stat$`Pr(>F)`[1]>0.001){text_env = "Environment**"
}else if(env_stat$`Pr(>F)`[1]<=0.001){text_env = "Environment***"
}else{text_env = "Environment"}
# Fraction [b], pure trend
linear_stat = anova(
#rda(mite.h, mite.xy, cbind(env.red, dbmem.broad, dbmem.fine))
rda(mite.h, mite.xy, cbind(env.red, dbmem.broad, dbmem.fine))
)
if(linear_stat$`Pr(>F)`[1]<=0.05&&linear_stat$`Pr(>F)`[1]>0.01){text_linear = "Linear trend*"
}else if(linear_stat$`Pr(>F)`[1]<=0.01&&linear_stat$`Pr(>F)`[1]>0.001){text_linear = "Linear trend**"
}else if(linear_stat$`Pr(>F)`[1]<=0.001){text_linear = "Linear trend***"
}else{text_linear = "Linear trend"}
# Fraction [c], pure broad scale spatial
broad_stat = anova(rda
# (mite.h, dbmem.broad, cbind(env.red, mite.xy, dbmem.fine))
(mite.h, dbmem.broad, cbind(env.red, mite.xy, dbmem.fine))
)
if(broad_stat$`Pr(>F)`[1]<=0.05&&broad_stat$`Pr(>F)`[1]>0.01){text_broad = "Broader scale*"
}else if(broad_stat$`Pr(>F)`[1]<=0.01&&broad_stat$`Pr(>F)`[1]>0.001){text_broad = "Broader scale**"
}else if(broad_stat$`Pr(>F)`[1]<=0.001){text_broad = "Broader scale***"
}else{text_broad = "Broader scale"}
# Fraction [d], pure fine scale spatial
fine_stat = anova(rda
# (mite.h, dbmem.broad, cbind(env.red, mite.xy, dbmem.fine))
(mite.h, dbmem.fine, cbind(env.red, mite.xy, dbmem.broad))
)
if(fine_stat$`Pr(>F)`[1]<=0.05 && fine_stat$`Pr(>F)`[1]>0.01){text_fine = "Finer scale*"
}else if(fine_stat$`Pr(>F)`[1]<=0.01&&fine_stat$`Pr(>F)`[1]>0.001){text_fine = "Finer scale**"
}else if(fine_stat$`Pr(>F)`[1]<=0.001){text_fine = "Finer scale***"
}else{text_fine = "Finer scale"}
## 5. Mite - environment - trend - dbMEM variation partitioning
mite.varpart <-
#varpart(mite.h, env.red, mite.xy, dbmem.broad, dbmem.fine))
varpart(mite.h, env.red, mite.xy, dbmem.broad, dbmem.fine)
# Show the symbols of the fractions and plot their values
#par(mfrow = c(1,2))
#showvarparts(4, bg = c("red", "blue", "yellow", "green"))
plot(mite.varpart,
digits = 2,
bg = c("red", "blue", "yellow", "green"),
Xnames = c(text_env, text_linear, text_broad, text_fine)
)
mtext(paste0(expression("p-values: * \u2264 0.05, ** \u2264 0.01, *** \u2264 0.001")), side=1, line = 1)
Comparing these results with those of 2015, we observe that the variance explained remains highly stable. The changes occur when determining the dbMEMs used as inputs for modeling the broader-scale components as a larger number of dbMEMs were selected by the forward-selection procedure (2 for 2015, 3 for 2018 and 4 for 2020). The dbMEM the broader-scale dbMEM selected for 2018 & 2020 and not in 2015 appears to represent the orientation in active areas of the edifice, notably on the summit (dbMEM 2 in 2020). This may explain the significance of broad-scale dbMEMs in the variance partitioning plots of 2018 and 2020. In my opinion, we should keep the three dbMEMs selected for the 2018 dataset and probably include the dbMEM 22 for finer metre-scale patterns (see scalogram).
model = cov_chord_2015 ~ env_2015$`Main smoker`*env_2015$`Secondary smoker`*env_2015$`Diffusion zone`*env_2015$Flange*env_2015$`Topographic change`
adonis2(model, method = "euc", by = "term")
## Permutation test for adonis under reduced model
## Terms added sequentially (first to last)
## Permutation: free
## Number of permutations: 999
##
## adonis2(formula = model, method = "euc", by = "term")
## Df
## env_2015$`Main smoker` 1
## env_2015$`Secondary smoker` 1
## env_2015$`Diffusion zone` 1
## env_2015$Flange 1
## env_2015$`Topographic change` 1
## env_2015$`Main smoker`:env_2015$`Secondary smoker` 1
## env_2015$`Main smoker`:env_2015$`Diffusion zone` 1
## env_2015$`Secondary smoker`:env_2015$`Diffusion zone` 1
## env_2015$`Main smoker`:env_2015$Flange 1
## env_2015$`Secondary smoker`:env_2015$Flange 1
## env_2015$`Diffusion zone`:env_2015$Flange 1
## env_2015$`Main smoker`:env_2015$`Topographic change` 1
## env_2015$`Secondary smoker`:env_2015$`Topographic change` 1
## env_2015$`Diffusion zone`:env_2015$`Topographic change` 1
## env_2015$Flange:env_2015$`Topographic change` 1
## env_2015$`Main smoker`:env_2015$`Secondary smoker`:env_2015$`Diffusion zone` 1
## env_2015$`Main smoker`:env_2015$`Secondary smoker`:env_2015$Flange 1
## env_2015$`Main smoker`:env_2015$`Diffusion zone`:env_2015$Flange 1
## env_2015$`Secondary smoker`:env_2015$`Diffusion zone`:env_2015$Flange 1
## env_2015$`Main smoker`:env_2015$`Secondary smoker`:env_2015$`Topographic change` 1
## env_2015$`Main smoker`:env_2015$`Diffusion zone`:env_2015$`Topographic change` 1
## env_2015$`Secondary smoker`:env_2015$`Diffusion zone`:env_2015$`Topographic change` 1
## env_2015$`Main smoker`:env_2015$Flange:env_2015$`Topographic change` 1
## env_2015$`Secondary smoker`:env_2015$Flange:env_2015$`Topographic change` 1
## env_2015$`Diffusion zone`:env_2015$Flange:env_2015$`Topographic change` 1
## env_2015$`Main smoker`:env_2015$`Secondary smoker`:env_2015$`Diffusion zone`:env_2015$Flange 1
## env_2015$`Main smoker`:env_2015$`Secondary smoker`:env_2015$`Diffusion zone`:env_2015$`Topographic change` 1
## env_2015$`Main smoker`:env_2015$`Secondary smoker`:env_2015$Flange:env_2015$`Topographic change` 1
## env_2015$`Main smoker`:env_2015$`Diffusion zone`:env_2015$Flange:env_2015$`Topographic change` 1
## env_2015$`Secondary smoker`:env_2015$`Diffusion zone`:env_2015$Flange:env_2015$`Topographic change` 1
## env_2015$`Main smoker`:env_2015$`Secondary smoker`:env_2015$`Diffusion zone`:env_2015$Flange:env_2015$`Topographic change` 1
## Residual 168
## Total 199
## SumOfSqs
## env_2015$`Main smoker` 3.701
## env_2015$`Secondary smoker` 2.709
## env_2015$`Diffusion zone` 2.672
## env_2015$Flange 8.266
## env_2015$`Topographic change` 0.221
## env_2015$`Main smoker`:env_2015$`Secondary smoker` 0.485
## env_2015$`Main smoker`:env_2015$`Diffusion zone` 0.558
## env_2015$`Secondary smoker`:env_2015$`Diffusion zone` 1.388
## env_2015$`Main smoker`:env_2015$Flange 1.080
## env_2015$`Secondary smoker`:env_2015$Flange 0.464
## env_2015$`Diffusion zone`:env_2015$Flange 0.958
## env_2015$`Main smoker`:env_2015$`Topographic change` 0.415
## env_2015$`Secondary smoker`:env_2015$`Topographic change` 0.226
## env_2015$`Diffusion zone`:env_2015$`Topographic change` 0.594
## env_2015$Flange:env_2015$`Topographic change` 0.470
## env_2015$`Main smoker`:env_2015$`Secondary smoker`:env_2015$`Diffusion zone` 1.101
## env_2015$`Main smoker`:env_2015$`Secondary smoker`:env_2015$Flange 0.198
## env_2015$`Main smoker`:env_2015$`Diffusion zone`:env_2015$Flange 0.740
## env_2015$`Secondary smoker`:env_2015$`Diffusion zone`:env_2015$Flange 0.865
## env_2015$`Main smoker`:env_2015$`Secondary smoker`:env_2015$`Topographic change` 1.117
## env_2015$`Main smoker`:env_2015$`Diffusion zone`:env_2015$`Topographic change` 0.240
## env_2015$`Secondary smoker`:env_2015$`Diffusion zone`:env_2015$`Topographic change` 0.762
## env_2015$`Main smoker`:env_2015$Flange:env_2015$`Topographic change` 0.469
## env_2015$`Secondary smoker`:env_2015$Flange:env_2015$`Topographic change` 0.711
## env_2015$`Diffusion zone`:env_2015$Flange:env_2015$`Topographic change` 0.507
## env_2015$`Main smoker`:env_2015$`Secondary smoker`:env_2015$`Diffusion zone`:env_2015$Flange 0.615
## env_2015$`Main smoker`:env_2015$`Secondary smoker`:env_2015$`Diffusion zone`:env_2015$`Topographic change` 0.399
## env_2015$`Main smoker`:env_2015$`Secondary smoker`:env_2015$Flange:env_2015$`Topographic change` 0.533
## env_2015$`Main smoker`:env_2015$`Diffusion zone`:env_2015$Flange:env_2015$`Topographic change` 0.925
## env_2015$`Secondary smoker`:env_2015$`Diffusion zone`:env_2015$Flange:env_2015$`Topographic change` 0.415
## env_2015$`Main smoker`:env_2015$`Secondary smoker`:env_2015$`Diffusion zone`:env_2015$Flange:env_2015$`Topographic change` 0.220
## Residual 62.154
## Total 96.176
## R2
## env_2015$`Main smoker` 0.03849
## env_2015$`Secondary smoker` 0.02817
## env_2015$`Diffusion zone` 0.02779
## env_2015$Flange 0.08594
## env_2015$`Topographic change` 0.00229
## env_2015$`Main smoker`:env_2015$`Secondary smoker` 0.00504
## env_2015$`Main smoker`:env_2015$`Diffusion zone` 0.00580
## env_2015$`Secondary smoker`:env_2015$`Diffusion zone` 0.01444
## env_2015$`Main smoker`:env_2015$Flange 0.01122
## env_2015$`Secondary smoker`:env_2015$Flange 0.00482
## env_2015$`Diffusion zone`:env_2015$Flange 0.00996
## env_2015$`Main smoker`:env_2015$`Topographic change` 0.00432
## env_2015$`Secondary smoker`:env_2015$`Topographic change` 0.00235
## env_2015$`Diffusion zone`:env_2015$`Topographic change` 0.00617
## env_2015$Flange:env_2015$`Topographic change` 0.00488
## env_2015$`Main smoker`:env_2015$`Secondary smoker`:env_2015$`Diffusion zone` 0.01145
## env_2015$`Main smoker`:env_2015$`Secondary smoker`:env_2015$Flange 0.00206
## env_2015$`Main smoker`:env_2015$`Diffusion zone`:env_2015$Flange 0.00769
## env_2015$`Secondary smoker`:env_2015$`Diffusion zone`:env_2015$Flange 0.00899
## env_2015$`Main smoker`:env_2015$`Secondary smoker`:env_2015$`Topographic change` 0.01161
## env_2015$`Main smoker`:env_2015$`Diffusion zone`:env_2015$`Topographic change` 0.00250
## env_2015$`Secondary smoker`:env_2015$`Diffusion zone`:env_2015$`Topographic change` 0.00792
## env_2015$`Main smoker`:env_2015$Flange:env_2015$`Topographic change` 0.00487
## env_2015$`Secondary smoker`:env_2015$Flange:env_2015$`Topographic change` 0.00739
## env_2015$`Diffusion zone`:env_2015$Flange:env_2015$`Topographic change` 0.00527
## env_2015$`Main smoker`:env_2015$`Secondary smoker`:env_2015$`Diffusion zone`:env_2015$Flange 0.00639
## env_2015$`Main smoker`:env_2015$`Secondary smoker`:env_2015$`Diffusion zone`:env_2015$`Topographic change` 0.00415
## env_2015$`Main smoker`:env_2015$`Secondary smoker`:env_2015$Flange:env_2015$`Topographic change` 0.00554
## env_2015$`Main smoker`:env_2015$`Diffusion zone`:env_2015$Flange:env_2015$`Topographic change` 0.00961
## env_2015$`Secondary smoker`:env_2015$`Diffusion zone`:env_2015$Flange:env_2015$`Topographic change` 0.00431
## env_2015$`Main smoker`:env_2015$`Secondary smoker`:env_2015$`Diffusion zone`:env_2015$Flange:env_2015$`Topographic change` 0.00228
## Residual 0.64626
## Total 1.00000
## F
## env_2015$`Main smoker` 10.0049
## env_2015$`Secondary smoker` 7.3232
## env_2015$`Diffusion zone` 7.2236
## env_2015$Flange 22.3417
## env_2015$`Topographic change` 0.5966
## env_2015$`Main smoker`:env_2015$`Secondary smoker` 1.3104
## env_2015$`Main smoker`:env_2015$`Diffusion zone` 1.5087
## env_2015$`Secondary smoker`:env_2015$`Diffusion zone` 3.7525
## env_2015$`Main smoker`:env_2015$Flange 2.9180
## env_2015$`Secondary smoker`:env_2015$Flange 1.2531
## env_2015$`Diffusion zone`:env_2015$Flange 2.5883
## env_2015$`Main smoker`:env_2015$`Topographic change` 1.1229
## env_2015$`Secondary smoker`:env_2015$`Topographic change` 0.6098
## env_2015$`Diffusion zone`:env_2015$`Topographic change` 1.6049
## env_2015$Flange:env_2015$`Topographic change` 1.2697
## env_2015$`Main smoker`:env_2015$`Secondary smoker`:env_2015$`Diffusion zone` 2.9764
## env_2015$`Main smoker`:env_2015$`Secondary smoker`:env_2015$Flange 0.5354
## env_2015$`Main smoker`:env_2015$`Diffusion zone`:env_2015$Flange 2.0003
## env_2015$`Secondary smoker`:env_2015$`Diffusion zone`:env_2015$Flange 2.3374
## env_2015$`Main smoker`:env_2015$`Secondary smoker`:env_2015$`Topographic change` 3.0179
## env_2015$`Main smoker`:env_2015$`Diffusion zone`:env_2015$`Topographic change` 0.6497
## env_2015$`Secondary smoker`:env_2015$`Diffusion zone`:env_2015$`Topographic change` 2.0596
## env_2015$`Main smoker`:env_2015$Flange:env_2015$`Topographic change` 1.2664
## env_2015$`Secondary smoker`:env_2015$Flange:env_2015$`Topographic change` 1.9214
## env_2015$`Diffusion zone`:env_2015$Flange:env_2015$`Topographic change` 1.3712
## env_2015$`Main smoker`:env_2015$`Secondary smoker`:env_2015$`Diffusion zone`:env_2015$Flange 1.6612
## env_2015$`Main smoker`:env_2015$`Secondary smoker`:env_2015$`Diffusion zone`:env_2015$`Topographic change` 1.0785
## env_2015$`Main smoker`:env_2015$`Secondary smoker`:env_2015$Flange:env_2015$`Topographic change` 1.4411
## env_2015$`Main smoker`:env_2015$`Diffusion zone`:env_2015$Flange:env_2015$`Topographic change` 2.4990
## env_2015$`Secondary smoker`:env_2015$`Diffusion zone`:env_2015$Flange:env_2015$`Topographic change` 1.1217
## env_2015$`Main smoker`:env_2015$`Secondary smoker`:env_2015$`Diffusion zone`:env_2015$Flange:env_2015$`Topographic change` 0.5935
## Residual
## Total
## Pr(>F)
## env_2015$`Main smoker` 0.001
## env_2015$`Secondary smoker` 0.001
## env_2015$`Diffusion zone` 0.002
## env_2015$Flange 0.001
## env_2015$`Topographic change` 0.698
## env_2015$`Main smoker`:env_2015$`Secondary smoker` 0.260
## env_2015$`Main smoker`:env_2015$`Diffusion zone` 0.204
## env_2015$`Secondary smoker`:env_2015$`Diffusion zone` 0.002
## env_2015$`Main smoker`:env_2015$Flange 0.015
## env_2015$`Secondary smoker`:env_2015$Flange 0.278
## env_2015$`Diffusion zone`:env_2015$Flange 0.027
## env_2015$`Main smoker`:env_2015$`Topographic change` 0.322
## env_2015$`Secondary smoker`:env_2015$`Topographic change` 0.678
## env_2015$`Diffusion zone`:env_2015$`Topographic change` 0.165
## env_2015$Flange:env_2015$`Topographic change` 0.255
## env_2015$`Main smoker`:env_2015$`Secondary smoker`:env_2015$`Diffusion zone` 0.009
## env_2015$`Main smoker`:env_2015$`Secondary smoker`:env_2015$Flange 0.757
## env_2015$`Main smoker`:env_2015$`Diffusion zone`:env_2015$Flange 0.073
## env_2015$`Secondary smoker`:env_2015$`Diffusion zone`:env_2015$Flange 0.045
## env_2015$`Main smoker`:env_2015$`Secondary smoker`:env_2015$`Topographic change` 0.010
## env_2015$`Main smoker`:env_2015$`Diffusion zone`:env_2015$`Topographic change` 0.668
## env_2015$`Secondary smoker`:env_2015$`Diffusion zone`:env_2015$`Topographic change` 0.068
## env_2015$`Main smoker`:env_2015$Flange:env_2015$`Topographic change` 0.259
## env_2015$`Secondary smoker`:env_2015$Flange:env_2015$`Topographic change` 0.085
## env_2015$`Diffusion zone`:env_2015$Flange:env_2015$`Topographic change` 0.231
## env_2015$`Main smoker`:env_2015$`Secondary smoker`:env_2015$`Diffusion zone`:env_2015$Flange 0.142
## env_2015$`Main smoker`:env_2015$`Secondary smoker`:env_2015$`Diffusion zone`:env_2015$`Topographic change` 0.383
## env_2015$`Main smoker`:env_2015$`Secondary smoker`:env_2015$Flange:env_2015$`Topographic change` 0.201
## env_2015$`Main smoker`:env_2015$`Diffusion zone`:env_2015$Flange:env_2015$`Topographic change` 0.024
## env_2015$`Secondary smoker`:env_2015$`Diffusion zone`:env_2015$Flange:env_2015$`Topographic change` 0.310
## env_2015$`Main smoker`:env_2015$`Secondary smoker`:env_2015$`Diffusion zone`:env_2015$Flange:env_2015$`Topographic change` 0.704
## Residual
## Total
##
## env_2015$`Main smoker` ***
## env_2015$`Secondary smoker` ***
## env_2015$`Diffusion zone` **
## env_2015$Flange ***
## env_2015$`Topographic change`
## env_2015$`Main smoker`:env_2015$`Secondary smoker`
## env_2015$`Main smoker`:env_2015$`Diffusion zone`
## env_2015$`Secondary smoker`:env_2015$`Diffusion zone` **
## env_2015$`Main smoker`:env_2015$Flange *
## env_2015$`Secondary smoker`:env_2015$Flange
## env_2015$`Diffusion zone`:env_2015$Flange *
## env_2015$`Main smoker`:env_2015$`Topographic change`
## env_2015$`Secondary smoker`:env_2015$`Topographic change`
## env_2015$`Diffusion zone`:env_2015$`Topographic change`
## env_2015$Flange:env_2015$`Topographic change`
## env_2015$`Main smoker`:env_2015$`Secondary smoker`:env_2015$`Diffusion zone` **
## env_2015$`Main smoker`:env_2015$`Secondary smoker`:env_2015$Flange
## env_2015$`Main smoker`:env_2015$`Diffusion zone`:env_2015$Flange .
## env_2015$`Secondary smoker`:env_2015$`Diffusion zone`:env_2015$Flange *
## env_2015$`Main smoker`:env_2015$`Secondary smoker`:env_2015$`Topographic change` **
## env_2015$`Main smoker`:env_2015$`Diffusion zone`:env_2015$`Topographic change`
## env_2015$`Secondary smoker`:env_2015$`Diffusion zone`:env_2015$`Topographic change` .
## env_2015$`Main smoker`:env_2015$Flange:env_2015$`Topographic change`
## env_2015$`Secondary smoker`:env_2015$Flange:env_2015$`Topographic change` .
## env_2015$`Diffusion zone`:env_2015$Flange:env_2015$`Topographic change`
## env_2015$`Main smoker`:env_2015$`Secondary smoker`:env_2015$`Diffusion zone`:env_2015$Flange
## env_2015$`Main smoker`:env_2015$`Secondary smoker`:env_2015$`Diffusion zone`:env_2015$`Topographic change`
## env_2015$`Main smoker`:env_2015$`Secondary smoker`:env_2015$Flange:env_2015$`Topographic change`
## env_2015$`Main smoker`:env_2015$`Diffusion zone`:env_2015$Flange:env_2015$`Topographic change` *
## env_2015$`Secondary smoker`:env_2015$`Diffusion zone`:env_2015$Flange:env_2015$`Topographic change`
## env_2015$`Main smoker`:env_2015$`Secondary smoker`:env_2015$`Diffusion zone`:env_2015$Flange:env_2015$`Topographic change`
## Residual
## Total
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
cov_chord_all = rbind(cov_chord_2015,cov_chord_2018, cov_chord_2020)
env_all = rbind(env_2015, env_2018, env_2020)
Sites = as.factor(rep(seq(1:nrow(cov_chord_2015)),3))
Time = c(rep(2015,nrow(cov_chord_2015)),rep(2018,nrow(cov_chord_2018)),rep(2020,nrow(cov_chord_2020)))
Side = rep(Matrix_RDA_group_2015$Side,3)
model = cov_chord_all ~ (env_all$`Main smoker`*Time)+(env_all$`Secondary smoker`*Time)+(env_all$`Diffusion zone`*Time)+(env_all$Flange+env_all$`Topographic change`*Time)
adonis2(model, method = "euc", by = "term", permutations = 499)
## Permutation test for adonis under reduced model
## Terms added sequentially (first to last)
## Permutation: free
## Number of permutations: 499
##
## adonis2(formula = model, permutations = 499, method = "euc", by = "term")
## Df SumOfSqs R2 F Pr(>F)
## env_all$`Main smoker` 1 7.180 0.02316 16.3198 0.002 **
## Time 1 3.936 0.01270 8.9459 0.002 **
## env_all$`Secondary smoker` 1 9.199 0.02967 20.9071 0.002 **
## env_all$`Diffusion zone` 1 1.016 0.00328 2.3094 0.038 *
## env_all$Flange 1 24.101 0.07775 54.7777 0.002 **
## env_all$`Topographic change` 1 1.925 0.00621 4.3760 0.004 **
## env_all$`Main smoker`:Time 1 0.524 0.00169 1.1907 0.292
## Time:env_all$`Secondary smoker` 1 2.050 0.00661 4.6598 0.002 **
## Time:env_all$`Diffusion zone` 1 0.833 0.00269 1.8923 0.098 .
## Time:env_all$`Topographic change` 1 0.084 0.00027 0.1903 0.984
## Residual 589 259.151 0.83597
## Total 599 310.000 1.00000
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
E = matrix(ncol=2)
for (i in (1:(ncol(mst_)-1))){
for (j in ((1+i):(nrow(mst_)))){
#print(paste0(as.character(i),"-",as.character(j)))
if(mst_[j,i]==1){E=rbind(E,c(j,i))}}}
E = E[-1,]
diss_eucl_cov_chord_2015 = vegdist(cov_2015, method="bray")
#diss_eucl_cov_chord_2015 = dist(cov_chord_2015, method="euclidean")
cclust_2015 = constr.hclust(diss_eucl_cov_chord_2015, method = "ward.D2", links = E, coords=Centroids)
k=5
stats:::plot.hclust(cclust_2015, hang=-1)
rect.hclust(cclust_2015, k=k, border="red")
plot(cclust_2015, links=TRUE, k=k, col=seq(1,k))
legend(x=30,y=4, legend = c(paste0(rep("g",k),seq(1,k))), col=seq(1,k), pch=19)
# We can redo that with transitions of assemblages in each group....
We randomly chosen 5 groups to plot the clusters in space. According to that spatial distribution, we can already see that the spatial distribution of the groups are explained by microbial mats in the g5. Then, this distribution is explained by different compositions from empty mussel shells to zoanthids. We explain the differences of these groups according to Simper analyses.
group = cutree(cclust_2015, k)
simper(cov_2015, group, permutations = 999)
## cumulative contributions of most influential species:
##
## $`1_2`
## S. mesatlantica Medium B. azoricus Microbial mat Large B. azoricus
## 0.2876011 0.5055950 0.6702926 0.8179775
##
## $`1_3`
## Empty shell S. mesatlantica Microbial mat Large B. azoricus
## 0.2530395 0.4807190 0.6257961 0.7538165
##
## $`1_4`
## S. mesatlantica Zoanthid sp. Microbial mat Medium B. azoricus
## 0.2426589 0.4241419 0.5827847 0.7324369
##
## $`1_5`
## Empty shell S. mesatlantica Microbial mat Large B. azoricus
## 0.2622493 0.4810949 0.6339730 0.7572220
##
## $`2_3`
## Empty shell Medium B. azoricus Microbial mat S. mesatlantica
## 0.2935777 0.5388948 0.6894564 0.8043913
##
## $`2_4`
## Zoanthid sp. Medium B. azoricus Microbial mat S. mesatlantica
## 0.2334370 0.4520952 0.6290334 0.7621893
##
## $`2_5`
## Empty shell Medium B. azoricus Microbial mat
## 0.3120701 0.5373474 0.7021933
##
## $`3_4`
## Empty shell Zoanthid sp. Medium B. azoricus
## 0.3595336 0.6103882 0.8079715
##
## $`3_5`
## Empty shell Small B. azoricus Medium B. azoricus
## 0.4094079 0.6059561 0.7562709
##
## $`4_5`
## Empty shell Zoanthid sp. Medium B. azoricus
## 0.3751849 0.6321336 0.8148523
I am aware that hierarchical clustering may be difficult to explain as it needs to delimit the contribution of each assemblage one by one for each pair of groups separately. However, that may be the most interesting way to decompose the variability that we observe at ET. In the end, we could build a spatially-constrained hierarchical clustering considering a matrix that contains the temporal information! What we could do is to use the balance from 2015 to 2020 for each assemblage (+xm² or -Xm²), or even the surface provided by a given assemblage transition (i.e. categories will be 1a.1b.1b like a sequence of assemblage transition, but there may be a lot of zeros then). We need to talk about this with Pierre.
E = matrix(ncol=2)
for (i in (1:(ncol(mst_)-1))){
for (j in ((1+i):(nrow(mst_)))){
#print(paste0(as.character(i),"-",as.character(j)))
if(mst_[j,i]==1){E=rbind(E,c(j,i))}}}
E = E[-1,]
diss_eucl_cov_chord_2015 = vegdist(cov_2015, method="bray")
#diss_eucl_cov_chord_2015 = dist(cov_chord_2015, method="euclidean")
cclust_2015 = constr.hclust(diss_eucl_cov_chord_2015, method = "ward.D2", links = E, coords=Centroids)
stats:::plot.hclust(cclust_2015, hang=-1)
rect.hclust(cclust_2015, k=10, border="red")
plot(cclust_2015, links=TRUE, k=10)
# We can redo that with transitions of assemblages in each group....