LIANA Tutorial
Daniel Dimitrov
Saezlab, Heidelberg Universitydaniel.dimitrov@uni-heidelberg.de
2023-02-24
Source:vignettes/liana_tutorial.Rmd
liana_tutorial.Rmd
liana
: Intro
The continuous developments of single-cell RNA-Seq (scRNA-Seq) have sparked an immense interest in understanding intercellular crosstalk. Multiple tools and resources that aid the investigation of cell-cell communication (CCC) were published recently. However, these methods and resources are usually in a fixed combination of a tool and its corresponding resource, but in principle any resource could be combined with any method.
To this end, we built liana
- a framework to decouple
the tools from their corresponding resources.
CCC Resources
liana
provides CCC resources obtained and formatted via
OmnipathR
which are then converted to the appropriate format to each method.
# Resource currently included in OmniPathR (and hence `liana`) include:
show_resources()
#> [1] "Default" "Consensus" "Baccin2019" "CellCall"
#> [5] "CellChatDB" "Cellinker" "CellPhoneDB" "CellTalkDB"
#> [9] "connectomeDB2020" "EMBRACE" "Guide2Pharma" "HPMR"
#> [13] "ICELLNET" "iTALK" "Kirouac2010" "LRdb"
#> [17] "Ramilowski2015" "OmniPath" "MouseConsensus"
# A list of resources can be obtained using the `select_resource()` function:
# See `?select_resource()` documentation for further information.
# select_resource(c('OmniPath')) %>% dplyr::glimpse()
CCC Methods
Each of the resources can then be run with any of the following methods:
# Resource currently included in OmniPathR (and hence `liana`) include:
show_methods()
#> [1] "connectome" "logfc" "natmi" "sca"
#> [5] "cellphonedb" "cytotalk" "call_squidpy" "call_cellchat"
#> [9] "call_connectome" "call_sca" "call_italk" "call_natmi"
Note that the different algorithms (or scoring measures) used in
sca
, natmi
, connectome
,
cellphonedb
, cytotalk
’s crosstalk scores, and
logfc
were re-implemented in LIANA. Yet, the original
method pipelines can be called via the call_*
functions.
liana
wrapper function
To run liana
, we will use a down-sampled toy
HUMAN PBMCs scRNA-Seq data set, obtained from SeuratData.
liana
takes Seurat
and
SingleCellExperiment
objects as input, containing processed
counts and clustered cells.
liana_path <- system.file(package = "liana")
testdata <-
readRDS(file.path(liana_path , "testdata", "input", "testdata.rds"))
testdata %>% dplyr::glimpse()
#> Formal class 'Seurat' [package "SeuratObject"] with 13 slots
#> ..@ assays :List of 1
#> .. ..$ RNA:Formal class 'Assay' [package "Seurat"] with 8 slots
#> ..@ meta.data :'data.frame': 90 obs. of 4 variables:
#> .. ..$ orig.ident : Factor w/ 1 level "pbmc3k": 1 1 1 1 1 1 1 1 1 1 ...
#> .. ..$ nCount_RNA : num [1:90] 4903 3914 4973 3281 2641 ...
#> .. ..$ nFeature_RNA : int [1:90] 1352 1112 1445 1015 928 937 899 1713 960 888 ...
#> .. ..$ seurat_annotations: Factor w/ 3 levels "B","CD8 T","NK": 1 1 1 1 3 3 1 1 1 1 ...
#> ..@ active.assay: chr "RNA"
#> ..@ active.ident: Factor w/ 3 levels "B","CD8 T","NK": 1 1 1 1 3 3 1 1 1 1 ...
#> .. ..- attr(*, "names")= chr [1:90] "AAACATTGAGCTAC" "AAACTTGAAAAACG" "AAAGGCCTGTCTAG" "AAAGTTTGGGGTGA" ...
#> ..@ graphs : list()
#> ..@ neighbors : list()
#> ..@ reductions : list()
#> ..@ images : list()
#> ..@ project.name: chr "SeuratProject"
#> ..@ misc : list()
#> ..@ version :Classes 'package_version', 'numeric_version' hidden list of 1
#> .. ..$ : int [1:3] 3 2 3
#> ..@ commands :List of 2
#> .. ..$ FindVariableFeatures.RNA:Formal class 'SeuratCommand' [package "Seurat"] with 5 slots
#> .. ..$ NormalizeData.RNA :Formal class 'SeuratCommand' [package "SeuratObject"] with 5 slots
#> ..@ tools : list()
liana_wrap
calls a number of methods and and each method
is run with the provided resource(s).
We will now call all methods that are currently available in liana.
Here we use only the Consensus
(Default) CCC resource,
but any of the aforementioned ones (available via
show_resources()
) can be added to the resource
parameter
# Run liana
liana_test <- liana_wrap(testdata)
#> Warning in exec(output, ...): 3465 genes and/or 0 cells were removed as they had
#> no counts!
#> Warning: `invoke()` is deprecated as of rlang 0.4.0.
#> Please use `exec()` or `inject()` instead.
#> This warning is displayed once per session.
# Liana returns a list of results, each element of which corresponds to a method
liana_test %>% dplyr::glimpse()
LIANA currently provides a mixture of re-implemented methods and pipelines which externally call specific LR methods. By default, LIANA will call only the internal scoring function, i.e. those that are re-implemented in LIANA.
One can use LIANA to also run the original methods. For more about the original methods see LIANA++.
Aggregate and Obiain Consensus Ranks
liana
also provides consensus ranks for the results
obtained using different methods. By default, liana
will
provide mean, median, and aggregate* consensus ranks
# We can aggregate these results into a tibble with consensus ranks
liana_test <- liana_test %>%
liana_aggregate()
#> Now aggregating natmi
#> Now aggregating connectome
#> Now aggregating logfc
#> Now aggregating sca
#> Now aggregating cellphonedb
#> Aggregating Ranks
dplyr::glimpse(liana_test)
#> Rows: 735
#> Columns: 16
#> $ source <chr> "B", "B", "B", "B", "B", "B", "NK", "NK", "B", …
#> $ target <chr> "CD8 T", "CD8 T", "CD8 T", "CD8 T", "CD8 T", "C…
#> $ ligand.complex <chr> "HLA-DQA1", "HLA-DRA", "HLA-DQA2", "HLA-DRB1", …
#> $ receptor.complex <chr> "LAG3", "LAG3", "LAG3", "LAG3", "LAG3", "LAG3",…
#> $ aggregate_rank <dbl> 1.003283e-06, 8.816325e-06, 1.093275e-05, 1.627…
#> $ mean_rank <dbl> 38.3, 27.5, 56.9, 36.5, 46.9, 33.7, 49.5, 28.9,…
#> $ natmi.edge_specificity <dbl> 0.8945477, 0.7374111, 0.9665280, 0.6819579, 0.8…
#> $ natmi.rank <dbl> 2, 7, 1, 10, 5, 12, 66, 20, 11, 8, 4, 28, 100, …
#> $ connectome.weight_sc <dbl> 1.0054344, 1.0097786, 0.9046471, 0.9328151, 0.9…
#> $ connectome.rank <dbl> 2, 1, 6, 3, 7, 5, 19, 8, 4, 9, 22, 21, 13, 39, …
#> $ logfc.logfc_comb <dbl> 2.4495727, 2.7106868, 2.0545938, 2.1860017, 2.2…
#> $ logfc.rank <dbl> 2, 1, 8, 7, 4, 6, 52, 3, 5, 9, 31, 61, 23, 14, …
#> $ sca.LRscore <dbl> 0.8693937, 0.8985606, 0.8343680, 0.8815981, 0.8…
#> $ sca.rank <dbl> 109, 52, 193, 86, 142, 69, 34, 37, 80, 132, 422…
#> $ cellphonedb.pvalue <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,…
#> $ cellphonedb.rank <dbl> 76.5, 76.5, 76.5, 76.5, 76.5, 76.5, 76.5, 76.5,…
Voila! That’s it. A very brief intro to LIANA and how to obtain the scoring functions† for each method implemented in it, as well as an aggregate_rank* which serves as a consensus across methods.
(†) Note that here we focus on the scores recommended to be used to prioritize interaction in a single sample system. Most of these, with the exception of SingleCellSignalR’s LRscore, take the specificity of the cluster pair into account.
(*) The aggregate consensus rank (aggregate_rank
) is
obtained using a re-implementation of the RRA
method from the RobustRankAggreg
package.
RRA
scores can be interpreted as p-values and
interactions which are ranked consistently higher than random are
assigned low scores/p-values.
Simple DotPlot
We will now plot the results. By default, we use the
LRscore
from SingleCellSignalR to represent the magnitude
of expression of the ligand and receptor, and NATMI’s
specificity weights
to show how specific a given
interaction is to the source
(L) and target
(R)
cell types.
Note that the top 20 interactions (ntop
), are defined as
unique ligand-receptors ordered consequentially, regardless of the cell
types. Done subsequent to filtering to the source_groups
and target_groups
of interest. In this case, we plot
interactions in which B cells are the source
(express the
~ligands) and the other 3 cell types are the target
cell
types (those which express the ~receptors).
By default, liana_aggregate
would order LIANA’s output
according to rank_aggregate
in ascending order.
Note that using liana_dotplot
/w ntop
assumes that liana’s results are ranked accordingly! Refer to
rank_method
, if you wish to easily rank interactions for a
single method (see example below).
liana_test %>%
liana_dotplot(source_groups = c("B"),
target_groups = c("NK", "CD8 T", "B"),
ntop = 20)
Note that missing dots are interactions which are not expressed in at least 10% of the cells (by default) in both cell clusters.
In this case, we consider the specificity of interactions as defined
by NATMI’s
edge specificity weights. NATMI’s specificity edges range from 0 to 1,
where 1
means both the ligand and receptor are uniquely
expressed in a given pair of cells. Expression magnitude, represented by
SingleCellExperiment’s
LRScore, is on the other hand, meant to represent a non-negative
regularized score, comparable between datasets.
Frequency Heatmap
We will now plot the frequencies of interactions for each pair of potentially communicating cell types.
This heatmap was inspired by CellChat’s and CellPhoneDB’s heatmap designs.
First, we filter interactions by aggregate_rank
, which
can itself be treated as a p-value of for the robustly, highly ranked
interactions. Nevertheless, one can also filter according to CPDB’s
p-value (<=0.05) or SingleCellExperiments
LRScore, etc.
liana_trunc <- liana_test %>%
# only keep interactions concordant between methods
filter(aggregate_rank <= 0.01) # note that these pvals are already corrected
heat_freq(liana_trunc)
Here, we see that NK
-CD8 T
share a
relatively large number of the inferred interactions, with many of those
being send from NK
- note large sum of interactions (gray
barplot) in which NK is the Sender
.
NB! Here, an assumption is implied that the number of interactions inferred between cell types is informative of the communication events occurring in the system. This is a rather strong assumption that one should consider prior to making any conclusions. Our suggestion is that any conclusions should be complimented with further information, such as biological prior knowledge, spatial information, etc.
Frequency Chord diagram
Here, we will generate a chord diagram equivalent to the frequencies heatmap.
First, make sure you have the circlize
package
installed.
if(!require("circlize")){
install.packages("circlize", quiet = TRUE,
repos = "http://cran.us.r-project.org")
}
#> Loading required package: circlize
#> ========================================
#> circlize version 0.4.15
#> CRAN page: https://cran.r-project.org/package=circlize
#> Github page: https://github.com/jokergoo/circlize
#> Documentation: https://jokergoo.github.io/circlize_book/book/
#>
#> If you use it in published research, please cite:
#> Gu, Z. circlize implements and enhances circular visualization
#> in R. Bioinformatics 2014.
#>
#> This message can be suppressed by:
#> suppressPackageStartupMessages(library(circlize))
#> ========================================
In this case, one could choose the source and target cell type groups that they wish to plot.
p <- chord_freq(liana_trunc,
source_groups = c("CD8 T", "NK", "B"),
target_groups = c("CD8 T", "NK", "B"))
For more advanced visualization options, we kindly refer the user to SCPubr.
Run any method of choice.
We will now run only the CellPhoneDB’s permutation-based algorithm. We will also lower the number of permutations that we wish to perform for the sake of computational time. Note that one can also parallelize the CPDB algorithm implemented in LIANA (in this case we don’t, as this would only make sense when working with large datasets).
Also, here we will use a SingleCellExperiment
object as
input. In reality, LIANA converts Seurat
objects to
SingleCellExperiment and is to a large extend based on the BioConductor
single-cell infrastructure.
# Load Sce testdata
sce <- readRDS(file.path(liana_path , "testdata", "input", "testsce.rds"))
# RUN CPDB alone
cpdb_test <- liana_wrap(sce,
method = 'cellphonedb',
resource = c('CellPhoneDB'),
permutation.params = list(nperms=100,
parallelize=FALSE,
workers=4),
expr_prop=0.05)
# identify interactions of interest
cpdb_int <- cpdb_test %>%
# only keep interactions with p-val <= 0.05
filter(pvalue <= 0.05) %>% # this reflects interactions `specificity`
# then rank according to `magnitude` (lr_mean in this case)
rank_method(method_name = "cellphonedb",
mode = "magnitude") %>%
# keep top 20 interactions (regardless of cell type)
distinct_at(c("ligand.complex", "receptor.complex")) %>%
head(20)
# Plot toy results
cpdb_test %>%
# keep only the interactions of interest
inner_join(cpdb_int,
by = c("ligand.complex", "receptor.complex")) %>%
# invert size (low p-value/high specificity = larger dot size)
# + add a small value to avoid Infinity for 0s
mutate(pvalue = -log10(pvalue + 1e-10)) %>%
liana_dotplot(source_groups = c("c"),
target_groups = c("c", "a", "b"),
specificity = "pvalue",
magnitude = "lr.mean",
show_complex = TRUE,
size.label = "-log10(p-value)")
SingleCellSignalR, CytoTalk, NATMI, and Connectome scores /w Complexes
The re-implementation of the aforementioned methods in LIANA enables us to make use of multimeric complex information as provided by the e.g. CellPhoneDB, CellChatDB, and ICELLNET resources
# Run liana re-implementations with the CellPhoneDB resource
complex_test <- liana_wrap(testdata,
method = c('natmi', 'sca', 'logfc'),
resource = c('CellPhoneDB'))
#> Warning in exec(output, ...): 3465 genes and/or 0 cells were removed as they had
#> no counts!
complex_test %>% liana_aggregate()
#> # A tibble: 172 × 12
#> source target ligan…¹ recep…² aggre…³ mean_…⁴ natmi…⁵ natmi…⁶ sca.L…⁷ sca.r…⁸
#> <chr> <chr> <chr> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
#> 1 NK B MIF CD74 3.03e-4 24 0.202 70 0.925 1
#> 2 CD8 T CD8 T LCK CD8A_C… 2.41e-3 10 0.409 10 0.859 16
#> 3 CD8 T B MIF CD74 2.71e-3 34.7 0.157 99 0.915 2
#> 4 NK NK HLA-C KIR2DL3 5.46e-3 19.3 0.367 18 0.841 19
#> 5 B B MIF CD74 7.46e-3 39 0.140 109 0.911 3
#> 6 NK NK HLA-E KLRC1_… 1.07e-2 19.3 0.275 46 0.894 6
#> 7 NK CD8 T CD58 CD2 1.45e-2 30 0.449 6 0.734 77
#> 8 NK B PTPRC CD22 2.53e-2 29 0.321 27 0.812 35
#> 9 CD8 T B PTPRC CD22 2.75e-2 30.3 0.319 28 0.811 36
#> 10 CD8 T NK HLA-E KLRC1_… 2.92e-2 22 0.262 49 0.892 7
#> # … with 162 more rows, 2 more variables: logfc.logfc_comb <dbl>,
#> # logfc.rank <dbl>, and abbreviated variable names ¹ligand.complex,
#> # ²receptor.complex, ³aggregate_rank, ⁴mean_rank, ⁵natmi.edge_specificity,
#> # ⁶natmi.rank, ⁷sca.LRscore, ⁸sca.rank
#> # ℹ Use `print(n = ...)` to see more rows, and `colnames()` to see all variable names
Call liana
with overwritten default settings
By default liana
is run with the default for each method
which can be obtained via liana_default()
Alternatively, one can also overwrite the default settings by simply passing them to the liana wrapper function
# define geometric mean
geometric_mean <- function(vec){exp(mean(log(vec)))}
# Overwrite default parameters by providing a list of parameters
liana_test <- liana_wrap(testdata,
method = c('cellphonedb', 'sca'),
resource = 'Consensus',
permutation.params =
list(
nperms = 10 # here we run cpdb it only with 10 permutations
),
complex_policy="geometric_mean"
)
#> Warning in exec(output, ...): 3465 genes and/or 0 cells were removed as they had
#> no counts!
# This returns a list of results for each method
liana_test %>% dplyr::glimpse()
#> List of 2
#> $ cellphonedb: tibble [735 × 12] (S3: tbl_df/tbl/data.frame)
#> ..$ source : chr [1:735] "B" "B" "B" "B" ...
#> ..$ target : chr [1:735] "B" "B" "B" "B" ...
#> ..$ ligand.complex : chr [1:735] "LGALS9" "LGALS9" "LGALS9" "ADAM10" ...
#> ..$ ligand : chr [1:735] "LGALS9" "LGALS9" "LGALS9" "ADAM10" ...
#> ..$ receptor.complex: chr [1:735] "PTPRC" "CD44" "CD47" "CD44" ...
#> ..$ receptor : chr [1:735] "PTPRC" "CD44" "CD47" "CD44" ...
#> ..$ receptor.prop : num [1:735] 0.567 0.433 0.5 0.433 0.267 ...
#> ..$ ligand.prop : num [1:735] 0.233 0.233 0.233 0.1 1 ...
#> ..$ ligand.expr : num [1:735] 0.374 0.374 0.374 0.12 2.914 ...
#> ..$ receptor.expr : num [1:735] 0.762 0.655 0.661 0.655 0.499 ...
#> ..$ lr.mean : num [1:735] 0.568 0.515 0.518 0.388 1.706 ...
#> ..$ pvalue : num [1:735] 0.9 0.3 0 0.5 1 1 1 1 1 1 ...
#> $ sca : tibble [735 × 12] (S3: tbl_df/tbl/data.frame)
#> ..$ source : chr [1:735] "B" "B" "B" "B" ...
#> ..$ target : chr [1:735] "B" "B" "B" "B" ...
#> ..$ ligand.complex : chr [1:735] "LGALS9" "LGALS9" "LGALS9" "ADAM10" ...
#> ..$ ligand : chr [1:735] "LGALS9" "LGALS9" "LGALS9" "ADAM10" ...
#> ..$ receptor.complex: chr [1:735] "PTPRC" "CD44" "CD47" "CD44" ...
#> ..$ receptor : chr [1:735] "PTPRC" "CD44" "CD47" "CD44" ...
#> ..$ receptor.prop : num [1:735] 0.567 0.433 0.5 0.433 0.267 ...
#> ..$ ligand.prop : num [1:735] 0.233 0.233 0.233 0.1 1 ...
#> ..$ ligand.expr : num [1:735] 0.374 0.374 0.374 0.12 2.914 ...
#> ..$ receptor.expr : num [1:735] 0.762 0.655 0.661 0.655 0.499 ...
#> ..$ global_mean : num [1:735] 0.199 0.199 0.199 0.199 0.199 ...
#> ..$ LRscore : num [1:735] 0.728 0.713 0.714 0.585 0.858 ...
Note that with liana_call.params
one can change the way
that we account for complexes. By default this is set to the mean of the
subunits in the complex (as done for expression in CellPhoneDB/Squidpy),
and it would return the subunit closest to the mean.
Here we change it to the geometric_mean, but any alternative function can be passed and other perfectly viable approaches could also include e.g. the Trimean of CellChat.
Please refer to the ?liana_wrap
documentation for more
information on all the parameters that can be tuned in liana. Also, one
can obtain a list with all default parameters by calling the
liana_defaults()
function.
Citation
#>
#> To cite liana in publications use:
#>
#> Dimitrov, D., Türei, D., Garrido-Rodriguez M., Burmedi P.L., Nagai,
#> J.S., Boys, C., Flores, R.O.R., Kim, H., Szalai, B., Costa, I.G.,
#> Valdeolivas, A., Dugourd, A. and Saez-Rodriguez, J. Comparison of
#> methods and resources for cell-cell communication inference from
#> single-cell RNA-Seq data. Nat Commun 13, 3224 (2022).
#>
#> A BibTeX entry for LaTeX users is
#>
#> @Article{,
#> author = {Daniel Dimitrov and Denes Turei and Martin Garrido-Rodriguez and Paul Burmedi L. and James Nagai S. and Charlotte Boys and Ricardo Ramirez Flores O. and Hyojin Kim and Bence Szalai and Ivan Costa G. and Alberto Valdeolivas and Aurélien Dugourd and Julio Saez-Rodriguez},
#> title = {Comparison of methods and resources for cell-cell communication inference from single-cell RNA-Seq data},
#> journal = {Nature Communications},
#> year = {2022},
#> doi = {10.1038/s41467-022-30755-0},
#> encoding = {UTF-8},
#> }
Session information
#> ─ Session info ───────────────────────────────────────────────────────────────────────────────────────────────────────
#> setting value
#> version R version 4.1.2 (2021-11-01)
#> os Ubuntu 20.04.5 LTS
#> system x86_64, linux-gnu
#> ui X11
#> language en
#> collate en_US.UTF-8
#> ctype en_US.UTF-8
#> tz Europe/Berlin
#> date 2023-02-24
#> pandoc 2.18 @ /home/dbdimitrov/anaconda3/envs/liana4.1/bin/ (via rmarkdown)
#>
#> ─ Packages ───────────────────────────────────────────────────────────────────────────────────────────────────────────
#> package * version date (UTC) lib source
#> abind 1.4-5 2016-07-21 [2] CRAN (R 4.1.2)
#> assertthat 0.2.1 2019-03-21 [2] CRAN (R 4.1.2)
#> backports 1.4.1 2021-12-13 [2] CRAN (R 4.1.2)
#> basilisk 1.9.12 2022-10-31 [2] Github (LTLA/basilisk@e185224)
#> basilisk.utils 1.9.4 2022-10-31 [2] Github (LTLA/basilisk.utils@b3ab58d)
#> beachmat 2.10.0 2021-10-26 [2] Bioconductor
#> beeswarm 0.4.0 2021-06-01 [2] CRAN (R 4.1.2)
#> Biobase 2.54.0 2021-10-26 [2] Bioconductor
#> BiocGenerics 0.40.0 2021-10-26 [2] Bioconductor
#> BiocManager 1.30.18 2022-05-18 [2] CRAN (R 4.1.2)
#> BiocNeighbors 1.12.0 2021-10-26 [2] Bioconductor
#> BiocParallel 1.28.3 2021-12-09 [2] Bioconductor
#> BiocSingular 1.10.0 2021-10-26 [2] Bioconductor
#> BiocStyle * 2.22.0 2021-10-26 [2] Bioconductor
#> bitops 1.0-7 2021-04-24 [2] CRAN (R 4.1.2)
#> bluster 1.4.0 2021-10-26 [2] Bioconductor
#> bookdown 0.27 2022-06-14 [2] CRAN (R 4.1.2)
#> broom 1.0.0 2022-07-01 [2] CRAN (R 4.1.2)
#> bslib 0.4.0 2022-07-16 [2] CRAN (R 4.1.2)
#> cachem 1.0.6 2021-08-19 [2] CRAN (R 4.1.2)
#> cellranger 1.1.0 2016-07-27 [2] CRAN (R 4.1.2)
#> checkmate 2.1.0 2022-04-21 [2] CRAN (R 4.1.2)
#> circlize * 0.4.15 2022-05-10 [2] CRAN (R 4.1.2)
#> cli 3.6.0 2023-01-09 [2] CRAN (R 4.1.2)
#> clue 0.3-61 2022-05-30 [2] CRAN (R 4.1.2)
#> cluster 2.1.3 2022-03-28 [2] CRAN (R 4.1.2)
#> codetools 0.2-18 2020-11-04 [2] CRAN (R 4.1.2)
#> colorspace 2.0-3 2022-02-21 [2] CRAN (R 4.1.2)
#> ComplexHeatmap 2.10.0 2021-10-26 [2] Bioconductor
#> cowplot 1.1.1 2020-12-30 [2] CRAN (R 4.1.2)
#> crayon 1.5.1 2022-03-26 [2] CRAN (R 4.1.2)
#> curl 4.3.2 2021-06-23 [2] CRAN (R 4.1.0)
#> data.table 1.14.2 2021-09-27 [2] CRAN (R 4.1.2)
#> DBI 1.1.3 2022-06-18 [2] CRAN (R 4.1.2)
#> dbplyr 2.2.1 2022-06-27 [2] CRAN (R 4.1.2)
#> DelayedArray 0.20.0 2021-10-26 [2] Bioconductor
#> DelayedMatrixStats 1.16.0 2021-10-26 [2] Bioconductor
#> deldir 1.0-6 2021-10-23 [2] CRAN (R 4.1.2)
#> desc 1.4.1 2022-03-06 [2] CRAN (R 4.1.2)
#> digest 0.6.29 2021-12-01 [2] CRAN (R 4.1.1)
#> dir.expiry 1.2.0 2021-10-26 [2] Bioconductor
#> doParallel 1.0.17 2022-02-07 [2] CRAN (R 4.1.2)
#> dplyr * 1.0.9 2022-04-28 [2] CRAN (R 4.1.2)
#> dqrng 0.3.0 2021-05-01 [2] CRAN (R 4.1.2)
#> edgeR 3.36.0 2021-10-26 [2] Bioconductor
#> ellipsis 0.3.2 2021-04-29 [2] CRAN (R 4.1.2)
#> evaluate 0.15 2022-02-18 [2] CRAN (R 4.1.2)
#> fansi 1.0.3 2022-03-24 [2] CRAN (R 4.1.2)
#> farver 2.1.1 2022-07-06 [2] CRAN (R 4.1.2)
#> fastmap 1.1.0 2021-01-25 [2] CRAN (R 4.1.2)
#> filelock 1.0.2 2018-10-05 [2] CRAN (R 4.1.2)
#> fitdistrplus 1.1-8 2022-03-10 [2] CRAN (R 4.1.2)
#> forcats * 0.5.1 2021-01-27 [2] CRAN (R 4.1.2)
#> foreach 1.5.2 2022-02-02 [2] CRAN (R 4.1.2)
#> fs 1.5.2 2021-12-08 [2] CRAN (R 4.1.2)
#> future 1.27.0 2022-07-22 [2] CRAN (R 4.1.2)
#> future.apply 1.9.0 2022-04-25 [2] CRAN (R 4.1.2)
#> gargle 1.2.0 2021-07-02 [2] CRAN (R 4.1.2)
#> generics 0.1.3 2022-07-05 [2] CRAN (R 4.1.2)
#> GenomeInfoDb 1.30.1 2022-01-30 [2] Bioconductor
#> GenomeInfoDbData 1.2.7 2022-01-26 [2] Bioconductor
#> GenomicRanges 1.46.1 2021-11-18 [2] Bioconductor
#> GetoptLong 1.0.5 2020-12-15 [2] CRAN (R 4.1.2)
#> ggbeeswarm 0.6.0 2017-08-07 [2] CRAN (R 4.1.2)
#> ggplot2 * 3.3.6 2022-05-03 [2] CRAN (R 4.1.2)
#> ggrepel 0.9.1 2021-01-15 [2] CRAN (R 4.1.2)
#> ggridges 0.5.3 2021-01-08 [2] CRAN (R 4.1.2)
#> GlobalOptions 0.1.2 2020-06-10 [2] CRAN (R 4.1.2)
#> globals 0.15.1 2022-06-24 [2] CRAN (R 4.1.2)
#> glue 1.6.2 2022-02-24 [2] CRAN (R 4.1.2)
#> goftest 1.2-3 2021-10-07 [2] CRAN (R 4.1.2)
#> googledrive 2.0.0 2021-07-08 [2] CRAN (R 4.1.2)
#> googlesheets4 1.0.0 2021-07-21 [2] CRAN (R 4.1.2)
#> gridExtra 2.3 2017-09-09 [2] CRAN (R 4.1.2)
#> gtable 0.3.0 2019-03-25 [2] CRAN (R 4.1.2)
#> haven 2.5.0 2022-04-15 [2] CRAN (R 4.1.2)
#> highr 0.9 2021-04-16 [2] CRAN (R 4.1.2)
#> hms 1.1.1 2021-09-26 [2] CRAN (R 4.1.2)
#> htmltools 0.5.3 2022-07-18 [2] CRAN (R 4.1.2)
#> htmlwidgets 1.5.4 2021-09-08 [2] CRAN (R 4.1.2)
#> httpuv 1.6.5 2022-01-05 [2] CRAN (R 4.1.2)
#> httr 1.4.3 2022-05-04 [2] CRAN (R 4.1.2)
#> ica 1.0-3 2022-07-08 [2] CRAN (R 4.1.2)
#> igraph 1.3.0 2022-04-01 [2] CRAN (R 4.1.3)
#> IRanges 2.28.0 2021-10-26 [2] Bioconductor
#> irlba 2.3.5 2021-12-06 [2] CRAN (R 4.1.2)
#> iterators 1.0.14 2022-02-05 [2] CRAN (R 4.1.2)
#> jquerylib 0.1.4 2021-04-26 [2] CRAN (R 4.1.2)
#> jsonlite 1.8.0 2022-02-22 [2] CRAN (R 4.1.2)
#> KernSmooth 2.23-20 2021-05-03 [2] CRAN (R 4.1.2)
#> knitr 1.39 2022-04-26 [2] CRAN (R 4.1.2)
#> labeling 0.4.2 2020-10-20 [2] CRAN (R 4.1.2)
#> later 1.3.0 2021-08-18 [2] CRAN (R 4.1.2)
#> lattice 0.20-45 2021-09-22 [2] CRAN (R 4.1.1)
#> lazyeval 0.2.2 2019-03-15 [2] CRAN (R 4.1.2)
#> leiden 0.4.2 2022-05-09 [2] CRAN (R 4.1.2)
#> liana * 0.1.12 2023-02-24 [1] Bioconductor
#> lifecycle 1.0.3 2022-10-07 [2] CRAN (R 4.1.2)
#> limma 3.50.3 2022-04-07 [2] Bioconductor
#> listenv 0.8.0 2019-12-05 [2] CRAN (R 4.1.2)
#> lmtest 0.9-40 2022-03-21 [2] CRAN (R 4.1.2)
#> locfit 1.5-9.6 2022-07-11 [2] CRAN (R 4.1.2)
#> logger 0.2.2 2021-10-19 [2] CRAN (R 4.1.2)
#> lubridate 1.8.0 2021-10-07 [2] CRAN (R 4.1.2)
#> magick 2.7.3 2021-08-18 [2] CRAN (R 4.1.1)
#> magrittr * 2.0.3 2022-03-30 [2] CRAN (R 4.1.3)
#> MASS 7.3-58 2022-07-14 [2] CRAN (R 4.1.2)
#> Matrix 1.5-3 2022-11-11 [2] CRAN (R 4.1.2)
#> MatrixGenerics 1.6.0 2021-10-26 [2] Bioconductor
#> matrixStats 0.62.0 2022-04-19 [2] CRAN (R 4.1.2)
#> memoise 2.0.1 2021-11-26 [2] CRAN (R 4.1.2)
#> metapod 1.2.0 2021-10-26 [2] Bioconductor
#> mgcv 1.8-40 2022-03-29 [2] CRAN (R 4.1.2)
#> mime 0.12 2021-09-28 [2] CRAN (R 4.1.2)
#> miniUI 0.1.1.1 2018-05-18 [2] CRAN (R 4.1.2)
#> modelr 0.1.8 2020-05-19 [2] CRAN (R 4.1.2)
#> munsell 0.5.0 2018-06-12 [2] CRAN (R 4.1.2)
#> nlme 3.1-158 2022-06-15 [2] CRAN (R 4.1.2)
#> OmnipathR 3.7.2 2023-02-19 [2] Github (saezlab/OmnipathR@c5f63b4)
#> parallelly 1.32.1 2022-07-21 [2] CRAN (R 4.1.2)
#> patchwork 1.1.1 2020-12-17 [2] CRAN (R 4.1.2)
#> pbapply 1.5-0 2021-09-16 [2] CRAN (R 4.1.2)
#> pillar 1.8.0 2022-07-18 [2] CRAN (R 4.1.2)
#> pkgconfig 2.0.3 2019-09-22 [2] CRAN (R 4.1.0)
#> pkgdown 2.0.6 2022-07-16 [2] CRAN (R 4.1.2)
#> plotly 4.10.0 2021-10-09 [2] CRAN (R 4.1.2)
#> plyr 1.8.7 2022-03-24 [2] CRAN (R 4.1.2)
#> png 0.1-7 2013-12-03 [2] CRAN (R 4.1.0)
#> polyclip 1.10-0 2019-03-14 [2] CRAN (R 4.1.2)
#> prettyunits 1.1.1 2020-01-24 [2] CRAN (R 4.1.2)
#> progress 1.2.2 2019-05-16 [2] CRAN (R 4.1.2)
#> progressr 0.10.1 2022-06-03 [2] CRAN (R 4.1.2)
#> promises 1.2.0.1 2021-02-11 [2] CRAN (R 4.1.2)
#> purrr * 0.3.4 2020-04-17 [2] CRAN (R 4.1.0)
#> R6 2.5.1 2021-08-19 [2] CRAN (R 4.1.2)
#> ragg 1.2.2 2022-02-21 [2] CRAN (R 4.1.2)
#> RANN 2.6.1 2019-01-08 [2] CRAN (R 4.1.2)
#> rappdirs 0.3.3 2021-01-31 [2] CRAN (R 4.1.2)
#> RColorBrewer 1.1-3 2022-04-03 [2] CRAN (R 4.1.2)
#> Rcpp 1.0.8.3 2022-03-17 [2] CRAN (R 4.1.2)
#> RcppAnnoy 0.0.19 2021-07-30 [2] CRAN (R 4.1.2)
#> RCurl 1.98-1.7 2022-06-09 [2] CRAN (R 4.1.2)
#> readr * 2.1.2 2022-01-30 [2] CRAN (R 4.1.2)
#> readxl 1.4.0 2022-03-28 [2] CRAN (R 4.1.2)
#> reprex 2.0.1 2021-08-05 [2] CRAN (R 4.1.2)
#> reshape2 1.4.4 2020-04-09 [2] CRAN (R 4.1.2)
#> reticulate 1.25 2022-05-11 [2] CRAN (R 4.1.2)
#> rgeos 0.5-9 2021-12-15 [2] CRAN (R 4.1.2)
#> rjson 0.2.21 2022-01-09 [2] CRAN (R 4.1.2)
#> rlang 1.0.6 2022-09-24 [2] CRAN (R 4.1.2)
#> rmarkdown 2.14 2022-04-25 [2] CRAN (R 4.1.2)
#> ROCR 1.0-11 2020-05-02 [2] CRAN (R 4.1.2)
#> rpart 4.1.16 2022-01-24 [2] CRAN (R 4.1.2)
#> rprojroot 2.0.3 2022-04-02 [2] CRAN (R 4.1.2)
#> rstudioapi 0.13 2020-11-12 [2] CRAN (R 4.1.2)
#> rsvd 1.0.5 2021-04-16 [2] CRAN (R 4.1.2)
#> Rtsne 0.16 2022-04-17 [2] CRAN (R 4.1.2)
#> rvest 1.0.2 2021-10-16 [2] CRAN (R 4.1.2)
#> S4Vectors 0.32.4 2022-03-24 [2] Bioconductor
#> sass 0.4.2 2022-07-16 [2] CRAN (R 4.1.2)
#> ScaledMatrix 1.2.0 2021-10-26 [2] Bioconductor
#> scales 1.2.0 2022-04-13 [2] CRAN (R 4.1.2)
#> scater 1.22.0 2021-10-26 [2] Bioconductor
#> scattermore 0.8 2022-02-14 [2] CRAN (R 4.1.2)
#> scran 1.22.1 2021-11-14 [2] Bioconductor
#> sctransform 0.3.3 2022-01-13 [2] CRAN (R 4.1.2)
#> scuttle 1.4.0 2021-10-26 [2] Bioconductor
#> sessioninfo 1.2.2 2021-12-06 [2] CRAN (R 4.1.2)
#> Seurat 4.1.1 2022-05-02 [2] CRAN (R 4.1.2)
#> SeuratObject 4.1.0 2022-05-01 [2] CRAN (R 4.1.2)
#> shape 1.4.6 2021-05-19 [2] CRAN (R 4.1.2)
#> shiny 1.7.2 2022-07-19 [2] CRAN (R 4.1.2)
#> SingleCellExperiment 1.16.0 2021-10-26 [2] Bioconductor
#> sp 1.5-0 2022-06-05 [2] CRAN (R 4.1.3)
#> sparseMatrixStats 1.6.0 2021-10-26 [2] Bioconductor
#> spatstat.core 2.4-4 2022-05-18 [2] CRAN (R 4.1.2)
#> spatstat.data 3.0-0 2022-10-21 [2] CRAN (R 4.1.2)
#> spatstat.geom 3.0-3 2022-10-25 [2] CRAN (R 4.1.2)
#> spatstat.random 3.0-1 2022-11-03 [2] CRAN (R 4.1.2)
#> spatstat.sparse 3.0-0 2022-10-21 [2] CRAN (R 4.1.2)
#> spatstat.utils 3.0-1 2022-10-19 [2] CRAN (R 4.1.2)
#> statmod 1.4.36 2021-05-10 [2] CRAN (R 4.1.2)
#> stringi 1.7.6 2021-11-29 [2] CRAN (R 4.1.1)
#> stringr * 1.4.0 2019-02-10 [2] CRAN (R 4.1.0)
#> SummarizedExperiment 1.24.0 2021-10-26 [2] Bioconductor
#> survival 3.3-1 2022-03-03 [2] CRAN (R 4.1.2)
#> systemfonts 1.0.4 2022-02-11 [2] CRAN (R 4.1.2)
#> tensor 1.5 2012-05-05 [2] CRAN (R 4.1.2)
#> textshaping 0.3.6 2021-10-13 [2] CRAN (R 4.1.2)
#> tibble * 3.1.8 2022-07-22 [2] CRAN (R 4.1.2)
#> tidyr * 1.2.0 2022-02-01 [2] CRAN (R 4.1.2)
#> tidyselect 1.2.0 2022-10-10 [2] CRAN (R 4.1.2)
#> tidyverse * 1.3.2 2022-07-18 [2] CRAN (R 4.1.2)
#> tzdb 0.3.0 2022-03-28 [2] CRAN (R 4.1.2)
#> utf8 1.2.2 2021-07-24 [2] CRAN (R 4.1.2)
#> uwot 0.1.11 2021-12-02 [2] CRAN (R 4.1.2)
#> vctrs 0.4.1 2022-04-13 [2] CRAN (R 4.1.2)
#> vipor 0.4.5 2017-03-22 [2] CRAN (R 4.1.2)
#> viridis 0.6.2 2021-10-13 [2] CRAN (R 4.1.2)
#> viridisLite 0.4.0 2021-04-13 [2] CRAN (R 4.1.2)
#> withr 2.5.0 2022-03-03 [2] CRAN (R 4.1.2)
#> xfun 0.31 2022-05-10 [2] CRAN (R 4.1.2)
#> xml2 1.3.3 2021-11-30 [2] CRAN (R 4.1.2)
#> xtable 1.8-4 2019-04-21 [2] CRAN (R 4.1.2)
#> XVector 0.34.0 2021-10-26 [2] Bioconductor
#> yaml 2.3.5 2022-02-21 [2] CRAN (R 4.1.2)
#> zlibbioc 1.40.0 2021-10-26 [2] Bioconductor
#> zoo 1.8-10 2022-04-15 [2] CRAN (R 4.1.2)
#>
#> [1] /tmp/RtmpxcdOYQ/temp_libpath7149c6a489cd4
#> [2] /home/dbdimitrov/anaconda3/envs/liana4.1/lib/R/library
#>
#> ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────