Last updated: 2024-10-28

Checks: 6 1

Knit directory: 2022_cihr_hiv_rv306_vaginal/

This reproducible R Markdown analysis was created with workflowr (version 1.7.1). The Checks tab describes the reproducibility checks that were applied when the results were created. The Past versions tab lists the development history.


The R Markdown is untracked by Git. To know which version of the R Markdown file created these results, you’ll want to first commit it to the Git repo. If you’re still working on the analysis, you can ignore this warning. When you’re finished, you can run wflow_publish to commit the R Markdown file and build the HTML.

Great job! The global environment was empty. Objects defined in the global environment can affect the analysis in your R Markdown file in unknown ways. For reproduciblity it’s best to always run the code in an empty environment.

The command set.seed(20240321) was run prior to running the code in the R Markdown file. Setting a seed ensures that any results that rely on randomness, e.g. subsampling or permutations, are reproducible.

Great job! Recording the operating system, R version, and package versions is critical for reproducibility.

Nice! There were no cached chunks for this analysis, so you can be confident that you successfully produced the results during this run.

Great job! Using relative paths to the files within your workflowr project makes it easier to run your code on other machines.

Great! You are using Git for version control. Tracking code development and connecting the code version to the results is critical for reproducibility.

The results in this page were generated with repository version 704477d. See the Past versions tab to see a history of the changes made to the R Markdown and HTML files.

Note that you need to be careful to ensure that all relevant files for the analysis have been committed to Git prior to generating the results (you can use wflow_publish or wflow_git_commit). workflowr only checks the R Markdown file, but you know if there are other scripts or data files that it depends on. Below is the status of the Git repository when the results were generated:


Ignored files:
    Ignored:    .Rhistory
    Ignored:    .Rproj.user/
    Ignored:    analysis/.Rhistory
    Ignored:    code/.RData
    Ignored:    code/.Rhistory
    Ignored:    data/preprocessed/

Untracked files:
    Untracked:  analysis/clustering.Rmd

Note that any generated files, e.g. HTML, png, CSS, etc., are not included in this status report because it is ok for generated content to have uncommitted changes.


There are no past versions. Publish this analysis with wflow_publish() to start tracking its development.


Introduction

We are exploring the clustering of samples into vaginotype groups and comparing the best approach.

Load mre

## mre init
mre <- readr::read_rds(here::here("data", "preprocessed", "filt_mre.rds"))

## sub mre init & filter
mre_sub <- 
  metar::get_meta(mre) %>%
  dplyr::filter(Timepoint %in% c(0, 14, 26),
                !PatientID %in% c("p_1004","p_1024","p_1037","p_1093","p_1095","p_1108","p_1117","p_1144","p_2006","p_2053","p_2059","p_2096","p_2105","p_2124","p_3021","p_3025")) %>%
  dplyr::pull(SampleID) %>%
  metar::filter_samples(mre, sample_ids = .)

phy <- metar::get_phyloseq(mre_sub, type = "virgo")

mre_sub <- metar::remove_cat(mre_sub, "Plasm_IgG_3_A244_D11")

mre_sub@taxa@virgo@phyloseq <- phy

Load and represent Sam data

sam_vag <- readr::read_csv("~/Documents/RV306/vaginal/Samantha data 08_10_24/RV306_CVM_MBGroups_n97_Pearson4Branches_MSdata.csv") %>%
  dplyr::select(-...1, -freq)
colnames(sam_vag)[1] <- "PatientID"
colnames(sam_vag)[2] <- "V1_Sam"
colnames(sam_vag)[3] <- "V4_Sam"
colnames(sam_vag)[4] <- "V6_Sam"
colnames(sam_vag)[5] <- "Long_changes_Sam"

all_vag <- sam_vag %>% 
  dplyr::mutate(PatientID = paste("p_", PatientID, sep = "")) %>%
  dplyr::select(-5)

# generate cluster data
sam_ordered <- all_vag %>%
  tidyr::pivot_longer(cols = starts_with("V"), names_to = "Sample", values_to = "Value") %>% 
  dplyr::select(-2)
sam_ordered$SampleID <- mre_sub@metadata@metadata_df$SampleID
sam_ordered <- sam_ordered %>% 
  dplyr::arrange(SampleID)
clusters <- as.vector(sam_ordered$Value)
# Plot NMDS
distance_matrix <- vegan::vegdist(as.data.frame(phyloseq::otu_table(mre_sub@taxa@virgo@phyloseq@otu_table)) %>% 
  t(.) %>% as.data.frame(), method = "bray")

nmds <- vegan::metaMDS(distance_matrix, k = 2, trymax = 100, trace = 0)

nmds_data <- as.data.frame(nmds$points)
nmds_data$Cluster <- as.factor(clusters)
nmds_data$SampleID <- rownames(nmds_data)

ggplot(nmds_data, aes(x = MDS1, y = MDS2, color = Cluster, label = SampleID)) +
  geom_point(size = 4) +
  geom_text(vjust = -0.5, hjust = 0.5) +
  theme_minimal() +
  labs(title = "NMDS Plot Colored by Sam Generated Clusters", x = "NMDS1", y = "NMDS2") +
  scale_color_manual(values = c("red", "blue", "green", "purple"))

ps <- metar::get_phyloseq(mre_sub, type = "virgo")
ps_RA <- phyloseq::transform_sample_counts(ps, function(x) x / sum(x))
bray_pcoa  <-
  phyloseq::ordinate(physeq = ps_RA, method = "PCoA", distance = "bray")

ps@sam_data$Cluster <- as.factor(clusters)

phyloseq::plot_ordination(
  physeq = ps_RA,
  ordination = bray_pcoa,
  axes = c(1,2)
  ) +
  geom_point(aes(
    color = clusters
  ), size = 1, stroke = 1) +
  theme_classic() +
  labs(title = "PCo1 vs PCo2", color = "Cluster")

## run barplots 
mre_sub <- metar::virgo_barplots(mre_sub, top_n = 30, save_files = FALSE)

met <- metar::get_meta(mre_sub) %>%
  dplyr::right_join(sam_ordered, met, by = NULL) %>% 
  dplyr::right_join(mre_sub@taxa@virgo@barplots$ta1$top_30$rel_abundance$bray_NMDS1_order_barplot$data, met, by = "SampleID")

plot <- mre_sub@taxa@virgo@barplots$ta1$top_30$rel_abundance$bray_NMDS1_order_barplot

plot$data <- met

plot +
  theme(axis.text.x = element_blank()) +
  facet_wrap(Value ~ ., scales = "free") +
  theme_classic() +
  theme(axis.text.x = element_blank())

Using metar

We’ll first perform the PAM (Partitioning Around Medoids) clustering analysis in order to broadly detect these vagintoypes and be able to uniquely assign each sample to a vaginotype, while ensuring that this assignment does not change in downstream analysis.

All samples

## run nmds
mre <- metar::virgo_nmds(mre, top_n = 30, save_files = FALSE)

## create dataframe
metar_all_vag <- 
  mre %>% 
  metar::get_taxa("virgo", "nmds") %>% 
  purrr::pluck("ta1", "top_30", "clustering_results", "sample_cluster_labels") %>% 
  dplyr::mutate(
    vaginotype = dplyr::case_when(
      cluster == 1 ~ "L.crispatus", 
      cluster == 2 ~ "G.vaginalis", 
      cluster == 3 ~ "L.iners"
    ),
    vaginotype_condition = dplyr::if_else(cluster == 2, "nLD", "LD") 
  ) %>% 
  dplyr::select(SampleID, vaginotype, vaginotype_condition) %>% 
  dplyr::left_join(mre@metadata@metadata_df %>% dplyr::select(SampleID, PatientID, Timepoint)) %>% 
  dplyr::arrange(PatientID, Timepoint) %>%
  dplyr::group_by(PatientID) %>%
  dplyr::mutate(Timepoint_label = paste0("V", dplyr::row_number(), "_Metar")) %>%
  dplyr::select(PatientID, Timepoint_label, vaginotype) %>%
  tidyr::spread(key = Timepoint_label, value = vaginotype) %>% 
  dplyr::select(-5, -6)
  

colnames(metar_all_vag)[2] <- "V1_metar_all"
colnames(metar_all_vag)[3] <- "V4_metar_all"
colnames(metar_all_vag)[4] <- "V6_metar_all"

# join
all_vag  <- merge(all_vag, metar_all_vag, all=TRUE)
# Plot NMDS
clusters <- 
  mre %>% 
  metar::get_taxa("virgo", "nmds") %>% 
  purrr::pluck("ta1", "top_30", "clustering_results", "sample_cluster_labels") %>% 
  dplyr::mutate(
    vaginotype = dplyr::case_when(
      cluster == 1 ~ "L.crispatus", 
      cluster == 2 ~ "G.vaginalis", 
      cluster == 3 ~ "L.iners"
    )) %>% 
  dplyr::select(cluster) %>%
  dplyr::pull()

distance_matrix <- vegan::vegdist(as.data.frame(phyloseq::otu_table(mre@taxa@virgo@phyloseq@otu_table)) %>% 
  t(.) %>% as.data.frame(), method = "bray")

nmds <- vegan::metaMDS(distance_matrix, k = 2, trymax = 100, trace = 0)

nmds_data <- as.data.frame(nmds$points)
nmds_data$Cluster <- as.factor(clusters)
nmds_data$SampleID <- rownames(nmds_data)

ggplot(nmds_data, aes(x = MDS1, y = MDS2, color = Cluster, label = SampleID)) +
  geom_point(size = 4) +
  geom_text(vjust = -0.5, hjust = 0.5) +
  theme_minimal() +
  labs(title = "NMDS Plot Colored by metar_all samples Clusters", x = "NMDS1", y = "NMDS2") +
  scale_color_manual(values = c("red", "blue", "green", "purple"))

ps <- metar::get_phyloseq(mre, type = "virgo")
ps_RA <- phyloseq::transform_sample_counts(ps, function(x) x / sum(x))
bray_pcoa  <-
  phyloseq::ordinate(physeq = ps_RA, method = "PCoA", distance = "bray")

ps@sam_data$Cluster <- as.factor(clusters)

phyloseq::plot_ordination(
  physeq = ps_RA,
  ordination = bray_pcoa,
  axes = c(1,2)
  ) +
  geom_point(aes(
    color = as.factor(clusters)
  ), size = 1, stroke = 1) +
  theme_classic() +
  labs(title = "PCo1 vs PCo2", color = "Cluster")

# Create dataframe to merge
metar_all_vag <- 
  mre %>% 
  metar::get_taxa("virgo", "nmds") %>% 
  purrr::pluck("ta1", "top_30", "clustering_results", "sample_cluster_labels") %>% 
  dplyr::mutate(
    vaginotype = dplyr::case_when(
      cluster == 1 ~ "L.crispatus", 
      cluster == 2 ~ "G.vaginalis", 
      cluster == 3 ~ "L.iners"
    ),
    vaginotype_condition = dplyr::if_else(cluster == 2, "nLD", "LD") 
  ) %>% 
  dplyr::select(SampleID, vaginotype)

## run barplots 
mre <- metar::virgo_barplots(mre, top_n = 30, save_files = FALSE)

met <- metar::get_meta(mre) %>%
  dplyr::right_join(metar_all_vag, met, by = NULL) %>% 
  dplyr::right_join(mre@taxa@virgo@barplots$ta1$top_30$rel_abundance$bray_NMDS1_order_barplot$data, met, by = "SampleID")

plot <- mre@taxa@virgo@barplots$ta1$top_30$rel_abundance$bray_NMDS1_order_barplot

plot$data <- met

plot +
  theme(axis.text.x = element_blank()) +
  facet_wrap(vaginotype ~ ., scales = "free") +
  theme_classic() +
  theme(axis.text.x = element_blank())

Selected samples

## run nmds
mre_sub <- metar::virgo_nmds(mre_sub, top_n = 30, save_files = FALSE)

## create dataframe
metar_sel_vag <- 
  mre_sub %>% 
  metar::get_taxa("virgo", "nmds") %>% 
  purrr::pluck("ta1", "top_30", "clustering_results", "sample_cluster_labels") %>% 
  dplyr::mutate(
    vaginotype = dplyr::case_when(
      cluster == 1 ~ "L.iners", 
      cluster == 2 ~ "L.crispatus", 
      cluster == 3 ~ "G.vaginalis"
    ),
    vaginotype_condition = dplyr::if_else(cluster == 2, "nLD", "LD") 
  ) %>% 
  dplyr::select(SampleID, vaginotype, vaginotype_condition) %>% 
  dplyr::left_join(mre_sub@metadata@metadata_df %>% dplyr::select(SampleID, PatientID, Timepoint)) %>% 
  dplyr::arrange(PatientID, Timepoint) %>%
  dplyr::group_by(PatientID) %>%
  dplyr::mutate(Timepoint_label = paste0("V", dplyr::row_number(), "_Metar")) %>%
  dplyr::select(PatientID, Timepoint_label, vaginotype) %>%
  tidyr::spread(key = Timepoint_label, value = vaginotype)
  

colnames(metar_sel_vag)[2] <- "V1_metar_selected"
colnames(metar_sel_vag)[3] <- "V4_metar_selected"
colnames(metar_sel_vag)[4] <- "V6_metar_selected"

# join
all_vag  <- merge(all_vag, metar_sel_vag, all=TRUE)
# Plot NMDS
clusters <- 
  mre_sub %>% 
  metar::get_taxa("virgo", "nmds") %>% 
  purrr::pluck("ta1", "top_30", "clustering_results", "sample_cluster_labels") %>% 
  dplyr::mutate(
    vaginotype = dplyr::case_when(
      cluster == 1 ~ "L.iners", 
      cluster == 2 ~ "L.crispatus", 
      cluster == 3 ~ "G.vaginalis"
    )) %>% 
  dplyr::select(cluster) %>%
  dplyr::pull()

distance_matrix <- vegan::vegdist(as.data.frame(phyloseq::otu_table(mre_sub@taxa@virgo@phyloseq@otu_table)) %>% 
  t(.) %>% as.data.frame(), method = "bray")

nmds <- vegan::metaMDS(distance_matrix, k = 2, trymax = 100, trace = 0)

nmds_data <- as.data.frame(nmds$points)
nmds_data$Cluster <- as.factor(clusters)
nmds_data$SampleID <- rownames(nmds_data)

ggplot(nmds_data, aes(x = MDS1, y = MDS2, color = Cluster, label = SampleID)) +
  geom_point(size = 4) +
  geom_text(vjust = -0.5, hjust = 0.5) +
  theme_minimal() +
  labs(title = "NMDS Plot Colored by metar_selected samples Clusters", x = "NMDS1", y = "NMDS2") +
  scale_color_manual(values = c("red", "blue", "green", "purple"))

ps <- metar::get_phyloseq(mre_sub, type = "virgo")
ps_RA <- phyloseq::transform_sample_counts(ps, function(x) x / sum(x))
bray_pcoa  <-
  phyloseq::ordinate(physeq = ps_RA, method = "PCoA", distance = "bray")

ps@sam_data$Cluster <- as.factor(clusters)

phyloseq::plot_ordination(
  physeq = ps_RA,
  ordination = bray_pcoa,
  axes = c(1,2)
  ) +
  geom_point(aes(
    color = as.factor(clusters)
  ), size = 1, stroke = 1) +
  theme_classic() +
  labs(title = "PCo1 vs PCo2", color = "Cluster")

# Create dataframe to merge
metar_sel_vag <- 
  mre_sub %>% 
  metar::get_taxa("virgo", "nmds") %>% 
  purrr::pluck("ta1", "top_30", "clustering_results", "sample_cluster_labels") %>% 
  dplyr::mutate(
    vaginotype = dplyr::case_when(
      cluster == 1 ~ "L.iners", 
      cluster == 2 ~ "L.crispatus", 
      cluster == 3 ~ "G.vaginalis"
    ),
    vaginotype_condition = dplyr::if_else(cluster == 2, "nLD", "LD") 
  ) %>% 
  dplyr::select(SampleID, vaginotype)

## run barplots 
mre <- metar::virgo_barplots(mre, top_n = 30, save_files = FALSE)

met <- metar::get_meta(mre_sub) %>%
  dplyr::right_join(metar_sel_vag, met, by = NULL) %>% 
  dplyr::right_join(mre_sub@taxa@virgo@barplots$ta1$top_30$rel_abundance$bray_NMDS1_order_barplot$data, met, by = "SampleID")

plot <- mre_sub@taxa@virgo@barplots$ta1$top_30$rel_abundance$bray_NMDS1_order_barplot

plot$data <- met

plot +
  theme(axis.text.x = element_blank()) +
  facet_wrap(vaginotype ~ ., scales = "free") +
  theme_classic() +
  theme(axis.text.x = element_blank())

Using functions

However, we will try to split the samples as the Burgener lab did, determining MB Groups based on complete hierarchical clustering using pearson distance, and split into 4 branches, using same samples as Sam:

All samples

# Obtain abundance data dataframe
abundance_data <- as.data.frame(phyloseq::otu_table(mre@taxa@virgo@phyloseq@otu_table)) %>% 
  t(.) %>% as.data.frame()

# calculate Pearson distance matrix
pearson_distance <- as.dist(1 - cor(t(abundance_data), method = "pearson"))

# Perform hierarchical clustering using complete linkage
hc <- hclust(pearson_distance, method = "complete")

# Cut the dendrogram to create 4 clusters
clusters <- cutree(hc, k = 4)

# Add the cluster assignments to the original data
abundance_data$Cluster <- clusters
abundance_data$SampleID <- rownames(abundance_data)

# Optional: Plot the dendrogram
plot(hc, main = "Hierarchical Clustering Dendrogram", sub = "", xlab = "",
     ylab = "Height")
rect.hclust(hc, k = 4, border = "red")

oriol_all_vag <- 
  abundance_data %>%
  dplyr::select(SampleID, Cluster) %>% 
  dplyr::left_join(mre@metadata@metadata_df %>% dplyr::select(SampleID, PatientID, Timepoint)) %>% 
  dplyr::arrange(PatientID, Timepoint) %>%
  dplyr::group_by(PatientID) %>%
  dplyr::mutate(Timepoint_label = paste0("V", dplyr::row_number(), "_Metar")) %>%
  dplyr::select(PatientID, Timepoint_label, Cluster) %>%
  tidyr::spread(key = Timepoint_label, value = Cluster) %>% 
  dplyr::select(-5, -6)

colnames(oriol_all_vag)[2] <- "V1_oriol_all"
colnames(oriol_all_vag)[3] <- "V4_oriol_all"
colnames(oriol_all_vag)[4] <- "V6_oriol_all"

# join
all_vag  <- merge(all_vag, oriol_all_vag, all=TRUE)
# Plot NMDS
distance_matrix <- vegan::vegdist(as.data.frame(phyloseq::otu_table(mre@taxa@virgo@phyloseq@otu_table)) %>% 
  t(.) %>% as.data.frame(), method = "bray")

nmds <- vegan::metaMDS(distance_matrix, k = 2, trymax = 100, trace = 0)

nmds_data <- as.data.frame(nmds$points)
nmds_data$Cluster <- as.factor(clusters)
nmds_data$SampleID <- rownames(nmds_data)

ggplot(nmds_data, aes(x = MDS1, y = MDS2, color = Cluster, label = SampleID)) +
  geom_point(size = 4) +
  geom_text(vjust = -0.5, hjust = 0.5) +
  theme_minimal() +
  labs(title = "NMDS Plot Colored by hierarchical clustering_all samples Clusters", x = "NMDS1", y = "NMDS2") +
  scale_color_manual(values = c("red", "blue", "green", "purple"))

ps <- metar::get_phyloseq(mre, type = "virgo")
ps_RA <- phyloseq::transform_sample_counts(ps, function(x) x / sum(x))
bray_pcoa  <-
  phyloseq::ordinate(physeq = ps_RA, method = "PCoA", distance = "bray")

ps@sam_data$Cluster <- as.factor(clusters)

phyloseq::plot_ordination(
  physeq = ps_RA,
  ordination = bray_pcoa,
  axes = c(1,2)
  ) +
  geom_point(aes(
    color = as.factor(clusters)
  ), size = 1, stroke = 1) +
  theme_classic() +
  labs(title = "PCo1 vs PCo2", color = "Cluster")

# Create dataframe to merge
oriol_all_vag <- 
  abundance_data %>%
  dplyr::select(SampleID, Cluster) 

met <- metar::get_meta(mre) %>%
  dplyr::right_join(oriol_all_vag, met, by = NULL) %>% 
  dplyr::right_join(mre@taxa@virgo@barplots$ta1$top_30$rel_abundance$bray_NMDS1_order_barplot$data, met, by = "SampleID")

plot <- mre@taxa@virgo@barplots$ta1$top_30$rel_abundance$bray_NMDS1_order_barplot

plot$data <- met

plot +
  theme(axis.text.x = element_blank()) +
  facet_wrap(Cluster ~ ., scales = "free") +
  theme_classic() +
  theme(axis.text.x = element_blank())

Selected samples

# Obtain abundance data dataframe
abundance_data <- as.data.frame(phyloseq::otu_table(mre_sub@taxa@virgo@phyloseq@otu_table)) %>% 
  t(.) %>% as.data.frame()

# calculate Pearson distance matrix
pearson_distance <- as.dist(1 - cor(t(abundance_data), method = "pearson"))

# Perform hierarchical clustering using complete linkage
hc <- hclust(pearson_distance, method = "complete")

# Cut the dendrogram to create 4 clusters
clusters <- cutree(hc, k = 4)

# Add the cluster assignments to the original data
abundance_data$Cluster <- clusters
abundance_data$SampleID <- rownames(abundance_data)

# Optional: Plot the dendrogram
plot(hc, main = "Hierarchical Clustering Dendrogram", sub = "", xlab = "",
     ylab = "Height")
rect.hclust(hc, k = 4, border = "red")

oriol_sel_vag <- 
  abundance_data %>%
  dplyr::select(SampleID, Cluster) %>% 
  dplyr::left_join(mre_sub@metadata@metadata_df %>% dplyr::select(SampleID, PatientID, Timepoint)) %>% 
  dplyr::arrange(PatientID, Timepoint) %>%
  dplyr::group_by(PatientID) %>%
  dplyr::mutate(Timepoint_label = paste0("V", dplyr::row_number(), "_Metar")) %>%
  dplyr::select(PatientID, Timepoint_label, Cluster) %>%
  tidyr::spread(key = Timepoint_label, value = Cluster)

colnames(oriol_sel_vag)[2] <- "V1_oriol_selected"
colnames(oriol_sel_vag)[3] <- "V4_oriol_selected"
colnames(oriol_sel_vag)[4] <- "V6_oriol_selected"

# join
all_vag  <- merge(all_vag, oriol_sel_vag, sort = TRUE,  all=TRUE)
# Plot NMDS
distance_matrix <- vegan::vegdist(as.data.frame(phyloseq::otu_table(mre_sub@taxa@virgo@phyloseq@otu_table)) %>% 
  t(.) %>% as.data.frame(), method = "bray")

nmds <- vegan::metaMDS(distance_matrix, k = 2, trymax = 100, trace = 0)

nmds_data <- as.data.frame(nmds$points)
nmds_data$Cluster <- as.factor(clusters)
nmds_data$SampleID <- rownames(nmds_data)

ggplot(nmds_data, aes(x = MDS1, y = MDS2, color = Cluster, label = SampleID)) +
  geom_point(size = 4) +
  geom_text(vjust = -0.5, hjust = 0.5) +
  theme_minimal() +
  labs(title = "NMDS Plot Colored by hierarchical clustering_selected samples Clusters", x = "NMDS1", y = "NMDS2") +
  scale_color_manual(values = c("red", "blue", "green", "purple"))

ps <- metar::get_phyloseq(mre_sub, type = "virgo")
ps_RA <- phyloseq::transform_sample_counts(ps, function(x) x / sum(x))
bray_pcoa  <-
  phyloseq::ordinate(physeq = ps_RA, method = "PCoA", distance = "bray")

ps@sam_data$Cluster <- as.factor(clusters)

phyloseq::plot_ordination(
  physeq = ps_RA,
  ordination = bray_pcoa,
  axes = c(1,2)
  ) +
  geom_point(aes(
    color = as.factor(clusters)
  ), size = 1, stroke = 1) +
  theme_classic() +
  labs(title = "PCo1 vs PCo2", color = "Cluster")

# Create dataframe to merge
oriol_sel_vag <- 
  abundance_data %>%
  dplyr::select(SampleID, Cluster) 

met <- metar::get_meta(mre_sub) %>%
  dplyr::right_join(oriol_sel_vag, met, by = NULL) %>% 
  dplyr::right_join(mre_sub@taxa@virgo@barplots$ta1$top_30$rel_abundance$bray_NMDS1_order_barplot$data, met, by = "SampleID")

plot <- mre_sub@taxa@virgo@barplots$ta1$top_30$rel_abundance$bray_NMDS1_order_barplot

plot$data <- met

plot +
  theme(axis.text.x = element_blank()) +
  facet_wrap(Cluster ~ ., scales = "free") +
  theme_classic() +
  theme(axis.text.x = element_blank())

Table

all_vag %>%
  kableExtra::kable(caption = "Clustering of samples using different methods") %>%
  kableExtra::kable_styling(bootstrap_options = c("striped", "hover", "condensed", "responsive")) %>%
  kableExtra::row_spec(0, bold = TRUE) %>%
  kableExtra::column_spec(1, bold = FALSE) %>% 
  kableExtra::add_header_above(c(" ", "Sam" = 3, "Metar package all samples" = 3, "Metar package selected samples" = 3, "Oriol all samples" = 3, "Oriol selected samples" = 3))
Clustering of samples using different methods
Sam
Metar package all samples
Metar package selected samples
Oriol all samples
Oriol selected samples
PatientID V1_Sam V4_Sam V6_Sam V1_metar_all V4_metar_all V6_metar_all V1_metar_selected V4_metar_selected V6_metar_selected V1_oriol_all V4_oriol_all V6_oriol_all V1_oriol_selected V4_oriol_selected V6_oriol_selected
p_1004 NA NA NA L.iners L.iners L.iners NA NA NA 1 2 2 NA NA NA
p_1005 L.iners L.iners L.iners L.iners L.iners L.iners L.iners L.iners L.iners 1 1 1 1 1 1
p_1008 L.crispatus L.crispatus L.crispatus L.crispatus L.crispatus L.crispatus L.crispatus L.crispatus L.crispatus 1 1 1 1 1 1
p_1009 L.crispatus L.crispatus L.crispatus L.crispatus L.crispatus L.crispatus G.vaginalis L.crispatus G.vaginalis 1 1 1 1 1 1
p_1019 Polymicrobial L.crispatus L.crispatus G.vaginalis L.crispatus L.crispatus G.vaginalis L.crispatus L.crispatus 2 1 1 3 1 1
p_1024 NA NA NA G.vaginalis G.vaginalis G.vaginalis NA NA NA 2 2 2 NA NA NA
p_1025 L.iners Li-anaerobes Polymicrobial L.iners G.vaginalis G.vaginalis L.iners G.vaginalis G.vaginalis 1 2 2 1 3 3
p_1026 L.iners L.iners L.iners L.iners L.iners L.iners L.iners L.iners L.iners 1 1 1 1 1 1
p_1030 Polymicrobial Polymicrobial Polymicrobial G.vaginalis G.vaginalis G.vaginalis G.vaginalis G.vaginalis G.vaginalis 2 2 2 3 3 3
p_1033 Polymicrobial Polymicrobial Li-anaerobes G.vaginalis G.vaginalis G.vaginalis G.vaginalis G.vaginalis G.vaginalis 2 2 2 3 3 3
p_1037 NA NA NA L.crispatus L.iners NA NA NA NA 1 1 NA NA NA NA
p_1039 Polymicrobial Polymicrobial Polymicrobial G.vaginalis G.vaginalis G.vaginalis G.vaginalis G.vaginalis G.vaginalis 2 2 2 3 3 3
p_1043 L.crispatus L.crispatus L.crispatus L.crispatus L.crispatus L.crispatus L.crispatus L.crispatus L.crispatus 1 1 1 1 1 1
p_1044 L.iners L.iners L.iners L.iners L.iners L.iners L.iners L.iners L.iners 1 1 1 1 1 1
p_1046 Polymicrobial L.crispatus L.crispatus G.vaginalis L.crispatus L.crispatus G.vaginalis L.crispatus L.crispatus 2 1 1 3 1 1
p_1050 L.iners L.iners L.iners L.iners L.iners L.iners L.iners L.iners L.iners 1 1 1 1 1 1
p_1057 Li-anaerobes Polymicrobial Polymicrobial G.vaginalis G.vaginalis G.vaginalis G.vaginalis G.vaginalis G.vaginalis 2 2 2 3 3 3
p_1058 L.iners L.crispatus Polymicrobial L.iners L.crispatus L.crispatus L.iners L.crispatus G.vaginalis 1 1 1 1 1 1
p_1059 L.crispatus L.crispatus L.crispatus G.vaginalis G.vaginalis G.vaginalis G.vaginalis G.vaginalis G.vaginalis 2 2 2 3 3 3
p_1061 Polymicrobial Polymicrobial Polymicrobial G.vaginalis G.vaginalis G.vaginalis G.vaginalis G.vaginalis G.vaginalis 2 2 2 3 3 3
p_1063 L.crispatus L.iners L.iners L.crispatus L.iners L.iners L.crispatus L.iners L.iners 1 1 1 1 1 1
p_1067 L.iners L.iners L.iners L.iners L.iners L.iners L.iners L.iners L.iners 1 1 1 1 1 1
p_1069 Polymicrobial Polymicrobial L.iners G.vaginalis G.vaginalis L.iners G.vaginalis G.vaginalis L.iners 2 2 1 3 3 1
p_1072 L.iners L.iners L.iners L.iners L.iners L.iners L.iners L.iners L.iners 1 1 1 1 1 1
p_1073 Polymicrobial L.crispatus L.iners G.vaginalis G.vaginalis L.iners G.vaginalis G.vaginalis L.iners 2 2 1 3 3 1
p_1074 L.crispatus L.crispatus Polymicrobial L.crispatus L.crispatus G.vaginalis L.crispatus L.crispatus G.vaginalis 1 1 2 1 1 3
p_1078 L.iners L.iners L.iners L.iners L.iners L.iners L.iners L.iners L.iners 1 1 1 1 1 1
p_1081 L.crispatus L.crispatus L.crispatus L.crispatus L.crispatus L.crispatus L.crispatus L.crispatus L.crispatus 1 1 1 1 1 1
p_1082 L.crispatus Polymicrobial Polymicrobial L.crispatus G.vaginalis G.vaginalis L.crispatus G.vaginalis G.vaginalis 1 2 2 1 3 3
p_1083 Polymicrobial L.iners Polymicrobial G.vaginalis G.vaginalis G.vaginalis G.vaginalis G.vaginalis G.vaginalis 2 2 2 3 3 3
p_1086 L.iners L.iners NA L.iners L.iners L.iners L.iners L.iners L.iners 1 1 1 1 1 1
p_1088 L.crispatus L.crispatus L.iners L.crispatus L.crispatus L.iners L.crispatus L.crispatus L.iners 1 1 1 1 1 1
p_1090 L.iners L.iners Polymicrobial L.crispatus L.iners G.vaginalis L.iners L.iners G.vaginalis 1 1 2 1 1 3
p_1091 L.iners L.iners L.iners L.iners L.crispatus L.iners L.iners L.crispatus L.iners 1 1 1 1 1 1
p_1093 NA NA NA L.iners L.iners NA NA NA NA 1 1 NA NA NA NA
p_1094 Polymicrobial Polymicrobial Polymicrobial G.vaginalis G.vaginalis G.vaginalis G.vaginalis G.vaginalis G.vaginalis 2 2 2 3 3 3
p_1095 NA NA NA G.vaginalis G.vaginalis G.vaginalis NA NA NA 2 2 2 NA NA NA
p_1096 L.iners L.iners L.iners L.iners L.iners L.iners L.iners L.iners L.iners 1 1 1 1 1 1
p_1100 L.iners Polymicrobial L.iners G.vaginalis G.vaginalis G.vaginalis G.vaginalis G.vaginalis G.vaginalis 2 2 2 3 3 3
p_1103 L.crispatus L.iners Li-anaerobes L.crispatus L.iners G.vaginalis L.crispatus L.iners G.vaginalis 1 1 2 1 1 3
p_1104 L.iners Polymicrobial Polymicrobial L.iners G.vaginalis G.vaginalis L.iners G.vaginalis G.vaginalis 1 2 2 1 3 3
p_1108 NA NA NA L.crispatus L.crispatus NA NA NA NA 1 1 NA NA NA NA
p_1110 L.crispatus L.iners L.iners L.iners L.iners L.iners L.iners L.iners L.iners 4 1 1 4 1 1
p_1112 Polymicrobial L.iners Li-anaerobes G.vaginalis L.iners G.vaginalis G.vaginalis L.iners G.vaginalis 2 2 2 3 1 3
p_1113 L.crispatus L.crispatus L.crispatus L.crispatus L.crispatus L.crispatus L.crispatus L.crispatus L.crispatus 1 1 1 1 1 1
p_1117 NA NA NA L.crispatus L.crispatus G.vaginalis NA NA NA 1 1 2 NA NA NA
p_1118 Polymicrobial L.iners L.iners G.vaginalis L.iners L.iners G.vaginalis L.iners L.iners 2 1 1 3 1 1
p_1119 Li-anaerobes Li-anaerobes Li-anaerobes G.vaginalis G.vaginalis G.vaginalis G.vaginalis G.vaginalis G.vaginalis 2 2 2 3 3 3
p_1122 L.iners L.iners L.iners L.iners L.iners L.iners L.iners L.iners L.iners 1 1 1 1 1 1
p_1124 Polymicrobial Polymicrobial Polymicrobial G.vaginalis G.vaginalis G.vaginalis G.vaginalis G.vaginalis G.vaginalis 2 2 2 3 3 3
p_1125 Polymicrobial L.iners L.iners G.vaginalis L.iners L.iners G.vaginalis L.iners L.iners 2 1 1 3 1 1
p_1129 Polymicrobial Polymicrobial L.iners G.vaginalis G.vaginalis L.iners G.vaginalis G.vaginalis L.iners 2 2 1 3 3 1
p_1130 L.iners Polymicrobial L.iners L.iners G.vaginalis L.iners L.iners G.vaginalis L.iners 1 2 1 1 3 1
p_1132 L.iners L.iners Polymicrobial L.iners L.iners G.vaginalis L.iners L.iners G.vaginalis 2 1 2 1 1 3
p_1135 Polymicrobial Polymicrobial Polymicrobial G.vaginalis G.vaginalis G.vaginalis G.vaginalis G.vaginalis G.vaginalis 2 2 2 3 3 3
p_1136 L.iners L.iners Polymicrobial L.iners L.crispatus G.vaginalis L.iners L.crispatus G.vaginalis 1 1 2 1 1 3
p_1137 Li-anaerobes Polymicrobial Polymicrobial G.vaginalis G.vaginalis G.vaginalis G.vaginalis G.vaginalis G.vaginalis 2 2 2 3 3 3
p_1138 L.crispatus L.crispatus L.crispatus L.crispatus L.crispatus L.crispatus L.crispatus L.crispatus L.crispatus 1 1 1 1 1 1
p_1141 Li-anaerobes L.iners Li-anaerobes G.vaginalis G.vaginalis G.vaginalis G.vaginalis G.vaginalis G.vaginalis 2 2 2 3 3 3
p_1144 NA NA NA G.vaginalis G.vaginalis G.vaginalis NA NA NA 2 2 2 NA NA NA
p_1145 L.iners L.crispatus L.iners L.iners L.crispatus L.crispatus L.iners L.crispatus L.crispatus 1 1 1 1 1 1
p_1147 L.crispatus L.iners L.crispatus L.crispatus L.iners L.crispatus L.crispatus L.iners L.crispatus 1 1 1 1 1 1
p_1149 Li-anaerobes Polymicrobial Polymicrobial G.vaginalis G.vaginalis G.vaginalis G.vaginalis G.vaginalis G.vaginalis 2 2 2 3 3 3
p_1150 Polymicrobial Polymicrobial Polymicrobial G.vaginalis G.vaginalis G.vaginalis G.vaginalis G.vaginalis G.vaginalis 2 2 2 3 3 3
p_1151 L.iners Polymicrobial Polymicrobial L.iners G.vaginalis G.vaginalis L.iners G.vaginalis G.vaginalis 1 2 2 1 3 3
p_1152 Polymicrobial Polymicrobial Polymicrobial G.vaginalis G.vaginalis G.vaginalis G.vaginalis G.vaginalis G.vaginalis 2 2 2 3 3 3
p_2001 L.crispatus L.crispatus L.crispatus L.crispatus L.crispatus L.crispatus L.crispatus L.crispatus L.crispatus 1 1 1 1 1 1
p_2002 Polymicrobial Polymicrobial Polymicrobial L.iners L.iners L.iners L.iners L.iners L.iners 3 3 3 2 2 2
p_2004 L.iners L.iners L.iners L.iners L.iners L.iners L.iners L.iners L.iners 1 1 1 1 1 1
p_2005 L.iners L.iners L.iners L.iners L.iners L.iners L.iners L.iners L.iners 1 1 1 1 1 1
p_2006 NA NA NA L.iners G.vaginalis NA NA NA NA 1 2 NA NA NA NA
p_2008 L.iners L.iners L.iners L.iners L.iners L.iners L.iners L.iners L.iners 1 1 1 1 1 1
p_2010 NA Polymicrobial L.iners G.vaginalis G.vaginalis G.vaginalis G.vaginalis G.vaginalis G.vaginalis 2 2 2 3 3 3
p_2011 L.iners Li-anaerobes Polymicrobial L.iners G.vaginalis G.vaginalis G.vaginalis G.vaginalis G.vaginalis 1 2 2 1 3 3
p_2012 L.iners L.iners Polymicrobial L.iners L.iners L.iners L.iners L.iners L.iners 1 1 2 1 1 3
p_2017 L.iners Polymicrobial Polymicrobial L.iners G.vaginalis G.vaginalis L.iners G.vaginalis G.vaginalis 2 2 2 1 3 3
p_2018 Polymicrobial L.iners L.iners G.vaginalis L.iners L.iners G.vaginalis L.iners L.iners 2 1 1 3 1 1
p_2019 L.crispatus L.crispatus L.crispatus L.crispatus L.crispatus L.crispatus L.crispatus L.crispatus L.crispatus 1 1 1 1 1 1
p_2021 L.iners L.iners L.iners L.iners L.iners L.crispatus L.iners L.iners L.crispatus 1 1 1 1 1 1
p_2025 Polymicrobial Polymicrobial Polymicrobial L.iners L.iners L.iners L.iners L.iners L.iners 3 3 3 2 2 2
p_2044 L.iners L.iners L.iners L.iners L.iners L.iners L.iners L.iners L.iners 1 1 2 1 1 3
p_2050 NA L.iners Li-anaerobes G.vaginalis L.iners G.vaginalis G.vaginalis L.iners G.vaginalis 2 1 2 3 1 3
p_2053 NA NA NA G.vaginalis L.iners L.iners NA NA NA 2 1 1 NA NA NA
p_2055 Polymicrobial Polymicrobial Li-anaerobes G.vaginalis G.vaginalis G.vaginalis G.vaginalis G.vaginalis G.vaginalis 2 2 2 3 3 3
p_2059 NA NA NA L.iners L.crispatus L.crispatus NA NA NA 1 1 1 NA NA NA
p_2071 L.iners L.iners L.iners L.crispatus L.crispatus L.crispatus L.crispatus L.crispatus L.crispatus 1 1 1 1 1 1
p_2074 Li-anaerobes Polymicrobial Polymicrobial L.iners L.iners L.iners L.iners L.iners L.iners 1 1 1 1 1 1
p_2079 L.crispatus L.crispatus L.crispatus L.crispatus L.crispatus L.crispatus L.crispatus L.crispatus L.crispatus 1 1 1 1 1 1
p_2094 L.iners L.iners L.iners L.iners L.iners L.iners L.iners L.iners L.iners 1 1 1 1 1 1
p_2096 NA NA NA L.iners L.iners L.iners NA NA NA 1 1 2 NA NA NA
p_2099 L.iners L.crispatus Polymicrobial L.iners L.crispatus G.vaginalis L.iners L.crispatus G.vaginalis 1 1 2 1 1 3
p_2101 Polymicrobial L.iners L.iners L.iners L.iners L.iners L.iners L.iners L.iners 4 1 1 4 1 1
p_2102 L.iners Polymicrobial Polymicrobial G.vaginalis G.vaginalis G.vaginalis G.vaginalis G.vaginalis G.vaginalis 2 2 2 3 3 3
p_2105 NA NA NA G.vaginalis G.vaginalis L.iners NA NA NA 2 2 1 NA NA NA
p_2106 L.iners L.iners L.iners L.iners G.vaginalis L.iners G.vaginalis G.vaginalis L.iners 2 2 1 3 3 1
p_2109 L.crispatus L.crispatus L.crispatus L.crispatus L.crispatus L.crispatus L.crispatus L.crispatus L.crispatus 1 1 1 1 1 1
p_2110 L.crispatus L.crispatus L.crispatus L.crispatus L.crispatus L.crispatus L.crispatus L.crispatus L.crispatus 1 1 1 1 1 1
p_2119 L.crispatus NA L.crispatus L.crispatus L.crispatus L.crispatus L.crispatus L.crispatus L.crispatus 1 1 1 1 1 1
p_2120 Polymicrobial Polymicrobial Polymicrobial L.iners G.vaginalis G.vaginalis L.iners G.vaginalis G.vaginalis 2 2 2 3 3 3
p_2123 L.crispatus L.crispatus L.iners L.crispatus L.crispatus L.iners L.crispatus L.crispatus L.iners 1 1 2 1 1 3
p_2124 NA NA NA L.crispatus L.crispatus L.crispatus NA NA NA 1 1 1 NA NA NA
p_2134 L.iners L.iners L.crispatus L.iners L.iners L.crispatus L.iners L.iners L.crispatus 1 1 1 1 1 1
p_2140 L.iners L.iners L.iners L.iners L.iners L.iners L.iners L.iners L.iners 1 1 1 1 1 1
p_2153 L.iners L.iners L.iners L.iners L.iners L.iners L.iners L.iners L.iners 1 1 1 1 1 1
p_3001 Polymicrobial NA Polymicrobial G.vaginalis G.vaginalis G.vaginalis G.vaginalis G.vaginalis G.vaginalis 2 2 2 3 3 3
p_3002 Polymicrobial L.iners L.iners G.vaginalis L.iners L.iners G.vaginalis L.iners L.iners 2 1 1 3 1 1
p_3008 L.iners Li-anaerobes Polymicrobial G.vaginalis G.vaginalis G.vaginalis G.vaginalis G.vaginalis G.vaginalis 2 2 2 3 3 3
p_3012 L.iners L.iners L.iners L.iners L.iners L.iners L.iners L.iners L.iners 2 2 1 3 3 1
p_3021 NA NA NA L.crispatus L.crispatus L.crispatus NA NA NA 1 1 1 NA NA NA
p_3025 NA NA NA L.iners L.iners L.iners NA NA NA 1 1 1 NA NA NA
p_3046 Polymicrobial Polymicrobial L.iners G.vaginalis G.vaginalis L.iners G.vaginalis G.vaginalis L.iners 2 2 1 3 3 1
p_3048 L.iners Polymicrobial Polymicrobial L.iners G.vaginalis G.vaginalis L.iners G.vaginalis G.vaginalis 1 2 2 1 3 3
p_3056 L.crispatus L.crispatus L.crispatus G.vaginalis G.vaginalis G.vaginalis G.vaginalis G.vaginalis G.vaginalis 2 2 2 3 3 3

sessionInfo()
#> R version 4.4.1 (2024-06-14)
#> Platform: x86_64-pc-linux-gnu
#> Running under: Ubuntu 24.04.1 LTS
#> 
#> Matrix products: default
#> BLAS:   /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 
#> LAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.26.so;  LAPACK version 3.12.0
#> 
#> locale:
#>  [1] LC_CTYPE=en_US.UTF-8       LC_NUMERIC=C              
#>  [3] LC_TIME=es_ES.UTF-8        LC_COLLATE=en_US.UTF-8    
#>  [5] LC_MONETARY=es_ES.UTF-8    LC_MESSAGES=en_US.UTF-8   
#>  [7] LC_PAPER=es_ES.UTF-8       LC_NAME=C                 
#>  [9] LC_ADDRESS=C               LC_TELEPHONE=C            
#> [11] LC_MEASUREMENT=es_ES.UTF-8 LC_IDENTIFICATION=C       
#> 
#> time zone: Europe/Madrid
#> tzcode source: system (glibc)
#> 
#> attached base packages:
#> [1] stats     graphics  grDevices utils     datasets  methods   base     
#> 
#> other attached packages:
#> [1] ggplot2_3.5.1  magrittr_2.0.3
#> 
#> loaded via a namespace (and not attached):
#>   [1] ggstatsplot_0.12.4      splines_4.4.1           later_1.3.2            
#>   [4] tibble_3.2.1            polyclip_1.10-7         datawizard_0.13.0      
#>   [7] ggmosaic_0.3.3          janitor_2.2.0           lifecycle_1.0.4        
#>  [10] rstatix_0.7.2           rprojroot_2.0.4         lattice_0.22-6         
#>  [13] vroom_1.6.5             MASS_7.3-61             insight_0.20.5         
#>  [16] backports_1.5.0         plotly_4.10.4           sass_0.4.9             
#>  [19] rmarkdown_2.28          jquerylib_0.1.4         yaml_2.3.10            
#>  [22] wesanderson_0.3.7       httpuv_1.6.15           ggside_0.3.1           
#>  [25] RColorBrewer_1.1-3      ade4_1.7-22             lubridate_1.9.3        
#>  [28] abind_1.4-8             zlibbioc_1.50.0         purrr_1.0.2            
#>  [31] BiocGenerics_0.50.0     phyloseq_1.48.0         tweenr_2.0.3           
#>  [34] git2r_0.33.0            GenomeInfoDbData_1.2.12 IRanges_2.38.1         
#>  [37] S4Vectors_0.42.1        ggrepel_0.9.6           correlation_0.8.5      
#>  [40] vegan_2.6-8             svglite_2.1.3           permute_0.9-7          
#>  [43] codetools_0.2-20        xml2_1.3.6              ggforce_0.4.2          
#>  [46] tidyselect_1.2.1        SuppDists_1.1-9.8       UCSC.utils_1.0.0       
#>  [49] farver_2.1.2            gmp_0.7-5               effectsize_0.8.9       
#>  [52] stats4_4.4.1            jsonlite_1.8.9          multtest_2.60.0        
#>  [55] Formula_1.2-5           survival_3.7-0          iterators_1.0.14       
#>  [58] systemfonts_1.1.0       foreach_1.5.2           BWStest_0.2.3          
#>  [61] tools_4.4.1             PMCMRplus_1.9.12        Rcpp_1.0.13            
#>  [64] glue_1.8.0              xfun_0.48               here_1.0.1             
#>  [67] mgcv_1.9-1              kSamples_1.2-10         metar_0.1.5            
#>  [70] GenomeInfoDb_1.40.1     dplyr_1.1.4             withr_3.0.1            
#>  [73] fastmap_1.2.0           boot_1.3-31             rhdf5filters_1.16.0    
#>  [76] fansi_1.0.6             digest_0.6.37           timechange_0.3.0       
#>  [79] R6_2.5.1                colorspace_2.1-1        utf8_1.2.4             
#>  [82] tidyr_1.3.1             generics_0.1.3          data.table_1.16.2      
#>  [85] httr_1.4.7              htmlwidgets_1.6.4       parameters_0.22.2      
#>  [88] pkgconfig_2.0.3         gtable_0.3.5            Rmpfr_0.9-5            
#>  [91] workflowr_1.7.1         statsExpressions_1.6.0  XVector_0.44.0         
#>  [94] htmltools_0.5.8.1       carData_3.0-5           biomformat_1.32.0      
#>  [97] multcompView_0.1-10     scales_1.3.0            kableExtra_1.4.0       
#> [100] Biobase_2.64.0          snakecase_0.11.1        knitr_1.48             
#> [103] rstudioapi_0.16.0       tzdb_0.4.0              reshape2_1.4.4         
#> [106] nlme_3.1-166            cachem_1.1.0            rhdf5_2.48.0           
#> [109] stringr_1.5.1           parallel_4.4.1          pillar_1.9.0           
#> [112] grid_4.4.1              logger_0.3.0            vctrs_0.6.5            
#> [115] promises_1.3.0          ggpubr_0.6.0            car_3.1-3              
#> [118] cluster_2.1.6           paletteer_1.6.0         evaluate_1.0.1         
#> [121] readr_2.1.5             zeallot_0.1.0           mvtnorm_1.3-1          
#> [124] cli_3.6.3               compiler_4.4.1          rlang_1.1.4            
#> [127] crayon_1.5.3            ggsignif_0.6.4          labeling_0.4.3         
#> [130] rematch2_2.1.2          plyr_1.8.9              forcats_1.0.0          
#> [133] fs_1.6.4                stringi_1.8.4           viridisLite_0.4.2      
#> [136] munsell_0.5.1           Biostrings_2.72.1       lazyeval_0.2.2         
#> [139] bayestestR_0.14.0       Matrix_1.7-0            hms_1.1.3              
#> [142] patchwork_1.3.0         bit64_4.5.2             Rhdf5lib_1.26.0        
#> [145] highr_0.11              igraph_2.0.3            broom_1.0.7            
#> [148] memoise_2.0.1           bslib_0.8.0             bit_4.5.0              
#> [151] ape_5.8