Aim: to determine whether there is differential enrichment of splicing-related RBPs in differentially spliced clusters across comparisons.
source(here::here("R", "file_paths.R"))
source(here::here("R", "rbp_functions.R"))
source(here::here("R", "get_regions.R"))
fct_disease <- c("Control_vs_PD", "Control_vs_PDD", "Control_vs_DLB", "PD_vs_PDD", "PD_vs_DLB", "PDD_vs_DLB")
attract_db_filter.R
- Filtering of RBPs from ATTRACH database to include only RBPs that are: derived from humans, have a motif length > 6 and the highest quality score (1). The latter two filters were introduced by Sid to reduce redundancy in RBP motifs (many RBPs have highly similar motifs) i.e. longest motif selected for each RBP. I have modified this code slightly from original such that:
attract_pwm_human.pl
- perl script to filter PWM, such that it only contains motif for RBPs of interest. Slightly modified such that the metadata file that is used to filter pwm.txt can be named whatever the user wants (as opposed to ATtRACT_db_human.txt
).rbp_fimo_summary.R
- script to summarise the results of a FIMO analysis. I modified this slightly from the original such that it could be sourced as a function from within R.universalmotif
R package - mostly just for documentation, as it has a good intro to sequence motifs and motif enrichment.# Load RBPs
rbps <-
attract_db_filter(path_to_attract_db =
file.path(
path_to_raw_data,
"rbp_analysis/attract_db/ATtRACT_db.txt"
),
organism_filter = "Homo_sapiens",
length_filter = 7,
score_filter = "1.000000**") %>%
.[["Gene_id"]]
gtex <-
read_tsv(
"https://storage.googleapis.com/gtex_analysis_v8/rna_seq_data/GTEx_Analysis_2017-06-05_v8_RNASeQCv1.1.9_gene_median_tpm.gct.gz",
skip=2
) %>%
dplyr::rename(gene_id = Name) %>%
dplyr::mutate(gene_id = str_replace(gene_id, "\\..*", "")) %>%
dplyr::filter(gene_id %in% as.character(rbps))
gtex %>%
tidyr::gather(key = "tissue", value = "tpm", -gene_id, -Description) %>%
dplyr::filter(str_detect(tissue, "Brain"), tpm == 0) %>%
dplyr::arrange(Description) %>%
DT::datatable(rownames = FALSE,
options = list(scrollX = TRUE),
class = 'white-space: nowrap')
db <- attract_db_filter(path_to_attract_db =
file.path(
path_to_raw_data,
"rbp_analysis/attract_db/ATtRACT_db.txt"
),
organism_filter = "Homo_sapiens",
length_filter = 7,
score_filter = "1.000000**")
db_acc <- db %>%
dplyr::filter(Gene_name != "RBMY1A1")
db_rbm <-
read.table(
file.path(
path_to_raw_data,
"rbp_analysis/attract_db/ATtRACT_db.txt"
),
header=TRUE,
sep="\t"
) %>%
dplyr::filter(Gene_name == "RBM5", Score == "1.000000**", Len >= 7)
db_list <- setNames(c(list(db_acc), list(db_rbm)),
c("acc_RBP", "rbm_RBP"))
saveRDS(
db_list,
file.path(
path_to_raw_data,
"rbp_analysis/attract_db_filtered.Rds"
)
)
chen2meme_commands <-
filter_pwm_and_convert(db_list,
path_to_pl_script = here::here("R", "attract_pwm_human.pl"),
path_to_pwm = file.path(
path_to_raw_data,
"rbp_analysis/attract_db/pwm.txt"
),
output_path = file.path(
path_to_raw_data,
"rbp_analysis/attract_db/"
),
path_to_chen2meme = "/home/ssethi/meme/libexec/meme-5.1.1/chen2meme")
chen2meme_commands
## $acc_RBP
## [1] "/home/ssethi/meme/libexec/meme-5.1.1/chen2meme /home/rreynolds/projects/Aim2_PDsequencing_wd/raw_data/rbp_analysis/attract_db/pwm_acc_RBP.txt > /home/rreynolds/projects/Aim2_PDsequencing_wd/raw_data/rbp_analysis/attract_db/pwm_acc_RBP.meme"
##
## $rbm_RBP
## [1] "/home/ssethi/meme/libexec/meme-5.1.1/chen2meme /home/rreynolds/projects/Aim2_PDsequencing_wd/raw_data/rbp_analysis/attract_db/pwm_rbm_RBP.txt > /home/rreynolds/projects/Aim2_PDsequencing_wd/raw_data/rbp_analysis/attract_db/pwm_rbm_RBP.meme"
.txt
format --> .meme
format.## [1] "acc_RBP"
## [1] "rbm_RBP"
rbp_fimo_analysis.R
nohup Rscript /home/rreynolds/projects/Aim2_PDsequencing_wd/LBD-seq-bulk-analyses/misc_scripts/rbp_fimo_analysis.R &>/home/rreynolds/projects/Aim2_PDsequencing_wd/LBD-seq-bulk-analyses/nohup_logs/rbp_fimo_analysis.log&
readRDS(
file.path(
path_to_raw_data,
"rbp_analysis/rbp_intron_exon_prox_coord.Rds"
)
) %>%
dplyr::filter(intron_exon_index %in% c(123178:123180)) %>%
dplyr::distinct(intron_exon_index, cluster_id, chr, start_intron, end_intron)
# Load query list
query_list <-
readRDS(
file.path(
path_to_raw_data,
"rbp_analysis/rbp_query_list.Rds"
)
)
# Filter to include only proximal intronic regions
query_list <-
query_list %>%
lapply(., function(list){
list[str_detect(names(list), "prox")]
})
query_list %>%
lapply(., function(list){
list[1] %>%
lapply(., function(gr){
gr %>%
as_tibble() %>%
dplyr::group_by(prox_prime_position) %>%
dplyr::count()
})
})
## $Control_vs_DLB
## $Control_vs_DLB$prox_intron
## # A tibble: 3 x 2
## # Groups: prox_prime_position [3]
## prox_prime_position n
## <chr> <int>
## 1 five_prime 42817
## 2 three_prime 43564
## 3 <NA> 31035
##
##
## $Control_vs_PD
## $Control_vs_PD$prox_intron
## # A tibble: 3 x 2
## # Groups: prox_prime_position [3]
## prox_prime_position n
## <chr> <int>
## 1 five_prime 51077
## 2 three_prime 51710
## 3 <NA> 36250
##
##
## $Control_vs_PDD
## $Control_vs_PDD$prox_intron
## # A tibble: 3 x 2
## # Groups: prox_prime_position [3]
## prox_prime_position n
## <chr> <int>
## 1 five_prime 49660
## 2 three_prime 50275
## 3 <NA> 35286
##
##
## $PDD_vs_DLB
## $PDD_vs_DLB$prox_intron
## # A tibble: 3 x 2
## # Groups: prox_prime_position [3]
## prox_prime_position n
## <chr> <int>
## 1 five_prime 42801
## 2 three_prime 43542
## 3 <NA> 31206
##
##
## $PD_vs_DLB
## $PD_vs_DLB$prox_intron
## # A tibble: 3 x 2
## # Groups: prox_prime_position [3]
## prox_prime_position n
## <chr> <int>
## 1 five_prime 44752
## 2 three_prime 45493
## 3 <NA> 32702
##
##
## $PD_vs_PDD
## $PD_vs_PDD$prox_intron
## # A tibble: 3 x 2
## # Groups: prox_prime_position [3]
## prox_prime_position n
## <chr> <int>
## 1 five_prime 51476
## 2 three_prime 51943
## 3 <NA> 36391
query_list %>%
lapply(., function(list){
list[1] %>%
lapply(., function(gr){
gr %>%
as_tibble() %>%
dplyr::group_by(prox_prime_position) %>%
dplyr::summarise(
median_region_length = median(width),
max_region_length = max(width),
min_region_length = min(width))
}) %>%
qdapTools::list_df2df(col1 = "intron_annotation_type")
}) %>%
qdapTools::list_df2df(col1 = "comparison")
fimo_rbp <- summarise_fimo_results(results_dir =
file.path(
path_to_results,
"rbp_analysis/rbp_density/pwm_acc_RBP/"
),
significance_threshold = "variable",
p_value = 0.0001,
cores = 9)
fimo_rbp_fdr <- summarise_fimo_results(results_dir =
file.path(
path_to_results,
"rbp_analysis/rbp_density/pwm_acc_RBP/"
),
significance_threshold = "fdr",
q_value = 0.05,
cores = 9)
saveRDS(
fimo_rbp,
file.path(
path_to_results,
"rbp_analysis/rbp_density/pwm_acc_RBP/fimo_summary.Rds"
)
)
saveRDS(
fimo_rbp_fdr,
file.path(
path_to_results,
"rbp_analysis/rbp_density/pwm_acc_RBP/fimo_summary_fdr.Rds"
)
)
fimo_rbp <-
setNames(
list(
readRDS(
file.path(
path_to_results,
"rbp_analysis/rbp_density/pwm_acc_RBP/fimo_summary.Rds"
)
),
readRDS(
file.path(
path_to_results,
"rbp_analysis/rbp_density/pwm_acc_RBP/fimo_summary_fdr.Rds"
)
)),
c("p_val", "q_val"))
fimo_rbp_seq_sum <- fimo_rbp %>%
lapply(., function(fimo_results){
fimo_results %>%
lapply(., function(list){
list$sequence_sum_enrich
}) %>%
qdapTools::list_df2df(col1 = "list_name") %>%
tidyr::separate(list_name, into = c("comparison", "intron_annotation_type"), sep = ":", remove = F) %>%
dplyr::mutate(comparison = fct_relevel(comparison,
c("Control_vs_PD", "Control_vs_PDD", "Control_vs_DLB")),
intron_annotation_type = fct_relevel(intron_annotation_type %>%
str_replace_all(., "_", " ") %>%
str_wrap(., width = 15),
c("intron only", "intron\nadditional bp", "intron exon")))
})
fimo_rbp_n_sig <- fimo_rbp %>%
lapply(., function(fimo_results){
fimo_results %>%
lapply(., function(list){ list$significant_results %>% nrow()}) %>%
qdapTools::list2df(col1 = "significant_sequence_RBP_enrichments", col2 = "list_name") %>%
tidyr::separate(list_name, into = c("comparison", "intron_annotation_type"), sep = ":", remove = F) %>%
dplyr::mutate(comparison = fct_relevel(comparison,
c("Control_vs_PD", "Control_vs_PDD", "Control_vs_DLB")),
intron_annotation_type = fct_relevel(intron_annotation_type %>%
str_replace_all(., "_", " ") %>%
str_wrap(., width = 15),
c("intron only", "intron\nadditional bp", "intron exon")))
})
fimo_rbp_median <- fimo_rbp %>%
lapply(., function(fimo_results){
fimo_results %>%
lapply(., function(list){ list$RBP_median_enrich }) %>%
qdapTools::list_df2df(col1 = "list_name") %>%
tidyr::separate(list_name, into = c("comparison", "intron_annotation_type"), sep = ":", remove = F) %>%
tidyr::separate(motif_id, into = c("hgnc_symbol", "ensembl_id", "matrix_id"), sep = ":", remove = T) %>%
dplyr::mutate(comparison = fct_relevel(comparison,
c("Control_vs_PD", "Control_vs_PDD", "Control_vs_DLB")),
intron_annotation_type = fct_relevel(intron_annotation_type %>%
str_replace_all(., "_", " "),
c("intron only", "intron additional bp", "intron exon")))
})
ggpubr::ggarrange(fimo_ecdf_plot(results_df = fimo_rbp_seq_sum$p_val,
facet_var = vars(comparison),
colour_var = "intron_annotation_type",
colour_palette = ggsci::pal_jama("default", alpha = 1)(7)[c(1:6)],
comparison, intron_annotation_type),
fimo_density_plot(results_df = fimo_rbp_seq_sum$p_val,
x_var = "sum_enrich_score",
facet_var = vars(comparison),
colour_var = "intron_annotation_type",
colour_palette = ggsci::pal_jama("default", alpha = 1)(7)[c(1:6)],
scales = NULL,
comparison, intron_annotation_type),
nrow = 2,
labels = c("a", "b"),
common.legend = T,
legend = "top")
fimo_rbp_n_sig$p_val %>%
ggplot(., aes(x = comparison, y = significant_sequence_RBP_enrichments, fill = intron_annotation_type)) +
geom_col(position = position_dodge(width = 0.9), colour = "black") +
scale_fill_manual(values = ggsci::pal_jama("default", alpha = 1)(7)[c(1:6)]) +
labs(x = "Genomic region", y = "Count of significant motif enrichments\nacross all RBPs and queried sequences") +
theme_rhr
ggpubr::ggarrange(fimo_ecdf_plot(results_df = fimo_rbp_seq_sum$q_val,
facet_var = vars(comparison),
colour_var = "intron_annotation_type",
colour_palette = ggsci::pal_jama("default", alpha = 1)(7)[c(1:6)],
comparison, intron_annotation_type),
fimo_density_plot(results_df = fimo_rbp_seq_sum$q_val,
x_var = "sum_enrich_score",
facet_var = vars(comparison),
colour_var = "intron_annotation_type",
colour_palette = ggsci::pal_jama("default", alpha = 1)(7)[c(1:6)],
scales = NULL,
comparison, intron_annotation_type),
nrow = 2,
labels = c("a", "b"),
common.legend = T,
legend = "top")
fimo_rbp_n_sig$q_val %>%
ggplot(., aes(x = comparison, y = significant_sequence_RBP_enrichments, fill = intron_annotation_type)) +
geom_col(position = position_dodge(width = 0.9), colour = "black") +
scale_fill_manual(values = ggsci::pal_jama("default", alpha = 1)(7)[c(1:6)]) +
labs(x = "Genomic region", y = "Count of significant motif enrichments\nacross all RBPs and queried sequences") +
theme_rhr
fimo_rbp_median$p_val %>%
dplyr::filter(hgnc_symbol != "ELAVL3") %>%
dplyr::select(list_name, hgnc_symbol, median_enrich_score) %>%
tidyr::spread(key = "list_name", value = "median_enrich_score") %>%
dplyr::mutate_each(funs(replace(., is.na(.), 0))) %>%
tibble::remove_rownames() %>%
tibble::column_to_rownames(var = "hgnc_symbol") %>%
pheatmap::pheatmap(fontsize_col = 7,
fontsize_row = 7,
# treeheight_col = 10,
# treeheight_row = 30,
color = viridis(100))
fimo_rbp_median$q_val %>%
dplyr::filter(!is.na(median_enrich_score)) %>%
dplyr::select(list_name, hgnc_symbol, median_enrich_score) %>%
tidyr::spread(key = "list_name", value = "median_enrich_score") %>%
dplyr::mutate_each(funs(replace(., is.na(.), 0))) %>%
tibble::remove_rownames() %>%
tibble::column_to_rownames(var = "hgnc_symbol") %>%
pheatmap::pheatmap(fontsize_col = 7,
fontsize_row = 7,
# treeheight_col = 10,
# treeheight_row = 30,
color = viridis(100))
a <- query_list %>%
lapply(., function(list) list %>%
lapply(., function(gr) gr %>% length()) %>%
qdapTools::list_vect2df(col1 = "intron_annotation_type", col3 = "n_sequences") %>%
dplyr::select(-X2)) %>%
qdapTools::list_df2df(col1 = "comparison") %>%
dplyr::filter(str_detect(comparison, "Control")) %>%
ggplot(aes(x = comparison, y = n_sequences, fill = intron_annotation_type)) +
geom_col(position = position_dodge2(preserve = "single"), colour = "black") +
scale_fill_manual(values = ggsci::pal_jama("default", alpha = 1)(7)[c(1,3,2,4:6)]) +
theme_rhr
b <- query_list %>%
lapply(., function(list) list %>%
lapply(., function(gr) reduce(gr) %>% length()) %>%
qdapTools::list_vect2df(col1 = "intron_annotation_type", col3 = "n_sequences") %>%
dplyr::select(-X2)) %>%
qdapTools::list_df2df(col1 = "comparison") %>%
dplyr::filter(str_detect(comparison, "Control")) %>%
ggplot(aes(x = comparison, y = n_sequences, fill = intron_annotation_type)) +
geom_col(position = position_dodge2(preserve = "single"), colour = "black") +
scale_fill_manual(values = ggsci::pal_jama("default", alpha = 1)(7)[c(1,3,2,4:6)]) +
theme_rhr
c <- query_list %>%
lapply(., function(list) list %>%
lapply(., function(gr){
query <- gr[c(abs(gr$deltapsi) >= 0.1 & gr$p.adjust < 0.05)]
control <- gr[!c(abs(gr$deltapsi) >= 0.1 & gr$p.adjust < 0.05)]
tibble(splicing_status = c("ds", "non-ds"),
n_sequences = c(length(query), length(control)))
}) %>%
qdapTools::list_df2df(col1 = "intron_annotation_type")) %>%
qdapTools::list_df2df(col1 = "comparison") %>%
dplyr::filter(str_detect(comparison, "Control")) %>%
ggplot(aes(x = comparison, y = n_sequences, fill = intron_annotation_type)) +
geom_col(position = position_dodge2(preserve = "single"), colour = "black") +
facet_wrap(vars(splicing_status), scales = "free") +
scale_fill_manual(values = ggsci::pal_jama("default", alpha = 1)(7)[c(1,3,2,4:6)]) +
theme_rhr
ggpubr::ggarrange(a, b, c,
labels = c("a", "b", "c"),
common.legend = T,
nrow = 3)
clu_proximal <-
readRDS(
file =
file.path(
path_to_raw_data,
"rbp_analysis/rbp_intron_exon_prox_coord.Rds"
)
) %>%
tidyr::separate(cluster_id, into = c(NA, "cluster"), sep = ":", remove = F) %>%
tidyr::separate(cluster, into = c(NA, NA, "strand"), sep = "_", remove = T) %>%
dplyr::mutate(chr = str_c("chr", chr))
print("Number of unique 5' proximal intronic regions: ")
## [1] "Number of unique 5' proximal intronic regions: "
clu_proximal %>%
dplyr::filter(prox_prime_position == "five_prime") %>%
dplyr::distinct(strand, chr, start_prox, end_prox) %>%
nrow()
## [1] 65761
print("Number of unique 3' proximal intronic regions:")
## [1] "Number of unique 3' proximal intronic regions:"
clu_proximal %>%
dplyr::filter(prox_prime_position == "three_prime") %>%
dplyr::distinct(strand, chr, start_prox, end_prox) %>%
nrow()
## [1] 66266
rbp_ame_analysis.R
nohup Rscript /home/rreynolds/projects/Aim2_PDsequencing_wd/LBD-seq-bulk-analyses/misc_scripts/rbp_ame_analysis.R &>/home/rreynolds/projects/Aim2_PDsequencing_wd/LBD-seq-bulk-analyses/nohup_logs/rbp_ame_analysis.log&
ame_rbp <-
c(
summarise_ame_results(
results_dir =
file.path(
path_to_results,
"rbp_analysis/rbp_enrichment_fasta/pwm_acc_RBP/"
),
cores = 9),
summarise_ame_results(
results_dir =
file.path(
path_to_results,
"rbp_analysis/rbp_enrichment_fasta/pwm_rbm_RBP/"
),
cores = 9)
)
saveRDS(
ame_rbp,
file.path(
path_to_results,
"rbp_analysis/rbp_enrichment_fasta/ame_summary.Rds"
)
)
ame_rbp <-
readRDS(
file.path(
path_to_results,
"rbp_analysis/rbp_enrichment_fasta/ame_summary.Rds"
)
)
ame_results <-
S4Vectors::Filter(nrow, ame_rbp) %>%
qdapTools::list_df2df(col1 = "list_name") %>%
tidyr::separate(list_name, into = c("comparison", "intron_annotation_type", NA), sep = ":", remove = F) %>%
tidyr::separate(motif_ID, into = c("hgnc_symbol", "ensembl_id", "matrix_id"), sep = ":", remove = T) %>%
dplyr::mutate(list_name = list_name %>%
str_replace("query", "ds") %>%
str_replace("control", "nonds"),
comparison = fct_relevel(comparison,
fct_disease),
intron_annotation_type = case_when(intron_annotation_type == "prox_intron_five_prime" ~ "5' prox intron",
intron_annotation_type == "prox_intron_three_prime" ~ "3' prox intron",
TRUE ~ intron_annotation_type) %>%
str_replace("_", " "))
ame_results %>%
DT::datatable(rownames = FALSE,
options = list(scrollX = TRUE),
class = 'white-space: nowrap')
ame_results %>%
ggplot(aes(x = hgnc_symbol, y = -log10(bonferroni_adj_p_val), fill = intron_annotation_type)) +
geom_col(position = position_dodge2(width = 0.9, preserve = "single"), colour = "black") +
geom_hline(yintercept = -log10(0.05), linetype = "dashed") +
facet_grid(rows = vars(motif_DB), cols = vars(comparison), scales = "free_x", space = "free_x") +
labs(x = "RBP", y = "-log10(bonferroni-adjusted p-value)") +
scale_fill_manual(values = ggsci::pal_jama("default", alpha = 1)(7)[c(6:4)]) +
theme_rhr +
theme(strip.text.x = element_text(angle = 90),
strip.text.y = element_text(angle = 90),
legend.position = "bottom")
ame_results %>%
dplyr::filter(bonferroni_adj_p_val < 0.05) %>%
dplyr::distinct(hgnc_symbol, consensus)
read.table(
file.path(
path_to_raw_data,
"rbp_analysis/attract_db/ATtRACT_db.txt"
),
header = T,
sep = "\t"
) %>%
dplyr::filter(Organism == "Homo_sapiens", Motif == "GGGGGGG") %>%
dplyr::distinct(Gene_name, Organism, Motif, Len, Score)
read.table(
file.path(
path_to_raw_data,
"rbp_analysis/attract_db/ATtRACT_db.txt"
),
header = T,
sep = "\t"
) %>%
dplyr::filter(Organism == "Homo_sapiens",
Motif %in% (
c("GAAGGAA", "CTGGATT", "CTAACCCTAA") %>%
# Replace DNA Ts with RNA Us
str_replace_all("T", "U")
)) %>%
dplyr::distinct(Gene_name, Organism, Motif, Len, Score)
sessionInfo()
## R version 3.6.1 (2019-07-05)
## Platform: x86_64-pc-linux-gnu (64-bit)
## Running under: Ubuntu 16.04.6 LTS
##
## Matrix products: default
## BLAS: /usr/lib/libblas/libblas.so.3.6.0
## LAPACK: /usr/lib/lapack/liblapack.so.3.6.0
##
## locale:
## [1] LC_CTYPE=en_GB.UTF-8 LC_NUMERIC=C
## [3] LC_TIME=en_GB.UTF-8 LC_COLLATE=en_GB.UTF-8
## [5] LC_MONETARY=en_GB.UTF-8 LC_MESSAGES=en_GB.UTF-8
## [7] LC_PAPER=en_GB.UTF-8 LC_NAME=C
## [9] LC_ADDRESS=C LC_TELEPHONE=C
## [11] LC_MEASUREMENT=en_GB.UTF-8 LC_IDENTIFICATION=C
##
## attached base packages:
## [1] parallel stats4 stats graphics grDevices utils datasets
## [8] methods base
##
## other attached packages:
## [1] GenomicRanges_1.38.0 GenomeInfoDb_1.22.1 MarkerGenes_0.0.0.9000
## [4] EWCE_0.99.2 UpSetR_1.4.0 viridis_0.5.1
## [7] viridisLite_0.3.0 qdapTools_1.3.5 forcats_0.5.1
## [10] stringr_1.4.0 dplyr_1.0.2 purrr_0.3.4
## [13] readr_1.4.0 tidyr_1.1.1 tibble_3.0.3
## [16] ggplot2_3.3.2 tidyverse_1.3.0 doParallel_1.0.15
## [19] iterators_1.0.12 foreach_1.5.0 org.Hs.eg.db_3.10.0
## [22] AnnotationDbi_1.48.0 IRanges_2.20.2 S4Vectors_0.24.4
## [25] Biobase_2.46.0 BiocGenerics_0.32.0 clusterProfiler_3.14.3
##
## loaded via a namespace (and not attached):
## [1] utf8_1.1.4 tidyselect_1.1.0 RSQLite_2.2.0
## [4] htmlwidgets_1.5.3 grid_3.6.1 BiocParallel_1.20.1
## [7] devtools_2.3.2 munsell_0.5.0 codetools_0.2-16
## [10] chron_2.3-56 DT_0.15 withr_2.2.0
## [13] colorspace_2.0-0 GOSemSim_2.17.1 highr_0.8
## [16] knitr_1.29 rstudioapi_0.13 ggsignif_0.6.0
## [19] DOSE_3.12.0 labeling_0.4.2 urltools_1.7.3
## [22] GenomeInfoDbData_1.2.2 polyclip_1.10-0 pheatmap_1.0.12
## [25] bit64_4.0.2 farver_2.0.3 rprojroot_2.0.2
## [28] vctrs_0.3.2 generics_0.0.2 xfun_0.16
## [31] BiocFileCache_1.10.2 R6_2.5.0 graphlayouts_0.7.0
## [34] bitops_1.0-6 cachem_1.0.3 fgsea_1.12.0
## [37] gridGraphics_0.5-0 assertthat_0.2.1 scales_1.1.1
## [40] ggraph_2.0.3 enrichplot_1.6.1 gtable_0.3.0
## [43] processx_3.4.5 tidygraph_1.2.0 rlang_0.4.7
## [46] splines_3.6.1 rstatix_0.6.0 broom_0.7.0
## [49] europepmc_0.4 abind_1.4-5 BiocManager_1.30.10
## [52] yaml_2.2.1 reshape2_1.4.4 modelr_0.1.8
## [55] crosstalk_1.1.0.1 backports_1.1.8 qvalue_2.18.0
## [58] tools_3.6.1 usethis_1.6.3 bookdown_0.21
## [61] ggplotify_0.0.5 ellipsis_0.3.1 RColorBrewer_1.1-2
## [64] ggdendro_0.1.21 sessioninfo_1.1.1 ggridges_0.5.2
## [67] Rcpp_1.0.5 plyr_1.8.6 progress_1.2.2
## [70] zlibbioc_1.32.0 RCurl_1.98-1.2 ps_1.3.4
## [73] prettyunits_1.1.1 ggpubr_0.4.0 openssl_1.4.2
## [76] cowplot_1.0.0 haven_2.3.1 ggrepel_0.8.2
## [79] fs_1.5.0 here_1.0.0 magrittr_2.0.1
## [82] data.table_1.13.0 DO.db_2.9 openxlsx_4.2.3
## [85] triebeard_0.3.0 reprex_1.0.0 pkgload_1.1.0
## [88] hms_1.0.0 evaluate_0.14 XML_3.99-0.3
## [91] rio_0.5.16 readxl_1.3.1 gridExtra_2.3
## [94] testthat_2.3.2 compiler_3.6.1 biomaRt_2.42.1
## [97] crayon_1.4.1 htmltools_0.5.1.1 lubridate_1.7.9
## [100] DBI_1.1.1 tweenr_1.0.1 dbplyr_1.4.4
## [103] MASS_7.3-51.4 rappdirs_0.3.1 Matrix_1.2-17
## [106] car_3.0-9 cli_2.2.0.9000 igraph_1.2.5
## [109] pkgconfig_2.0.3 rvcheck_0.1.8 foreign_0.8-72
## [112] xml2_1.3.2 XVector_0.26.0 rvest_0.3.6
## [115] callr_3.5.1 digest_0.6.27 rmarkdown_2.5
## [118] cellranger_1.1.0 HGNChelper_0.8.1 fastmatch_1.1-0
## [121] curl_4.3 lifecycle_0.2.0 jsonlite_1.7.1
## [124] carData_3.0-4 desc_1.2.0 askpass_1.1
## [127] limma_3.42.2 fansi_0.4.2 pillar_1.4.6
## [130] ggsci_2.9 lattice_0.20-38 fastmap_1.0.1
## [133] httr_1.4.2 pkgbuild_1.1.0 GO.db_3.10.0
## [136] glue_1.4.2 remotes_2.2.0 zip_2.1.0
## [139] bit_4.0.4 ggforce_0.3.2 stringi_1.5.3
## [142] blob_1.2.1 memoise_2.0.0