Chapter 5 Beta diversity

load("data/data.Rdata")
beta_q0n <- genome_counts_filt %>%
  column_to_rownames(., "genome") %>%
  filter(rowSums(. != 0, na.rm = TRUE) > 0) %>%
  select_if(~!all(. == 0)) %>%
  hillpair(., q = 0)

beta_q1n <- genome_counts_filt %>%
  column_to_rownames(., "genome") %>%
  filter(rowSums(. != 0, na.rm = TRUE) > 0) %>%
  select_if(~!all(. == 0)) %>%
  hillpair(., q = 1)

beta_q1p <- genome_counts_filt %>%
  column_to_rownames(., "genome") %>%
  filter(rowSums(. != 0, na.rm = TRUE) > 0) %>%
  select_if(~!all(. == 0)) %>%
  hillpair(., q = 1, tree = keep.tip(genome_tree,tip=rownames(.)))

dist <- genome_gifts %>%
    to.elements(., GIFT_db) %>%
    traits2dist(., method="gower")

beta_q1f <- genome_counts_filt %>%
  column_to_rownames(., "genome") %>%
  filter(rowSums(. != 0, na.rm = TRUE) > 0) %>%
  select_if(~!all(. == 0)) %>%
  hillpair(., q = 1, dist = dist[rownames(.), rownames(.)])

save(beta_q0n, beta_q1n, beta_q1p, file="data/beta_diversity.Rdata")

5.1 Permanova

load("data/beta_diversity.Rdata")
#Richness
betadisper(beta_q0n$C, sample_metadata$treatment[sample_metadata$treatment != "TG0"]) %>% permutest(., pairwise = TRUE) 

Permutation test for homogeneity of multivariate dispersions
Permutation: free
Number of permutations: 999

Response: Distances
           Df  Sum Sq  Mean Sq     F N.Perm Pr(>F)
Groups      4 0.11176 0.027939 1.431    999  0.234
Residuals 107 2.08914 0.019525                    

Pairwise comparisons:
(Observed p-value below diagonal, permuted p-value above diagonal)
         TG1      TG2      TG3      TG4   TG5
TG1          0.489000 0.067000 0.223000 0.627
TG2 0.482966          0.185000 0.454000 0.756
TG3 0.080345 0.175034          0.448000 0.100
TG4 0.209775 0.478109 0.456447          0.316
TG5 0.643690 0.754593 0.110414 0.307687      
adonis2(beta_q0n$C ~ treatment * day, 
        data = sample_metadata %>% filter(treatment != "TG0") %>% arrange(match(sample,labels(beta_q1n$C))), 
        permutations = 999) %>%
        broom::tidy() %>%
        tt()
term df SumOfSqs R2 statistic p.value
Model 9 7.484587 0.6208242 18.55606 0.001
Residual 102 4.571301 0.3791758 NA NA
Total 111 12.055888 1.0000000 NA NA
#Neutral diversity
betadisper(beta_q1n$C, sample_metadata$treatment[sample_metadata$treatment != "TG0"]) %>% permutest(., pairwise = TRUE) 

Permutation test for homogeneity of multivariate dispersions
Permutation: free
Number of permutations: 999

Response: Distances
           Df  Sum Sq   Mean Sq      F N.Perm Pr(>F)
Groups      4 0.03083 0.0077065 0.3238    999  0.865
Residuals 107 2.54696 0.0238034                     

Pairwise comparisons:
(Observed p-value below diagonal, permuted p-value above diagonal)
        TG1     TG2     TG3     TG4   TG5
TG1         0.88500 0.40900 0.50400 0.775
TG2 0.88020         0.42800 0.57000 0.871
TG3 0.36285 0.42428         0.74700 0.508
TG4 0.50197 0.59266 0.75648         0.694
TG5 0.76469 0.87585 0.52248 0.71357      
adonis2(beta_q1n$C ~ treatment * day, 
        data = sample_metadata %>% filter(treatment != "TG0") %>% arrange(match(sample,labels(beta_q1n$C))), 
        permutations = 999) %>%
        broom::tidy() %>%
        tt()
term df SumOfSqs R2 statistic p.value
Model 9 8.812652 0.6062983 17.45327 0.001
Residual 102 5.722522 0.3937017 NA NA
Total 111 14.535174 1.0000000 NA NA
#Phylogenetic diversity
betadisper(beta_q1p$C, sample_metadata$treatment[sample_metadata$treatment != "TG0"]) %>% permutest(., pairwise = TRUE) 

Permutation test for homogeneity of multivariate dispersions
Permutation: free
Number of permutations: 999

Response: Distances
           Df   Sum Sq   Mean Sq      F N.Perm Pr(>F)
Groups      4 0.007294 0.0018234 0.6588    999  0.604
Residuals 107 0.296161 0.0027679                     

Pairwise comparisons:
(Observed p-value below diagonal, permuted p-value above diagonal)
        TG1     TG2     TG3     TG4   TG5
TG1         0.53300 0.14700 0.19000 0.265
TG2 0.52164         0.33700 0.40600 0.498
TG3 0.15794 0.32125         0.89900 0.891
TG4 0.21331 0.40937 0.90278         0.981
TG5 0.27885 0.48101 0.88912 0.97933      
adonis2(beta_q1p$C ~ treatment * day, 
        data = sample_metadata %>% filter(treatment != "TG0") %>% arrange(match(sample,labels(beta_q1p$C))), 
        permutations = 999) %>%
        broom::tidy() %>%
        tt()
term df SumOfSqs R2 statistic p.value
Model 9 0.5927034 0.5435966 13.4985 0.001
Residual 102 0.4976333 0.4564034 NA NA
Total 111 1.0903367 1.0000000 NA NA
#Functional diversity
betadisper(beta_q1f$C, sample_metadata$treatment[sample_metadata$treatment != "TG0"]) %>% permutest(., pairwise = TRUE) 

Permutation test for homogeneity of multivariate dispersions
Permutation: free
Number of permutations: 999

Response: Distances
           Df   Sum Sq    Mean Sq      F N.Perm Pr(>F)
Groups      4 0.001863 0.00046574 0.9798    999  0.443
Residuals 107 0.050863 0.00047536                     

Pairwise comparisons:
(Observed p-value below diagonal, permuted p-value above diagonal)
        TG1     TG2     TG3     TG4   TG5
TG1         0.65600 0.22600 0.47200 0.368
TG2 0.66449         0.11700 0.21900 0.211
TG3 0.20079 0.11202         0.52200 0.694
TG4 0.43259 0.24866 0.51631         0.816
TG5 0.34760 0.20468 0.69546 0.80418      
adonis2(beta_q1f$C ~ treatment * day, 
        data = sample_metadata %>% filter(treatment != "TG0") %>% arrange(match(sample,labels(beta_q1f$C))), 
        permutations = 999) %>%
        broom::tidy() %>%
        tt()
term df SumOfSqs R2 statistic p.value
Model 9 0.01178871 0.120672 1.555297 0.277
Residual 102 0.08590348 0.879328 NA NA
Total 111 0.09769219 1.000000 NA NA

5.2 Richness

nmds_richness <- beta_q0n$S %>%
  vegan::metaMDS(., trymax = 500, k = 2, trace=0) %>%
  vegan::scores() %>%
  as_tibble(., rownames = "sample") %>%
  dplyr::left_join(sample_metadata, by = join_by(sample == sample)) %>%
  group_by(treatment,day) %>%
  mutate(x_cen = median(NMDS1, na.rm = TRUE)) %>%
  mutate(y_cen = median(NMDS2, na.rm = TRUE)) %>%
  ungroup() 

5.2.1 All time points

nmds_richness %>%
  ggplot(aes(x = NMDS1, y = NMDS2, color = treatment, fill = treatment, shape = as.factor(day))) +
    scale_color_manual(name="Treatment",
          breaks=c("TG1","TG2","TG3","TG4","TG5"),
          values=c("#4059AE", "#6A9AC3","#97D8C4","#AFD699","#F3B942")) +
    scale_fill_manual(name="Treatment",
          breaks=c("TG1","TG2","TG3","TG4","TG5"),
          values=c("#4059AE50", "#6A9AC350","#97D8C450","#AFD69950","#F3B94250")) +
    scale_shape_manual(name="Day",
          breaks=c(7,14,21,28,35),
          values=c(21,22,23,24,25)) +
    geom_point(size = 4) +
    #   stat_ellipse(aes(color = beta_q1n_nmds$Groups))+
    geom_segment(aes(x = x_cen, y = y_cen, xend = NMDS1, yend = NMDS2), alpha = 0.9) +
    theme_classic() +
    theme(
      axis.text.x = element_text(size = 12),
      axis.text.y = element_text(size = 12),
      axis.title = element_text(size = 20, face = "bold"),
      axis.text = element_text(face = "bold", size = 18),
      panel.background = element_blank(),
      axis.line = element_line(size = 0.5, linetype = "solid", colour = "black"),
      legend.text = element_text(size = 16),
      legend.title = element_text(size = 18),
      legend.position = "right", legend.box = "vertical"
    ) +
    labs(shape="Individual")

nmds_richness %>%
  select(x_cen,y_cen,treatment,day) %>% 
  unique() %>% 
  arrange(treatment,day) %>% 
  ggplot(aes(x = x_cen, y = y_cen, color = treatment, fill = treatment)) +
    scale_color_manual(name="Treatment",
          breaks=c("TG1","TG2","TG3","TG4","TG5"),
          values=c("#4059AE", "#6A9AC3","#97D8C4","#AFD699","#F3B942")) +
    scale_fill_manual(name="Treatment",
          breaks=c("TG1","TG2","TG3","TG4","TG5"),
          values=c("#4059AE50", "#6A9AC350","#97D8C450","#AFD69950","#F3B94250")) +
    geom_point(size = 4) +
    geom_path(aes(xend=c(tail(x_cen, n=-1), NA), 
                  yend=c(tail(y_cen, n=-1), NA), 
                  group=treatment),
                  size = 2,
                  alpha=0.5,
                  arrow=arrow(type = "closed", length=unit(0.5,"cm"))
      ) +
    #   stat_ellipse(aes(color = beta_q1n_nmds$Groups))+
    #geom_segment(aes(x = x_cen, y = y_cen, xend = NMDS1, yend = NMDS2), alpha = 0.9) +
    theme_classic() +
    theme(
      axis.text.x = element_text(size = 12),
      axis.text.y = element_text(size = 12),
      axis.title = element_text(size = 20, face = "bold"),
      axis.text = element_text(face = "bold", size = 18),
      panel.background = element_blank(),
      axis.line = element_line(size = 0.5, linetype = "solid", colour = "black"),
      legend.text = element_text(size = 16),
      legend.title = element_text(size = 18),
      legend.position = "right", legend.box = "vertical"
    ) +
    labs(shape="Individual")

nmds_richness %>%
  filter(day == 7) %>% 
  ggplot(aes(x = NMDS1, y = NMDS2, color = treatment, fill = treatment, shape = as.factor(day))) +
    scale_color_manual(name="Treatment",
          breaks=c("TG1","TG2","TG3","TG4","TG5"),
          values=c("#4059AE", "#6A9AC3","#97D8C4","#AFD699","#F3B942")) +
    scale_fill_manual(name="Treatment",
          breaks=c("TG1","TG2","TG3","TG4","TG5"),
          values=c("#4059AE50", "#6A9AC350","#97D8C450","#AFD69950","#F3B94250")) +
    scale_shape_manual(name="Day",
          breaks=c(7,14,21,28,35),
          values=c(21,22,23,24,25)) +
    geom_point(size = 4) +
    #   stat_ellipse(aes(color = beta_q1n_nmds$Groups))+
    geom_segment(aes(x = x_cen, y = y_cen, xend = NMDS1, yend = NMDS2), alpha = 0.9) +
    theme_classic() +
    theme(
      axis.text.x = element_text(size = 12),
      axis.text.y = element_text(size = 12),
      axis.title = element_text(size = 20, face = "bold"),
      axis.text = element_text(face = "bold", size = 18),
      panel.background = element_blank(),
      axis.line = element_line(size = 0.5, linetype = "solid", colour = "black"),
      legend.text = element_text(size = 16),
      legend.title = element_text(size = 18),
      legend.position = "right", legend.box = "vertical"
    ) +
    labs(shape="Individual")

## Neutral diversity

nmds_neutral <- beta_q1n$S %>%
  vegan::metaMDS(., trymax = 500, k = 2, trace=0) %>%
  vegan::scores() %>%
  as_tibble(., rownames = "sample") %>%
  dplyr::left_join(sample_metadata, by = join_by(sample == sample)) %>%
  group_by(treatment,day) %>%
  mutate(x_cen = median(NMDS1, na.rm = TRUE)) %>%
  mutate(y_cen = median(NMDS2, na.rm = TRUE)) %>%
  ungroup() 

5.2.2 All time points

nmds_neutral %>%
  ggplot(aes(x = NMDS1, y = NMDS2, color = treatment, fill = treatment, shape = as.factor(day))) +
    scale_color_manual(name="Treatment",
          breaks=c("TG1","TG2","TG3","TG4","TG5"),
          values=c("#4059AE", "#6A9AC3","#97D8C4","#AFD699","#F3B942")) +
    scale_fill_manual(name="Treatment",
          breaks=c("TG1","TG2","TG3","TG4","TG5"),
          values=c("#4059AE50", "#6A9AC350","#97D8C450","#AFD69950","#F3B94250")) +
    scale_shape_manual(name="Day",
          breaks=c(7,14,21,28,35),
          values=c(21,22,23,24,25)) +
    geom_point(size = 4) +
    #   stat_ellipse(aes(color = beta_q1n_nmds$Groups))+
    geom_segment(aes(x = x_cen, y = y_cen, xend = NMDS1, yend = NMDS2), alpha = 0.9) +
    theme_classic() +
    theme(
      axis.text.x = element_text(size = 12),
      axis.text.y = element_text(size = 12),
      axis.title = element_text(size = 20, face = "bold"),
      axis.text = element_text(face = "bold", size = 18),
      panel.background = element_blank(),
      axis.line = element_line(size = 0.5, linetype = "solid", colour = "black"),
      legend.text = element_text(size = 16),
      legend.title = element_text(size = 18),
      legend.position = "right", legend.box = "vertical"
    ) +
    labs(shape="Individual")

5.2.3 Trajectories

nmds_neutral %>%
  select(x_cen,y_cen,treatment,day) %>% 
  unique() %>% 
  arrange(treatment,day) %>% 
  ggplot(aes(x = x_cen, y = y_cen, color = treatment, fill = treatment)) +
    scale_color_manual(name="Treatment",
          breaks=c("TG1","TG2","TG3","TG4","TG5"),
          values=c("#4059AE", "#6A9AC3","#97D8C4","#AFD699","#F3B942")) +
    scale_fill_manual(name="Treatment",
          breaks=c("TG1","TG2","TG3","TG4","TG5"),
          values=c("#4059AE50", "#6A9AC350","#97D8C450","#AFD69950","#F3B94250")) +
    geom_point(size = 4) +
    geom_path(aes(xend=c(tail(x_cen, n=-1), NA), 
                  yend=c(tail(y_cen, n=-1), NA), 
                  group=treatment),
                  size = 2,
                  alpha=0.5,
                  arrow=arrow(type = "closed", length=unit(0.5,"cm"))
      ) +
    #   stat_ellipse(aes(color = beta_q1n_nmds$Groups))+
    #geom_segment(aes(x = x_cen, y = y_cen, xend = NMDS1, yend = NMDS2), alpha = 0.9) +
    theme_classic() +
    theme(
      axis.text.x = element_text(size = 12),
      axis.text.y = element_text(size = 12),
      axis.title = element_text(size = 20, face = "bold"),
      axis.text = element_text(face = "bold", size = 18),
      panel.background = element_blank(),
      axis.line = element_line(size = 0.5, linetype = "solid", colour = "black"),
      legend.text = element_text(size = 16),
      legend.title = element_text(size = 18),
      legend.position = "right", legend.box = "vertical"
    ) +
    labs(shape="Individual")

5.3 Day 7

nmds_neutral %>%
  filter(day == 7) %>% 
  ggplot(aes(x = NMDS1, y = NMDS2, color = treatment, fill = treatment, shape = as.factor(day))) +
    scale_color_manual(name="Treatment",
          breaks=c("TG1","TG2","TG3","TG4","TG5"),
          values=c("#4059AE", "#6A9AC3","#97D8C4","#AFD699","#F3B942")) +
    scale_fill_manual(name="Treatment",
          breaks=c("TG1","TG2","TG3","TG4","TG5"),
          values=c("#4059AE50", "#6A9AC350","#97D8C450","#AFD69950","#F3B94250")) +
    scale_shape_manual(name="Day",
          breaks=c(7,14,21,28,35),
          values=c(21,22,23,24,25)) +
    geom_point(size = 4) +
    #   stat_ellipse(aes(color = beta_q1n_nmds$Groups))+
    geom_segment(aes(x = x_cen, y = y_cen, xend = NMDS1, yend = NMDS2), alpha = 0.9) +
    theme_classic() +
    theme(
      axis.text.x = element_text(size = 12),
      axis.text.y = element_text(size = 12),
      axis.title = element_text(size = 20, face = "bold"),
      axis.text = element_text(face = "bold", size = 18),
      panel.background = element_blank(),
      axis.line = element_line(size = 0.5, linetype = "solid", colour = "black"),
      legend.text = element_text(size = 16),
      legend.title = element_text(size = 18),
      legend.position = "right", legend.box = "vertical"
    ) +
    labs(shape="Individual")