library(here)
library(tidyverse)
library(biomaRt)
library(Herper)
library(taxize)
library(Biostrings)
library(cogeqc)
set.seed(123) # for reproducibility
options(timeout = 1e6) # to allow download of big files
source(here("code", "utils.R"))
source(here("code", "utils_busco_phylogeny.R"))
1 Obtaining species trees for Ensembl instances
Here, we will describe the code to obtain a species tree for each Ensembl instance using BUSCO genes.
1.1 Summary stats
To start with, let’s get the number of species for each instance:
# Get number of species in Ensembl Genomes
<- c("fungi_mart", "plants_mart", "metazoa_mart", "protists_mart")
instances <- unlist(lapply(instances, function(x) {
nspecies_ensemblgenomes return(nrow(listDatasets(useEnsemblGenomes(biomart = x))))
}))
# Get number of species in Ensembl
<- nrow(listDatasets(useEnsembl(biomart = "genes")))
nspecies_ensembl
# Combine summary stats onto a data frame
<- data.frame(
nspecies_all instance = c(gsub("_mart", "", instances), "ensembl"),
n_genes = c(nspecies_ensemblgenomes, nspecies_ensembl)
)
nspecies_all
instance n_genes
1 fungi 70
2 plants 151
3 metazoa 280
4 protists 33
5 ensembl 214
1.2 Getting species metadata
Now, let’s get species metadata for each Ensembl instance.
# Metadata column names
<- c(
col_names "name", "species", "division", "taxonomy_id", "assembly",
"assembly_accession", "genebuild", "variation", "microarray", "pan_compara",
"peptide_compara", "genome_alignments", "other_alignments", "core_db",
"species_id"
)
<- c(
to_remove "variation", "microarray", "pan_compara", "peptide_compara",
"genome_alignments", "other_alignments", "core_db", "species_id"
)
# Ensembl Fungi
<- read_tsv(
metadata_fungi "http://ftp.ebi.ac.uk/ensemblgenomes/pub/release-57/fungi/species_EnsemblFungi.txt",
col_names = col_names, skip = 1, col_select = 1:15, show_col_types = FALSE
|>
) ::filter(!startsWith(core_db, "fungi_")) |>
dplyr::select(!any_of(to_remove)) |>
dplyras.data.frame()
<- cbind(
metadata_fungi
metadata_fungi,classification(metadata_fungi$taxonomy_id, db = "ncbi") |>
format_classification()
)
# Ensembl Plants
<- read_tsv(
metadata_plants "http://ftp.ebi.ac.uk/ensemblgenomes/pub/release-57/plants/species_EnsemblPlants.txt",
col_names = col_names, skip = 1, col_select = 1:15, show_col_types = FALSE
|>
) ::filter(species != "triticum_aestivum_kariega") |>
dplyr::select(!any_of(to_remove)) |>
dplyras.data.frame()
<- cbind(
metadata_plants
metadata_plants,classification(metadata_plants$taxonomy_id, db = "ncbi") |>
format_classification()
)
# Ensembl Metazoa
<- read_tsv(
metadata_metazoa "http://ftp.ebi.ac.uk/ensemblgenomes/pub/release-57/metazoa/species_EnsemblMetazoa.txt",
col_names = col_names, skip = 1, col_select = 1:15, show_col_types = FALSE
|>
) ::filter(!startsWith(core_db, "metazoa_")) |>
dplyr::select(!any_of(to_remove)) |>
dplyras.data.frame()
<- cbind(
metadata_metazoa
metadata_metazoa,classification(metadata_metazoa$taxonomy_id, db = "ncbi") |>
format_classification()
)
# Ensembl Protists
<- read_tsv(
metadata_protists "http://ftp.ebi.ac.uk/ensemblgenomes/pub/release-57/protists/species_EnsemblProtists.txt",
col_names = col_names, skip = 1, col_select = 1:15, show_col_types = FALSE
|>
) ::filter(!startsWith(core_db, "protists_")) |>
dplyr::select(!any_of(to_remove)) |>
dplyras.data.frame()
<- cbind(
metadata_protists
metadata_protists,classification(metadata_protists$taxonomy_id, db = "ncbi") |>
format_classification()
)
# Ensembl
<- read_tsv(
metadata_ensembl "https://ftp.ensembl.org/pub/release-110/species_EnsemblVertebrates.txt",
col_names = col_names, skip = 1, col_select = 1:15, show_col_types = FALSE
|>
) ::select(!any_of(to_remove)) |>
dplyras.data.frame()
<- cbind(
metadata_ensembl
metadata_ensembl,classification(metadata_ensembl$taxonomy_id, db = "ncbi") |>
format_classification()
)
# Combining all metadata data frames into a list and saving it
<- list(
metadata_all fungi = metadata_fungi,
plants = metadata_plants,
metazoa = metadata_metazoa,
protists = metadata_protists,
ensembl = metadata_ensembl
)
save(
compress = "xz",
metadata_all, file = here("products", "result_files", "metadata_all.rda")
)
1.3 BUSCO-guided phylogeny inference
Here, for each Ensembl instance, we infer a species tree using the following workflow:
- Run BUSCO in protein mode with cogeqc, using translated sequences for primary transcripts as input;
- Get the sequences of the identified complete BUSCOs that are shared across all species;
- Perform a multiple sequence alignment for each BUSCO gene family.
- Trim the alignments to remove columns with >50% of gaps.
- Infer a phylogeny with IQ-TREE2.
To start with, we will use the Bioconductor package Herper to create a Conda environment containing BUSCO and all its dependencies. Then, we will use this environment to run BUSCO from the R session.
# Create Conda environment with BUSCO
<- "~/"
my_miniconda
<- install_CondaTools(
conda tools = "busco==5.5.0",
env = "busco_env",
pathToMiniConda = my_miniconda
)
1.3.1 Obtaining BUSCO sequences
To obtain sequences for BUSCO genes, we will run BUSCO in protein mode using the R/Bioconductor package cogeqc. Then, we will read the sequences for complete, single-copy BUSCOs, and keep only BUSCO genes that are shared by a certain % of the species. Ideally, this cut-off should be 100% of conservation (i.e., the BUSCO gene is found in all species), but it can be relaxed for some clades.
1.3.1.1 Ensembl Fungi
Here, we will obtain BUSCO genes for Ensembl Fungi species using the following parameters:
- Lineage: eukaryota_odb10
- Conservation: 100%
# Download whole-genome protein sequences to a directory sequences
<- file.path("~/Downloads/busco_fungi")
busco_fungi <- file.path(busco_fungi, "seqs")
seq_fungi if(!dir.exists(seq_fungi)) { dir.create(seq_fungi, recursive = TRUE) }
download_filtered_proteomes(metadata_all$fungi, "fungi", seq_fungi)
# Run BUSCO in `protein` mode
with_CondaEnv(
"busco_env",
::run_busco(
cogeqcsequence = seq_fungi,
outlabel = "ensembl_fungi",
mode = "protein",
lineage = "eukaryota_odb10",
outpath = busco_fungi,
threads = 3,
download_path = busco_fungi
),pathToMiniConda = my_miniconda
)
<- file.path(busco_fungi, "ensembl_fungi")
outdir <- read_busco_sequences(outdir, verbose = TRUE) fungi_busco_seqs
Saving BUSCO sequences:
# Save list of AAStringSet objects with conserved BUSCO sequences
save(
compress = "xz",
fungi_busco_seqs, file = here("products", "result_files", "busco_seqs", "fungi_busco_seqs.rda")
)
1.3.1.2 Ensembl Plants
Here, we will use the lineage data set eukaryota_odb10. We could use viridiplantae_odb10, but there are 3 Rhodophyta species (Chondrus crispus, Galdieria sulphuraria, and Cyanidioschyzon merolae). Because none of the BUSCO genes were shared by all species, we selected genes shared by >60% of the species, and then manually selected BUSCO genes in a way that all species are included. This was required because some taxa (in particular Triticum species) had very few BUSCO genes.
# Download whole-genome protein sequences to a directory sequences
<- file.path("~/Downloads/busco_plants")
busco_plants <- file.path(busco_plants, "seqs")
seq_plants if(!dir.exists(seq_plants)) { dir.create(seq_plants, recursive = TRUE) }
download_filtered_proteomes(metadata_all$plants, "plants", seq_plants)
# Run BUSCO in `protein` mode
with_CondaEnv(
"busco_env",
::run_busco(
cogeqcsequence = seq_plants,
outlabel = "ensemblplants",
mode = "protein",
lineage = "eukaryota_odb10",
outpath = busco_plants,
threads = 4,
download_path = busco_plants
),pathToMiniConda = my_miniconda
)
# Read sequences of BUSCOs preserved in >=60% of the species
<- file.path(busco_plants, "ensemblplants")
outdir <- read_busco_sequences(outdir, conservation_freq = 0.6)
plants_busco_seqs
# Select 10 BUSCO genes so that all species are represented
<- get_busco_pav(plants_busco_seqs)
plants_busco_pav
#' The following code was used to manually select BUSCOs in a way that
#' all species are represented
#> ht <- ComplexHeatmap::Heatmap(plants_busco_pav)
#> ht <- ComplexHeatmap::draw(ht)
#> InteractiveComplexHeatmap::htShiny(ht)
# Create a vector of selected BUSCOs
<- c(
selected_buscos "549762at2759", "1003258at2759", "1247641at2759",
"1200489at2759", "1398309at2759", "1346432at2759",
"1266231at2759", "1094121at2759", "1421503at2759",
"664730at2759", "1405073at2759", "450058at2759",
"865202at2759", "901894at2759", "1450538at2759",
"1284731at2759"
)
# Subset sequences to keep only selected BUSCOs
<- plants_busco_seqs[selected_buscos] plants_busco_seqs
Saving BUSCO sequences:
# Save list of AAStringSet objects with conserved BUSCO sequences
save(
compress = "xz",
plants_busco_seqs, file = here("products", "result_files", "busco_seqs", "plants_busco_seqs.rda")
)
1.3.1.3 Ensembl Protists
Here, we will obtain BUSCO genes for Ensembl Protists species using the following parameters:
- Lineage: eukaryota_odb10
- Conservation: 100%
# Download whole-genome protein sequences to a directory sequences
<- file.path("~/Downloads/busco_protists")
busco_protists <- file.path(busco_protists, "seqs")
seq_protists if(!dir.exists(seq_protists)) { dir.create(seq_protists, recursive = TRUE) }
download_filtered_proteomes(metadata_all$protists, "protists", seq_protists)
# Run BUSCO in `protein` mode
with_CondaEnv(
"busco_env",
::run_busco(
cogeqcsequence = seq_protists,
outlabel = "ensemblprotists",
mode = "protein",
lineage = "eukaryota_odb10",
outpath = busco_protists,
threads = 4,
download_path = busco_protists
),pathToMiniConda = my_miniconda
)
# Read sequences of BUSCOs preserved in >=60% of the species
<- file.path(busco_protists, "ensemblprotists")
outdir <- read_busco_sequences(outdir, verbose = TRUE) protists_busco_seqs
Saving BUSCO sequences:
# Save list of AAStringSet objects with conserved BUSCO sequences
save(
compress = "xz",
protists_busco_seqs, file = here("products", "result_files", "busco_seqs", "protists_busco_seqs.rda")
)
1.3.1.4 Ensembl Metazoa
For the Metazoa instance, we used the metazoa_odb10 lineage data set.
# Download whole-genome protein sequences to a directory sequences
<- file.path("~/Downloads/busco_metazoa")
busco_metazoa <- file.path(busco_metazoa, "seqs")
seq_metazoa if(!dir.exists(seq_metazoa)) { dir.create(seq_metazoa, recursive = TRUE) }
download_filtered_proteomes(metadata_all$metazoa, "metazoa", seq_metazoa)
# Run BUSCO in `protein` mode
with_CondaEnv(
"busco_env",
::run_busco(
cogeqcsequence = seq_metazoa,
outlabel = "ensemblmetazoa",
mode = "protein",
lineage = "metazoa_odb10",
outpath = busco_metazoa,
threads = 4,
download_path = busco_metazoa
),pathToMiniConda = my_miniconda
)
# Read sequences of BUSCOs preserved in >=60% of the species
<- file.path(busco_metazoa, "ensemblmetazoa")
outdir <- read_busco_sequences(outdir, conservation_freq = 0.9)
metazoa_busco_seqs
# Select 10 BUSCO genes so that all species are represented
<- get_busco_pav(metazoa_busco_seqs)
metazoa_busco_pav
#' The following code was used to manually select BUSCOs in a way that
#' all species are represented
#> ht <- ComplexHeatmap::Heatmap(metazoa_busco_pav)
#> ht <- ComplexHeatmap::draw(ht)
#> InteractiveComplexHeatmap::htShiny(ht)
# Create a vector of selected BUSCOs
<- c(
selected_buscos "351226at33208", "135294at33208",
"517525at33208", "501396at33208",
"464987at33208", "443518at33208",
"495100at33208", "335107at33208",
"454911at33208", "134492at33208"
)
# Subset sequences to keep only selected BUSCOs
<- metazoa_busco_seqs[selected_buscos] metazoa_busco_seqs
Saving BUSCO sequences:
# Save list of AAStringSet objects with conserved BUSCO sequences
save(
compress = "xz",
metazoa_busco_seqs, file = here("products", "result_files", "busco_seqs", "metazoa_busco_seqs.rda")
)
1.3.1.5 Ensembl Vertebrates
Here, because there are 3 non-vertebrate species (C. elegans, D. melanogaster, and S. cerevisiae), we will use the lineage data set eukaryota_odb10.
# Download whole-genome protein sequences to a directory sequences
<- file.path("~/Downloads/busco_vertebrates")
busco_vertebrates <- file.path(busco_vertebrates, "seqs")
seq_vertebrates if(!dir.exists(seq_vertebrates)) { dir.create(seq_vertebrates, recursive = TRUE) }
download_filtered_proteomes(metadata_all$ensembl, "ensembl", seq_vertebrates)
# Run BUSCO in `protein` mode
with_CondaEnv(
"busco_env",
::run_busco(
cogeqcsequence = seq_vertebrates,
outlabel = "ensemblvertebrates",
mode = "protein",
lineage = "eukaryota_odb10",
outpath = busco_vertebrates,
threads = 4,
download_path = busco_vertebrates
),pathToMiniConda = my_miniconda
)
# Read sequences of BUSCOs preserved in >=90% of the species
<- file.path(busco_vertebrates, "ensemblvertebrates")
outdir <- read_busco_sequences(outdir, conservation_freq = 0.9)
vertebrates_busco_seqs
# Select 10 BUSCO genes so that all species are represented
<- get_busco_pav(vertebrates_busco_seqs)
vertebrates_busco_pav
#' The following code was used to manually select BUSCOs in a way that
#' all species are represented
#> ht <- ComplexHeatmap::Heatmap(vertebrates_busco_pav)
#> ht <- ComplexHeatmap::draw(ht)
#> InteractiveComplexHeatmap::htShiny(ht)
# Create a vector of selected BUSCOs
<- c(
selected_buscos "834694at2759", "551907at2759",
"491869at2759", "1085752at2759",
"801857at2759", "1398309at2759",
"176625at2759", "1324510at2759",
"1377237at2759", "1085752at2759"
)
# Subset sequences to keep only selected BUSCOs
<- vertebrates_busco_seqs[selected_buscos] vertebrates_busco_seqs
Saving BUSCO sequences:
# Save list of AAStringSet objects with conserved BUSCO sequences
save(
compress = "xz",
vertebrates_busco_seqs, file = here("products", "result_files", "busco_seqs", "vertebrates_busco_seqs")
)
1.3.2 Tree inference from BUSCO genes
Now, we will infer species trees from MSAs for each family, and from a single concatenated MSA (when possible).
1.3.2.1 Ensembl Fungi
Performing MSA with MAFFT and trimming the alignment:
# Perform MSA with MAFFT
<- align_sequences(busco_seqs_fungi, threads = 4)
aln_fungi
# Trim alignment to remove columns with >50% of gaps
<- lapply(aln_fungi, trim_alignment, max_gap = 0.5) aln_fungi_trimmed
Now, let’s infer a species tree using IQ-TREE2.
<- "aphanomyces.astaci,aphanomyces.invadans,globisporangium.ultimum"
outgroup <- infer_species_tree(aln_fungi_trimmed, outgroup, threads = 4) trees_fungi
Finally, for comparative reasons, we will also infer a single tree from a concatenated multiple sequence alignment.
# Concatenate alignments
<- Reduce(xscat, aln_fungi_trimmed)
aln_fungi_conc names(aln_fungi_conc) <- names(aln_fungi_trimmed[[1]])
# Infer tree from concatenated alignment
<- infer_species_tree(
tree_fungi_conc list(conc = aln_fungi_conc),
threads = 4
outgroup, )
Combining the trees and saving them:
# Combine trees
<- c(
fungi_busco_trees
tree_fungi_conc, trees_fungi
)
save(
compress = "xz",
fungi_busco_trees, file = here("products", "result_files", "trees", "fungi_busco_trees.rda")
)
1.3.2.2 Ensembl Plants
Here, because no BUSCO gene is present in all species, we will only infer a single tree from concatenated alignments.
# Perform MSA with MAFFT
<- align_sequences(plants_busco_seqs, threads = 4)
aln_plants
# Trim alignment to remove columns with >50% of gaps
<- lapply(aln_plants, trim_alignment, max_gap = 0.5) aln_plants_trimmed
Finally, let’s infer a species tree from a concatenated alignment. As outgroups, we’re going to use Chondrus crispus, Galdieria sulphuraria, and Cyanidioschyzon merolae.
<- "chondrus.crispus,galdieria.sulphuraria,cyanidioschyzon.merolae"
outgroup
# Concatenate alignments
<- concatenate_alignments(aln_plants_trimmed)
aln_plants_conc
# Infer tree from concatenated alignment
<- infer_species_tree(
plants_busco_trees list(conc = aln_plants_conc),
threads = 4
outgroup,
)
# Save tree
save(
compress = "xz",
plants_busco_trees, file = here("products", "result_files", "trees", "plants_busco_trees.rda")
)
1.3.2.3 Ensembl Protists
For this instance, two BUSCO genes were conserved across all species, so we will infer trees for each family + a tree from a concatenated alignment.
# Perform MSA with MAFFT
<- align_sequences(protists_busco_seqs, threads = 4)
aln_protists
# Trim alignment to remove columns with >50% of gaps
<- lapply(aln_protists, trim_alignment, max_gap = 0.5) aln_protists_trimmed
Now, let’s infer species trees. As outgroup, we will use Fornicata (Giardia lamblia) based on this paper.
<- "giardia.lamblia"
outgroup
# Path 1: a tree per BUSCO gene
<- infer_species_tree(
protists_trees1 threads = 4
aln_protists_trimmed, outgroup,
)
# Path 2: a single tree from a concatenated alignment
<- infer_species_tree(
protists_trees2 list(conc = concatenate_alignments(aln_protists_trimmed)),
threads = 6
outgroup,
)
# Combine trees and save them
<- c(protists_trees1, protists_trees2)
protists_busco_trees
save(
compress = "xz",
protists_busco_trees, file = here("products", "result_files", "trees", "protists_busco_trees.rda")
)
However, even though we specified Giardia lamblia, IQ-TREE2 placed it as an ingroup. This suggests that, based on our data (BUSCO sequences), Giardia lamblia may not be a good outgroup.
Since protists are not actually a real phylogenetic group (not monophyletic), instead of digging deeper into the real phylogeny of the group and searching for a proper outgroup, we will simply use this phylogeny but acknowledging that it may not be completely accurate.
1.3.2.4 Ensembl Metazoa
For this instance, two BUSCO genes were conserved across all species, so we will infer trees for each family + a tree from a concatenated alignment.
# Perform MSA with MAFFT
<- align_sequences(metazoa_busco_seqs, threads = 4)
aln_metazoa
# Trim alignment to remove columns with >50% of gaps
<- lapply(aln_metazoa, trim_alignment, max_gap = 0.5) aln_metazoa_trimmed
Now, let’s infer a species tree. As outgroup, we will use the ctenophore Mnemiopsis leidyi.
<- "mnemiopsis.leidyi"
outgroup
# Get a single tree from a concatenated alignment
<- infer_species_tree(
metazoa_busco_trees list(conc = concatenate_alignments(aln_metazoa_trimmed)),
threads = 6
outgroup,
)
# Save tree
save(
compress = "xz",
metazoa_busco_trees, file = here("products", "result_files", "trees", "metazoa_busco_trees.rda")
)
1.3.2.5 Ensembl Vertebrates
For this instance, no BUSCO gene was conserved in all species. Thus, we will infer a single tree from a concatenated alignment of ten representative BUSCOs.
# Perform MSA with MAFFT
<- align_sequences(vertebrates_busco_seqs, threads = 4)
aln_vertebrates
# Trim alignment to remove columns with >50% of gaps
<- lapply(aln_vertebrates, trim_alignment, max_gap = 0.5) aln_vertebrates_trimmed
Now, let’s infer a species tree. As outgroup, we will use the yeast Saccharomyces cerevisiae.
<- "saccharomyces.cerevisiae"
outgroup
# Get a single tree from a concatenated alignment
<- infer_species_tree(
vertebrates_busco_trees list(conc = concatenate_alignments(aln_vertebrates_trimmed)),
threads = 6
outgroup,
)
# Save tree
save(
compress = "xz",
vertebrates_busco_trees, file = here("products", "result_files", "trees", "vertebrates_busco_trees.rda")
)
1.4 Obtaining BUSCO scores
Finally, since we ran BUSCO to obtain single-copy gene families, we will also use BUSCO’s output to explore gene space completeness across species in Ensembl instances.
# Read BUSCO completeness stats
## Ensembl Fungi
<- read_busco(
fungi_busco_scores "~/Downloads/busco_fungi/ensembl_fungi"
)
## Ensembl Plants
<- read_busco(
plants_busco_scores "~/Downloads/busco_plants/ensemblplants"
)
## Ensembl Protists
<- read_busco(
protists_busco_scores "~/Downloads/busco_protists/ensemblprotists"
)
## Ensembl Metazoa
<- read_busco(
metazoa_busco_scores "~/Downloads/busco_metazoa/ensemblmetazoa"
)
## Ensembl Vertebrates
<- read_busco(
vertebrates_busco_scores "~/Downloads/busco_vertebrates/ensemblvertebrates"
)
# Save files
save(
compress = "xz",
fungi_busco_scores, file = here(
"products", "result_files", "busco_scores", "fungi_busco_scores.rda"
)
)
save(
compress = "xz",
plants_busco_scores, file = here(
"products", "result_files", "busco_scores", "plants_busco_scores.rda"
)
)
save(
compress = "xz",
protists_busco_scores, file = here(
"products", "result_files", "busco_scores", "protists_busco_scores.rda"
)
)
save(
compress = "xz",
metazoa_busco_scores, file = here(
"products", "result_files", "busco_scores", "metazoa_busco_scores.rda"
)
)
save(
compress = "xz",
vertebrates_busco_scores, file = here(
"products", "result_files", "busco_scores", "vertebrates_busco_scores.rda"
) )
Session info
This document was created under the following conditions:
─ Session info ───────────────────────────────────────────────────────────────
setting value
version R version 4.3.2 (2023-10-31)
os Ubuntu 22.04.3 LTS
system x86_64, linux-gnu
ui X11
language (EN)
collate en_US.UTF-8
ctype en_US.UTF-8
tz Europe/Brussels
date 2024-02-12
pandoc 3.1.1 @ /usr/lib/rstudio/resources/app/bin/quarto/bin/tools/ (via rmarkdown)
─ Packages ───────────────────────────────────────────────────────────────────
package * version date (UTC) lib source
AnnotationDbi 1.64.1 2023-11-03 [1] Bioconductor
ape 5.7-1 2023-03-13 [1] CRAN (R 4.3.2)
aplot 0.2.2 2023-10-06 [1] CRAN (R 4.3.2)
beeswarm 0.4.0 2021-06-01 [1] CRAN (R 4.3.2)
Biobase 2.62.0 2023-10-24 [1] Bioconductor
BiocFileCache 2.10.1 2023-10-26 [1] Bioconductor
BiocGenerics * 0.48.1 2023-11-01 [1] Bioconductor
biomaRt * 2.58.0 2023-10-24 [1] Bioconductor
Biostrings * 2.70.1 2023-10-25 [1] Bioconductor
bit 4.0.5 2022-11-15 [1] CRAN (R 4.3.2)
bit64 4.0.5 2020-08-30 [1] CRAN (R 4.3.2)
bitops 1.0-7 2021-04-24 [1] CRAN (R 4.3.2)
blob 1.2.4 2023-03-17 [1] CRAN (R 4.3.2)
bold 1.3.0 2023-05-02 [1] CRAN (R 4.3.2)
cachem 1.0.8 2023-05-01 [1] CRAN (R 4.3.2)
cli 3.6.2 2023-12-11 [1] CRAN (R 4.3.2)
codetools 0.2-19 2023-02-01 [4] CRAN (R 4.2.2)
cogeqc * 1.6.0 2023-10-24 [1] Bioconductor
colorspace 2.1-0 2023-01-23 [1] CRAN (R 4.3.2)
conditionz 0.1.0 2019-04-24 [1] CRAN (R 4.3.2)
crayon 1.5.2 2022-09-29 [1] CRAN (R 4.3.2)
crul 1.4.0 2023-05-17 [1] CRAN (R 4.3.2)
curl 5.2.0 2023-12-08 [1] CRAN (R 4.3.2)
data.table 1.14.10 2023-12-08 [1] CRAN (R 4.3.2)
DBI 1.1.3 2022-06-18 [1] CRAN (R 4.3.2)
dbplyr 2.4.0 2023-10-26 [1] CRAN (R 4.3.2)
digest 0.6.33 2023-07-07 [1] CRAN (R 4.3.2)
dplyr * 1.1.4 2023-11-17 [1] CRAN (R 4.3.2)
evaluate 0.23 2023-11-01 [1] CRAN (R 4.3.2)
fansi 1.0.6 2023-12-08 [1] CRAN (R 4.3.2)
fastmap 1.1.1 2023-02-24 [1] CRAN (R 4.3.2)
filelock 1.0.3 2023-12-11 [1] CRAN (R 4.3.2)
forcats * 1.0.0 2023-01-29 [1] CRAN (R 4.3.2)
foreach 1.5.2 2022-02-02 [1] CRAN (R 4.3.2)
fs 1.6.3 2023-07-20 [1] CRAN (R 4.3.2)
generics 0.1.3 2022-07-05 [1] CRAN (R 4.3.2)
GenomeInfoDb * 1.38.2 2023-12-13 [1] Bioconductor 3.18 (R 4.3.2)
GenomeInfoDbData 1.2.11 2023-12-21 [1] Bioconductor
ggbeeswarm 0.7.2 2023-04-29 [1] CRAN (R 4.3.2)
ggfun 0.1.3 2023-09-15 [1] CRAN (R 4.3.2)
ggplot2 * 3.4.4 2023-10-12 [1] CRAN (R 4.3.2)
ggplotify 0.1.2 2023-08-09 [1] CRAN (R 4.3.2)
ggtree 3.10.0 2023-10-24 [1] Bioconductor
glue 1.6.2 2022-02-24 [1] CRAN (R 4.3.2)
gridGraphics 0.5-1 2020-12-13 [1] CRAN (R 4.3.2)
gtable 0.3.4 2023-08-21 [1] CRAN (R 4.3.2)
here * 1.0.1 2020-12-13 [1] CRAN (R 4.3.2)
Herper * 1.10.1 2024-02-08 [1] Github (RockefellerUniversity/Herper@ae37f3d)
hms 1.1.3 2023-03-21 [1] CRAN (R 4.3.2)
htmltools 0.5.7 2023-11-03 [1] CRAN (R 4.3.2)
htmlwidgets 1.6.4 2023-12-06 [1] CRAN (R 4.3.2)
httpcode 0.3.0 2020-04-10 [1] CRAN (R 4.3.2)
httr 1.4.7 2023-08-15 [1] CRAN (R 4.3.2)
igraph 2.0.1.1 2024-01-30 [1] CRAN (R 4.3.2)
IRanges * 2.36.0 2023-10-24 [1] Bioconductor
iterators 1.0.14 2022-02-05 [1] CRAN (R 4.3.2)
jsonlite 1.8.8 2023-12-04 [1] CRAN (R 4.3.2)
KEGGREST 1.42.0 2023-10-24 [1] Bioconductor
knitr 1.45 2023-10-30 [1] CRAN (R 4.3.2)
lattice 0.22-5 2023-10-24 [4] CRAN (R 4.3.1)
lazyeval 0.2.2 2019-03-15 [1] CRAN (R 4.3.2)
lifecycle 1.0.4 2023-11-07 [1] CRAN (R 4.3.2)
lubridate * 1.9.3 2023-09-27 [1] CRAN (R 4.3.2)
magrittr 2.0.3 2022-03-30 [1] CRAN (R 4.3.2)
Matrix 1.6-3 2023-11-14 [4] CRAN (R 4.3.2)
memoise 2.0.1 2021-11-26 [1] CRAN (R 4.3.2)
munsell 0.5.0 2018-06-12 [1] CRAN (R 4.3.2)
nlme 3.1-163 2023-08-09 [4] CRAN (R 4.3.1)
patchwork 1.2.0 2024-01-08 [1] CRAN (R 4.3.2)
pillar 1.9.0 2023-03-22 [1] CRAN (R 4.3.2)
pkgconfig 2.0.3 2019-09-22 [1] CRAN (R 4.3.2)
plyr 1.8.9 2023-10-02 [1] CRAN (R 4.3.2)
png 0.1-8 2022-11-29 [1] CRAN (R 4.3.2)
prettyunits 1.2.0 2023-09-24 [1] CRAN (R 4.3.2)
progress 1.2.3 2023-12-06 [1] CRAN (R 4.3.2)
purrr * 1.0.2 2023-08-10 [1] CRAN (R 4.3.2)
R6 2.5.1 2021-08-19 [1] CRAN (R 4.3.2)
rappdirs 0.3.3 2021-01-31 [1] CRAN (R 4.3.2)
Rcpp 1.0.11 2023-07-06 [1] CRAN (R 4.3.2)
RCurl 1.98-1.13 2023-11-02 [1] CRAN (R 4.3.2)
readr * 2.1.4 2023-02-10 [1] CRAN (R 4.3.2)
reshape2 1.4.4 2020-04-09 [1] CRAN (R 4.3.2)
reticulate * 1.35.0 2024-01-31 [1] CRAN (R 4.3.2)
rjson 0.2.21 2022-01-09 [1] CRAN (R 4.3.2)
rlang 1.1.2 2023-11-04 [1] CRAN (R 4.3.2)
rmarkdown 2.25 2023-09-18 [1] CRAN (R 4.3.2)
rprojroot 2.0.4 2023-11-05 [1] CRAN (R 4.3.2)
RSQLite 2.3.4 2023-12-08 [1] CRAN (R 4.3.2)
rstudioapi 0.15.0 2023-07-07 [1] CRAN (R 4.3.2)
S4Vectors * 0.40.2 2023-11-23 [1] Bioconductor 3.18 (R 4.3.2)
scales 1.3.0 2023-11-28 [1] CRAN (R 4.3.2)
sessioninfo 1.2.2 2021-12-06 [1] CRAN (R 4.3.2)
stringi 1.8.3 2023-12-11 [1] CRAN (R 4.3.2)
stringr * 1.5.1 2023-11-14 [1] CRAN (R 4.3.2)
taxize * 0.9.100 2022-04-22 [1] CRAN (R 4.3.2)
tibble * 3.2.1 2023-03-20 [1] CRAN (R 4.3.2)
tidyr * 1.3.0 2023-01-24 [1] CRAN (R 4.3.2)
tidyselect 1.2.0 2022-10-10 [1] CRAN (R 4.3.2)
tidytree 0.4.6 2023-12-12 [1] CRAN (R 4.3.2)
tidyverse * 2.0.0 2023-02-22 [1] CRAN (R 4.3.2)
timechange 0.2.0 2023-01-11 [1] CRAN (R 4.3.2)
treeio 1.26.0 2023-10-24 [1] Bioconductor
tzdb 0.4.0 2023-05-12 [1] CRAN (R 4.3.2)
utf8 1.2.4 2023-10-22 [1] CRAN (R 4.3.2)
uuid 1.1-1 2023-08-17 [1] CRAN (R 4.3.2)
vctrs 0.6.5 2023-12-01 [1] CRAN (R 4.3.2)
vipor 0.4.7 2023-12-18 [1] CRAN (R 4.3.2)
withr 2.5.2 2023-10-30 [1] CRAN (R 4.3.2)
xfun 0.41 2023-11-01 [1] CRAN (R 4.3.2)
XML 3.99-0.16 2023-11-29 [1] CRAN (R 4.3.2)
xml2 1.3.6 2023-12-04 [1] CRAN (R 4.3.2)
XVector * 0.42.0 2023-10-24 [1] Bioconductor
yaml 2.3.8 2023-12-11 [1] CRAN (R 4.3.2)
yulab.utils 0.1.2 2023-12-22 [1] CRAN (R 4.3.2)
zlibbioc 1.48.0 2023-10-24 [1] Bioconductor
zoo 1.8-12 2023-04-13 [1] CRAN (R 4.3.2)
[1] /home/faalm/R/x86_64-pc-linux-gnu-library/4.3
[2] /usr/local/lib/R/site-library
[3] /usr/lib/R/site-library
[4] /usr/lib/R/library
──────────────────────────────────────────────────────────────────────────────