Chapter 8 Do populations mantain a different GM after acclimation?

load("data/data_03122025.Rdata")
load("data/objects_03122025.Rdata")
load("data/alpha_16092025.Rdata")
load("data/beta_16092025.Rdata")

8.1 Shapiro test

alpha_div %>%
  pivot_longer(-sample, names_to = "metric", values_to = "value") %>%
  left_join(., sample_metadata, by = join_by(sample == Tube_code)) %>%
  filter(time_point =="Acclimation") %>% 
  filter(metric=="richness") %>% 
  summarize(shapiro_p_value = shapiro.test(value)$p.value) %>%
  pull(shapiro_p_value)
[1] 0.2524848
alpha_div %>%
  pivot_longer(-sample, names_to = "metric", values_to = "value") %>%
  left_join(., sample_metadata, by = join_by(sample == Tube_code)) %>%
  filter(time_point =="Acclimation") %>% 
  filter(metric=="neutral") %>% 
  summarize(shapiro_p_value = shapiro.test(value)$p.value) %>%
  pull(shapiro_p_value)
[1] 0.4351805
alpha_div %>%
  pivot_longer(-sample, names_to = "metric", values_to = "value") %>%
  left_join(., sample_metadata, by = join_by(sample == Tube_code)) %>%
  filter(time_point =="Acclimation") %>% 
  filter(metric=="phylogenetic") %>% 
  summarize(shapiro_p_value = shapiro.test(value)$p.value) %>%
  pull(shapiro_p_value)
[1] 0.3242905

8.2 Alpha diversity

alpha_div %>%
  pivot_longer(-sample, names_to = "metric", values_to = "value") %>%
  left_join(., sample_metadata, by = join_by(sample == Tube_code)) %>%
  filter(time_point=="Acclimation") %>%
  mutate(metric=factor(metric,levels=c("richness","neutral","phylogenetic"))) %>%
      ggplot(aes(y = value, x = species, group=species, color=species, fill=species)) +
      geom_boxplot(outlier.shape = NA) +
      geom_jitter(alpha=0.5) +
      scale_color_manual(name="species",
          breaks=c("Podarcis_muralis","Podarcis_liolepis"),
          labels=c("Podarcis muralis","Podarcis liolepis"),
          values=c('#008080', "#d57d2c")) +
      scale_fill_manual(name="species",
          breaks=c("Podarcis_muralis","Podarcis_liolepis"),
          labels=c("Podarcis muralis","Podarcis liolepis"),
          values=c('#00808050', "#d57d2c50")) +
      facet_wrap(. ~ metric,scales = "free") +
      coord_cartesian(xlim = c(1, NA)) +
      stat_compare_means(method="t.test",size=3, label.x=.58) +
      theme_classic() +
        theme(
    strip.background = element_blank(),
    panel.grid.minor.x = element_line(size = .1, color = "grey"),
    axis.title.x = element_blank(),
    axis.title.y = element_text(size=10),
    axis.text.x = element_blank(),
    # Increase plot size
    plot.title = element_text(size = 10),
    axis.text = element_text(size = 8),
    axis.title = element_text(size = 8)
      ) +
  ylab("Alpha diversity")

8.3 Beta diversity

Number of samples used

samples_to_keep_accli <- sample_metadata %>%
  filter(time_point == "Acclimation") %>% 
  select(Tube_code) %>% 
  pull()
subset_meta_accli <- sample_metadata %>%
  filter(time_point == "Acclimation")

length(samples_to_keep_accli)
[1] 26

Richness

richness_accli <- as.matrix(beta_q0n$S)
richness_accli <- as.dist(richness_accli[rownames(richness_accli) %in% samples_to_keep_accli,
               colnames(richness_accli) %in% samples_to_keep_accli])
betadisper(richness_accli, subset_meta_accli$species) %>% 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     1 0.094207 0.094207 11.879    999  0.004 **
Residuals 24 0.190338 0.007931                        
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Pairwise comparisons:
(Observed p-value below diagonal, permuted p-value above diagonal)
                  Podarcis_liolepis Podarcis_muralis
Podarcis_liolepis                              0.003
Podarcis_muralis          0.0021024                 
adonis2(richness_accli ~ species,
        data = subset_meta_accli %>% arrange(match(Tube_code,labels(richness_accli))),
        permutations = 999) %>%
        broom::tidy() %>%
        tt()
term df SumOfSqs R2 statistic p.value
Model 1 1.651732 0.1945425 5.796731 0.001
Residual 24 6.838608 0.8054575 NA NA
Total 25 8.490340 1.0000000 NA NA

Neutral

neutral_accli <- as.matrix(beta_q1n$S)
neutral_accli <- as.dist(neutral_accli[rownames(neutral_accli) %in% samples_to_keep_accli,
               colnames(neutral_accli) %in% samples_to_keep_accli])
betadisper(neutral_accli, subset_meta_accli$species) %>% 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     1 0.05661 0.056610 4.2136    999  0.048 *
Residuals 24 0.32244 0.013435                       
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Pairwise comparisons:
(Observed p-value below diagonal, permuted p-value above diagonal)
                  Podarcis_liolepis Podarcis_muralis
Podarcis_liolepis                               0.04
Podarcis_muralis           0.051158                 
adonis2(neutral_accli ~ species,
        data = subset_meta_accli %>% arrange(match(Tube_code,labels(neutral_accli))),
        permutations = 999) %>%
        broom::tidy() %>%
        tt()
term df SumOfSqs R2 statistic p.value
Model 1 1.965807 0.2500091 8.00039 0.001
Residual 24 5.897134 0.7499909 NA NA
Total 25 7.862941 1.0000000 NA NA

Phylogenetic

phylo_accli <- as.matrix(beta_q1p$S)
phylo_accli <- as.dist(phylo_accli[rownames(phylo_accli) %in% samples_to_keep_accli,
               colnames(phylo_accli) %in% samples_to_keep_accli])
betadisper(phylo_accli, subset_meta_accli$species) %>% 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     1 0.03621 0.036209 2.2972    999  0.148
Residuals 24 0.37829 0.015762                     

Pairwise comparisons:
(Observed p-value below diagonal, permuted p-value above diagonal)
                  Podarcis_liolepis Podarcis_muralis
Podarcis_liolepis                              0.138
Podarcis_muralis            0.14267                 
adonis2(phylo_accli ~ species,
        data = subset_meta_accli %>% arrange(match(Tube_code,labels(phylo_accli))),
        permutations = 999) %>%
        broom::tidy() %>%
        tt()
term df SumOfSqs R2 statistic p.value
Model 1 0.2126877 0.1387856 3.867626 0.016
Residual 24 1.3198034 0.8612144 NA NA
Total 25 1.5324911 1.0000000 NA NA

NMDS

richness_accli %>%
  metaMDS(.,trymax = 500, k=2, verbosity=FALSE, trace=FALSE) %>%
  vegan::scores() %>%
  as_tibble(., rownames = "sample") %>%
  left_join(subset_meta_accli, by = join_by(sample == Tube_code))%>%
  group_by(species) %>%
  mutate(x_cen = mean(NMDS1, na.rm = TRUE)) %>%
  mutate(y_cen = mean(NMDS2, na.rm = TRUE)) %>%
  ungroup() %>%
  ggplot(., aes(x=NMDS1,y=NMDS2, color=species)) +
  scale_color_manual(name="species",
                     breaks=c("Podarcis_muralis","Podarcis_liolepis"),
                     labels=c("Podarcis muralis","Podarcis liolepis"),
                     values=c('#008080',"#d57d2c")) +
  scale_shape_manual(name="Type",
                     breaks=c("Cold_control", "Warm_control", "Cold_intervention"),
                     labels=c("Cold_control", "Warm_control", "Cold_intervention"),
                     values=c("circle","square","triangle")) +
  geom_point(size=2) +
  geom_segment(aes(x=x_cen, y=y_cen, xend=NMDS1, yend=NMDS2), alpha=0.2) +
  labs(y = "NMDS2", x="NMDS1 \n Richness beta diversity") +
  theme_classic() +
  theme(legend.position="none")

neutral_accli %>%
  metaMDS(.,trymax = 500, k=2, verbosity=FALSE, trace=FALSE) %>%
  vegan::scores() %>%
  as_tibble(., rownames = "sample") %>%
  left_join(subset_meta_accli, by = join_by(sample == Tube_code))%>%
  group_by(species) %>%
  mutate(x_cen = mean(NMDS1, na.rm = TRUE)) %>%
  mutate(y_cen = mean(NMDS2, na.rm = TRUE)) %>%
  ungroup() %>%
  ggplot(., aes(x=NMDS1,y=NMDS2, color=species, shape=type)) +
  scale_color_manual(name="species",
                     breaks=c("Podarcis_muralis","Podarcis_liolepis"),
                     labels=c("Podarcis muralis","Podarcis liolepis"),
                     values=c('#008080',"#d57d2c")) +
  scale_shape_manual(name="Type",
                     breaks=c("Cold_control", "Warm_control", "Cold_intervention"),
                     labels=c("Cold_control", "Warm_control", "Cold_intervention"),
                     values=c("circle","square","triangle")) +
  geom_point(size=2) +
  geom_segment(aes(x=x_cen, y=y_cen, xend=NMDS1, yend=NMDS2), alpha=0.2) +
  labs(y = "NMDS2", x="NMDS1 \n Neutral beta diversity") +
  theme_classic() +
  theme(legend.position="none")

phylo_accli %>%
  metaMDS(.,trymax = 500, k=2, verbosity=FALSE, trace=FALSE) %>%
  vegan::scores() %>%
  as_tibble(., rownames = "sample") %>%
  left_join(subset_meta_accli, by = join_by(sample == Tube_code))%>%
  group_by(species) %>%
  mutate(x_cen = mean(NMDS1, na.rm = TRUE)) %>%
  mutate(y_cen = mean(NMDS2, na.rm = TRUE)) %>%
  ungroup() %>%
  ggplot(., aes(x=NMDS1,y=NMDS2, color=species)) +
  scale_color_manual(name="species",
                     breaks=c("Podarcis_muralis","Podarcis_liolepis"),
                     labels=c("Podarcis muralis","Podarcis liolepis"),
                     values=c('#008080',"#d57d2c")) +
  scale_shape_manual(name="Type",
                     breaks=c("Cold_control", "Warm_control", "Cold_intervention"),
                     labels=c("Cold_control", "Warm_control", "Cold_intervention"),
                     values=c("circle","square","triangle")) +
  geom_point(size=2) +
  geom_segment(aes(x=x_cen, y=y_cen, xend=NMDS1, yend=NMDS2), alpha=0.2) +
  labs(y= element_blank (),x="NMDS1 \n Phylogenetic beta diversity") +
  theme_classic() +
  theme(legend.position="none") 

8.4 Functional capacity

8.4.1 Metabolic capacity index at functional level

GIFTs_functions_community %>%
  rowMeans() %>%
  as_tibble(., rownames = "sample") %>%
  left_join(sample_metadata, by = join_by(sample == Tube_code)) %>%
  filter(time_point=="Acclimation") %>%
  group_by(species) %>%
  summarise(MCI = mean(value), sd = sd(value))
# A tibble: 2 × 3
  species             MCI     sd
  <chr>             <dbl>  <dbl>
1 Podarcis_liolepis 0.348 0.0158
2 Podarcis_muralis  0.329 0.0320
MCI_element_acclimation<- GIFTs_functions_community %>%
  rowMeans() %>%
  as_tibble(., rownames = "sample") %>%
  left_join(sample_metadata, by = join_by(sample == Tube_code)) %>%
  filter(time_point=="Acclimation")

shapiro.test(MCI_element_acclimation$value) #normality test

    Shapiro-Wilk normality test

data:  MCI_element_acclimation$value
W = 0.92669, p-value = 0.06465
var.test(value ~ species, data = MCI_element_acclimation)

    F test to compare two variances

data:  value by species
F = 0.24311, num df = 8, denom df = 16, p-value = 0.04866
alternative hypothesis: true ratio of variances is not equal to 1
95 percent confidence interval:
 0.0777983 0.9909228
sample estimates:
ratio of variances 
         0.2431059 
t.test(value ~ species, data=MCI_element_acclimation, var.equal = TRUE)

    Two Sample t-test

data:  value by species
t = 1.6212, df = 24, p-value = 0.1181
alternative hypothesis: true difference in means between group Podarcis_liolepis and group Podarcis_muralis is not equal to 0
95 percent confidence interval:
 -0.005046497  0.042002844
sample estimates:
mean in group Podarcis_liolepis  mean in group Podarcis_muralis 
                      0.3478327                       0.3293545 

8.4.2 Differences in functional pathways

element_gift_acclimation<- element_gift %>% 
  filter(time_point=="Acclimation") %>% 
  select(-time_point,-type) %>%
  filter(rowSums(across(where(is.numeric), ~ . != 0)) > 0) %>%
  select(Tube_code, where(~ is.numeric(.) && sum(.) > 0)) %>%
  left_join(sample_metadata[c(1, 4)], by = "Tube_code")
significant_elements_acclimation <- element_gift_acclimation %>%
  pivot_longer(-c(Tube_code,Population), names_to = "trait", values_to = "value") %>%
  group_by(trait) %>%
  summarise(p_value = wilcox.test(value ~ Population)$p.value) %>%
  mutate(p_adjust=p.adjust(p_value, method="BH")) %>%
  filter(p_adjust < 0.05)%>%
  rownames_to_column(., "Elements")  %>% 
  select(-Elements)

element_gift_sig_acclimation <- element_gift_acclimation %>%
  select(Tube_code, all_of(intersect(
    significant_elements_acclimation$trait,
    colnames(element_gift_acclimation)
  ))) %>%
  left_join(., sample_metadata[c(1, 4)], by = join_by(Tube_code == Tube_code))

difference_table_acclimation <- element_gift_sig_acclimation %>%
  select(-Tube_code) %>%
  group_by(Population) %>%
  summarise(across(everything(), mean)) %>%
  t() %>%
  row_to_names(row_number = 1) %>%
  as.data.frame() %>%
  mutate_if(is.character, as.numeric) %>%
  rownames_to_column(., "Elements") %>%
  left_join(.,uniqueGIFT_db[c(1,3,4)],by = join_by(Elements == Code_element)) %>% 
  arrange(Function) %>% 
  mutate(Difference=Cold-Warm)%>% 
  mutate(group_color = ifelse(Difference <0, "Warm","Cold")) 
difference_table_acclimation %>%
  ggplot(aes(x=forcats::fct_reorder(Function,Difference), y=Difference, fill=group_color)) + 
  geom_col() +
  scale_fill_manual(values=c('#008080',"#d57d2c")) + 
  geom_hline(yintercept=0) + 
  coord_flip()+
  theme(axis.text = element_text(size = 10),
        axis.title = element_text(size = 12),
        legend.position = "right", 
        legend.title = element_blank(),
        panel.background = element_blank(),
        panel.grid.major = element_line(size = 0.15, linetype = 'solid',
                                        colour = "grey"))+
  xlab("Function") + 
  ylab("Mean difference")