NMDS
2023-08-13
Ordination with vegan
Data
data(dune)
data(dune.env)
data(varespec)
data(varechem)
Analysis
M1 <- dune
M2 <- dune.env
nmds <- metaMDS(M1 , distance = "bray", k=2)
Run 0 stress 0.1192678
Run 1 stress 0.1183186
... New best solution
... Procrustes: rmse 0.02026967 max resid 0.06495895
Run 2 stress 0.2069997
Run 3 stress 0.1192679
Run 4 stress 0.1183186
... New best solution
... Procrustes: rmse 7.908497e-06 max resid 2.407945e-05
... Similar to previous best
Run 5 stress 0.1192678
Run 6 stress 0.1183186
... Procrustes: rmse 6.91075e-07 max resid 2.078912e-06
... Similar to previous best
Run 7 stress 0.1183186
... Procrustes: rmse 1.28847e-05 max resid 4.209671e-05
... Similar to previous best
Run 8 stress 0.1183186
... Procrustes: rmse 1.742262e-05 max resid 5.521291e-05
... Similar to previous best
Run 9 stress 0.1183186
... New best solution
... Procrustes: rmse 2.518232e-06 max resid 6.11417e-06
... Similar to previous best
Run 10 stress 0.1939202
Run 11 stress 0.1192679
Run 12 stress 0.1183186
... Procrustes: rmse 1.006626e-05 max resid 3.418378e-05
... Similar to previous best
Run 13 stress 0.2389616
Run 14 stress 0.1183186
... Procrustes: rmse 1.442631e-05 max resid 4.421442e-05
... Similar to previous best
Run 15 stress 0.1183186
... Procrustes: rmse 1.08212e-05 max resid 3.343553e-05
... Similar to previous best
Run 16 stress 0.1183186
... New best solution
... Procrustes: rmse 2.652172e-06 max resid 8.530837e-06
... Similar to previous best
Run 17 stress 0.1183186
... Procrustes: rmse 5.245032e-06 max resid 1.663786e-05
... Similar to previous best
Run 18 stress 0.1183186
... Procrustes: rmse 1.597972e-05 max resid 5.013583e-05
... Similar to previous best
Run 19 stress 0.1183186
... Procrustes: rmse 6.85407e-06 max resid 2.214136e-05
... Similar to previous best
Run 20 stress 0.1808911
*** Best solution repeated 4 times
EnvFit
ord.fit <- envfit(nmds ~ Management, data=dune.env, perm=999)
ord.fit
***FACTORS:
Centroids:
NMDS1 NMDS2
ManagementBF -0.4534 -0.0102
ManagementHF -0.2636 -0.1282
ManagementNM 0.2958 0.5790
ManagementSF 0.1506 -0.4670
Goodness of fit:
r2 Pr(>r)
Management 0.4134 0.011 *
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Permutation: free
Number of permutations: 999
Plot
co= c("blue", "red", "green", "orange")
shape=c(18,16,19,14)
plot(nmds$points, col=co[M2$Management], pch=shape[M2$Management], cex=1.2, main="community composition", xlab= "axis 1", ylab="axis 2")
ordiellipse(nmds, col= co , groups= M2$Management, label = TRUE)
txt= c("HF","BF","NM","SF")
legend('topleft',legend= c("HF","BF","NM","SF") , pch=c(18,16,19,14), col=co, cex=1, bty= "y")

Testing for differences (Permutations)
#Bootstrapping and testing for differences between the groups
fit <- adonis2(M1 ~ Management, data= M2, permutations=999, method="bray")
fit
Permutation test for adonis under reduced model
Terms added sequentially (first to last)
Permutation: free
Number of permutations: 999
adonis2(formula = M1 ~ Management, data = M2, permutations = 999, method = "bray")
Df SumOfSqs R2 F Pr(>F)
Management 3 1.4686 0.34161 2.7672 0.004 **
Residual 16 2.8304 0.65839
Total 19 4.2990 1.00000
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
#Check assumption of homogeneity of multivariate dispersion
distances_data <- vegdist(M1)
anova(betadisper(distances_data, M2$Management))
Analysis of Variance Table
Response: Distances
Df Sum Sq Mean Sq F value Pr(>F)
Groups 3 0.13831 0.046104 1.9506 0.1622
Residuals 16 0.37816 0.023635
ggplot2
#Extract the axes scores
datascores <- as.data.frame(scores(nmds$points)) #extract the site scores
#Add/calculate spider diagram
scores <- cbind(as.data.frame(datascores), Management = M2$Management)
centroids <- aggregate(cbind(MDS1, MDS2) ~ Management, data = scores, FUN = mean)
seg <- merge(scores, setNames(centroids, c('Management','oNMDS1','oNMDS2')),
by = 'Management', sort = FALSE)
#plot
p <- ggplot(data=scores, aes(x = MDS1, y = MDS2, colour = Management)) +
geom_segment(data = seg,
mapping = aes(xend = oNMDS1, yend = oNMDS2)) + # add spiders
geom_point(data = centroids, size = 4) + # add centroids
geom_point() +
coord_fixed() +
theme_bw() +
theme(legend.position="right",legend.text=element_text(size=10),legend.direction='vertical')
ggplotly(p)
LS0tDQp0aXRsZTogIlZlZ2FuIE11bHRpdmFyaWF0ZSBBbmFseXNpcyINCmF1dGhvcjogIkZlZGVyaWNvIEouIFZpbGxhdG9ybyINCm91dHB1dDogaHRtbF9ub3RlYm9vaw0KLS0tDQoNCk5NRFMNCj09PT09PT09PT09PT09PT09PT09PT09DQoNCiMjIyBgciBhcy5jaGFyYWN0ZXIoU3lzLkRhdGUoKSlgDQoNCmBgYHtyICxlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFfQ0KIyBpbmNsdWRlIHRoaXMgY29kZSBjaHVuayBhcy1pcyB0byBzZXQgb3B0aW9ucw0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGNvbW1lbnQ9TkEsIHByb21wdD1UUlVFKQ0KDQpgYGANCg0KIyMjIE9yZGluYXRpb24gd2l0aCB2ZWdhbg0KYGBge3IgUGFxdWV0ZXMsIGluY2x1ZGU9RkFMU0UsICBtZXNzYWdlPUZBTFNFfQ0KbGlicmFyeSh2ZWdhbikNCmxpYnJhcnkoY2FyKQ0KbGlicmFyeShnZ3Bsb3QyKQ0KbGlicmFyeShyZWFkeGwpDQpsaWJyYXJ5KGdnc2NpKQ0KbGlicmFyeShnZ3JlcGVsKQ0KbGlicmFyeShnZ2ZvcmNlKQ0KbGlicmFyeShwbG90bHkpDQpsaWJyYXJ5KHJnbCkNCmxpYnJhcnkobWdjdikNCmxpYnJhcnkoZ29vZ2xlc2hlZXRzNCkNCmBgYCAgDQojIyMgRGF0YQ0KYGBge3IgRGF0YX0NCmRhdGEoZHVuZSkNCmRhdGEoZHVuZS5lbnYpDQoNCmRhdGEodmFyZXNwZWMpDQpkYXRhKHZhcmVjaGVtKQ0KDQpgYGAgIA0KDQojIyMgQW5hbHlzaXMNCmBgYHtyIE5NRFN9DQpNMSA8LSBkdW5lDQpNMiA8LSBkdW5lLmVudg0KDQpubWRzIDwtIG1ldGFNRFMoTTEgLCBkaXN0YW5jZSA9ICJicmF5Iiwgaz0yKQ0KDQpgYGAgIA0KDQojIyMgRW52Rml0DQpgYGB7cn0NCm9yZC5maXQgPC0gZW52Zml0KG5tZHMgfiBNYW5hZ2VtZW50LCBkYXRhPWR1bmUuZW52LCBwZXJtPTk5OSkNCm9yZC5maXQNCmBgYCAgDQoNCiMjIyBQbG90DQpgYGB7cn0NCmNvPSBjKCJibHVlIiwgInJlZCIsICJncmVlbiIsICJvcmFuZ2UiKQ0Kc2hhcGU9YygxOCwxNiwxOSwxNCkNCnBsb3Qobm1kcyRwb2ludHMsIGNvbD1jb1tNMiRNYW5hZ2VtZW50XSwgcGNoPXNoYXBlW00yJE1hbmFnZW1lbnRdLCBjZXg9MS4yLCBtYWluPSJjb21tdW5pdHkgY29tcG9zaXRpb24iLCB4bGFiPSAiYXhpcyAxIiwgeWxhYj0iYXhpcyAyIikNCg0Kb3JkaWVsbGlwc2Uobm1kcywgY29sPSBjbyAsIGdyb3Vwcz0gTTIkTWFuYWdlbWVudCwgbGFiZWwgPSBUUlVFKQ0KDQp0eHQ9IGMoIkhGIiwiQkYiLCJOTSIsIlNGIikNCmxlZ2VuZCgndG9wbGVmdCcsbGVnZW5kPSBjKCJIRiIsIkJGIiwiTk0iLCJTRiIpICwgcGNoPWMoMTgsMTYsMTksMTQpLCBjb2w9Y28sIGNleD0xLCBidHk9ICJ5IikNCmBgYCAgDQoNCiMjIyBUZXN0aW5nIGZvciBkaWZmZXJlbmNlcyAoUGVybXV0YXRpb25zKQ0KYGBge3J9DQojQm9vdHN0cmFwcGluZyBhbmQgdGVzdGluZyBmb3IgZGlmZmVyZW5jZXMgYmV0d2VlbiB0aGUgZ3JvdXBzDQpmaXQgPC0gYWRvbmlzMihNMSB+IE1hbmFnZW1lbnQsIGRhdGE9IE0yLCBwZXJtdXRhdGlvbnM9OTk5LCBtZXRob2Q9ImJyYXkiKQ0KZml0DQoNCiNDaGVjayBhc3N1bXB0aW9uIG9mIGhvbW9nZW5laXR5IG9mIG11bHRpdmFyaWF0ZSBkaXNwZXJzaW9uDQpkaXN0YW5jZXNfZGF0YSA8LSB2ZWdkaXN0KE0xKQ0KYW5vdmEoYmV0YWRpc3BlcihkaXN0YW5jZXNfZGF0YSwgTTIkTWFuYWdlbWVudCkpDQpgYGAgIA0KZ2dwbG90Mg0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCmBgYHtyfQ0KI0V4dHJhY3QgdGhlIGF4ZXMgc2NvcmVzDQpkYXRhc2NvcmVzIDwtIGFzLmRhdGEuZnJhbWUoc2NvcmVzKG5tZHMkcG9pbnRzKSkgICNleHRyYWN0IHRoZSBzaXRlIHNjb3Jlcw0KDQojQWRkL2NhbGN1bGF0ZSBzcGlkZXIgZGlhZ3JhbQ0Kc2NvcmVzIDwtIGNiaW5kKGFzLmRhdGEuZnJhbWUoZGF0YXNjb3JlcyksIE1hbmFnZW1lbnQgPSBNMiRNYW5hZ2VtZW50KQ0KY2VudHJvaWRzIDwtIGFnZ3JlZ2F0ZShjYmluZChNRFMxLCBNRFMyKSB+IE1hbmFnZW1lbnQsIGRhdGEgPSBzY29yZXMsIEZVTiA9IG1lYW4pDQpzZWcgPC0gbWVyZ2Uoc2NvcmVzLCBzZXROYW1lcyhjZW50cm9pZHMsIGMoJ01hbmFnZW1lbnQnLCdvTk1EUzEnLCdvTk1EUzInKSksDQogICAgICAgICAgICAgYnkgPSAnTWFuYWdlbWVudCcsIHNvcnQgPSBGQUxTRSkNCg0KI3Bsb3QNCnAgPC0gZ2dwbG90KGRhdGE9c2NvcmVzLCBhZXMoeCA9IE1EUzEsIHkgPSBNRFMyLCBjb2xvdXIgPSBNYW5hZ2VtZW50KSkgKw0KICBnZW9tX3NlZ21lbnQoZGF0YSA9IHNlZywNCiAgICAgICAgICAgICAgIG1hcHBpbmcgPSBhZXMoeGVuZCA9IG9OTURTMSwgeWVuZCA9IG9OTURTMikpICsgIyBhZGQgc3BpZGVycw0KICBnZW9tX3BvaW50KGRhdGEgPSBjZW50cm9pZHMsIHNpemUgPSA0KSArICAgICAgICAgICAgICAgICAgICAjIGFkZCBjZW50cm9pZHMNCiAgZ2VvbV9wb2ludCgpICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogIGNvb3JkX2ZpeGVkKCkgKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgdGhlbWVfYncoKSArIA0KICB0aGVtZShsZWdlbmQucG9zaXRpb249InJpZ2h0IixsZWdlbmQudGV4dD1lbGVtZW50X3RleHQoc2l6ZT0xMCksbGVnZW5kLmRpcmVjdGlvbj0ndmVydGljYWwnKQ0KDQpnZ3Bsb3RseShwKQ0KYGBgICANCg==