Skip to contents

Date: 24.06.2024

cyCONDOR provides several functions to visualize the results of cyCONDOR´s dimensionality reduction and clustering workflows.

Load an example dataset

In this vignette, we will use a flow cytometry dataset of six PBMC samples taken from three patients and three control. The data was transformed and subjected to several dimensionality reduction methods as well as clustering and metaclustering using cyCONDOR(see vignettes: Data loading and transformation, Dimensionality Reduction, Clustering and cell annotation).

condor <- readRDS("../.test_files/conodr_example_016.rds")
#Let's checkout the content of the object
str(condor[!names(condor) %in% "extras"])
## List of 6
##  $ expr      :List of 1
##   ..$ orig:'data.frame': 59049 obs. of  28 variables:
##   .. ..$ FSC-A        : num [1:59049] 4.38 4.22 4.27 4.18 4.08 ...
##   .. ..$ SSC-A        : num [1:59049] 3.91 3.24 3.42 3.62 3.7 ...
##   .. ..$ CD38         : num [1:59049] 3.61 3.12 3.71 2.9 2.06 ...
##   .. ..$ CD8          : num [1:59049] 0.869 2.118 3.802 2.748 3.868 ...
##   .. ..$ CD195 (CCR5) : num [1:59049] 2.281 1.199 0.816 1.5 3.303 ...
##   .. ..$ CD94 (KLRD1) : num [1:59049] 2.32 2.24 1.78 2.57 2.18 ...
##   .. ..$ CD45RA       : num [1:59049] 3.33 3.63 2.49 3.93 4.14 ...
##   .. ..$ HLA-DR       : num [1:59049] 3.173 1.595 3.066 0.973 0.62 ...
##   .. ..$ CD56         : num [1:59049] 1.43 2.25 1.72 3.28 1.48 ...
##   .. ..$ CD127 (IL7RA): num [1:59049] 1.03 3.16 1.17 1.58 3.1 ...
##   .. ..$ CD14         : num [1:59049] 3.96 2.14 1.47 1.21 1.92 ...
##   .. ..$ CD64         : num [1:59049] 2.475 0.462 0.85 1.075 0.981 ...
##   .. ..$ CD4          : num [1:59049] 2.658 3.886 0.209 1.135 0.499 ...
##   .. ..$ IgD          : num [1:59049] 0.932 0.438 1.488 0.694 1.486 ...
##   .. ..$ CD19         : num [1:59049] 1.822 1.583 0.813 1.703 0.357 ...
##   .. ..$ CD16         : num [1:59049] 1.658 0.863 0.838 2.828 1.325 ...
##   .. ..$ CD32         : num [1:59049] 2.476 0.743 1.056 0.887 0.756 ...
##   .. ..$ CD197 (CCR7) : num [1:59049] 1.4012 2.6245 0.0844 0.9996 1.2096 ...
##   .. ..$ CD20         : num [1:59049] 0.724 1.289 1.672 1.371 1.623 ...
##   .. ..$ CD27         : num [1:59049] 1.737 3.89 3.564 0.638 0.622 ...
##   .. ..$ CD15         : num [1:59049] 0.844 0.549 0.632 1.258 2.04 ...
##   .. ..$ PD-1         : num [1:59049] 0.0514 0.9102 0.9839 0.4781 1.7587 ...
##   .. ..$ CD3          : num [1:59049] 0.964 4.006 3.746 1.788 3.875 ...
##   .. ..$ CD57         : num [1:59049] 1.277 0.531 1.006 3.039 3.004 ...
##   .. ..$ CD25         : num [1:59049] 1.709 2.032 1.833 1.187 0.937 ...
##   .. ..$ CD123 (IL3RA): num [1:59049] 2.32 1.14 1.13 1.11 1.28 ...
##   .. ..$ CD13         : num [1:59049] 2.388 0.817 0.703 0.861 0.707 ...
##   .. ..$ CD11c        : num [1:59049] 3.792 0.645 2.025 0.668 1.946 ...
##  $ anno      :List of 1
##   ..$ cell_anno:'data.frame':    59049 obs. of  3 variables:
##   .. ..$ expfcs_filename: Factor w/ 6 levels "ID10.fcs","ID3.fcs",..: 1 1 1 1 1 1 1 1 1 1 ...
##   .. ..$ sample_ID      : chr [1:59049] "ID10" "ID10" "ID10" "ID10" ...
##   .. ..$ group          : chr [1:59049] "pat" "pat" "pat" "pat" ...
##  $ pca       :List of 1
##   ..$ orig: num [1:59049, 1:28] -4.593 2.011 0.741 0.601 1.685 ...
##   .. ..- attr(*, "dimnames")=List of 2
##   .. .. ..$ : chr [1:59049] "ID10.fcs_1" "ID10.fcs_2" "ID10.fcs_3" "ID10.fcs_4" ...
##   .. .. ..$ : chr [1:28] "PC1" "PC2" "PC3" "PC4" ...
##  $ umap      :List of 1
##   ..$ pca_orig: num [1:59049, 1:2] -9.19 1.6 5.45 3.97 2.5 ...
##   .. ..- attr(*, "scaled:center")= num [1:2] -0.126 -0.253
##   .. ..- attr(*, "dimnames")=List of 2
##   .. .. ..$ : chr [1:59049] "ID10.fcs_1" "ID10.fcs_2" "ID10.fcs_3" "ID10.fcs_4" ...
##   .. .. ..$ : chr [1:2] "UMAP1" "UMAP2"
##  $ tSNE      :List of 1
##   ..$ pca_orig: num [1:59049, 1:2] 18.26 -11.83 -24.09 5.71 -10.98 ...
##   .. ..- attr(*, "dimnames")=List of 2
##   .. .. ..$ : chr [1:59049] "ID10.fcs_1" "ID10.fcs_2" "ID10.fcs_3" "ID10.fcs_4" ...
##   .. .. ..$ : chr [1:2] "tSNE1" "tSNE2"
##  $ clustering:List of 2
##   ..$ phenograph_pca_orig_k_60:'data.frame': 59049 obs. of  3 variables:
##   .. ..$ Phenograph  : Factor w/ 25 levels "1","2","3","4",..: 1 2 3 4 5 5 6 1 1 5 ...
##   .. ..$ Description : chr [1:59049] "pca_orig_k60" "pca_orig_k60" "pca_orig_k60" "pca_orig_k60" ...
##   .. ..$ metaclusters: Factor w/ 16 levels "Classical Monocytes",..: 1 2 3 4 5 5 1 1 1 5 ...
##   ..$ FlowSOM_pca_orig_k_15   :'data.frame': 59049 obs. of  2 variables:
##   .. ..$ FlowSOM    : Factor w/ 15 levels "1","2","3","4",..: 12 11 4 2 3 3 12 12 12 3 ...
##   .. ..$ Description: chr [1:59049] "pca_orig_k15" "pca_orig_k15" "pca_orig_k15" "pca_orig_k15" ...

Visualize the results of dimensionality reduction and clustering

cyCONDOR comes with several methods to perform dimensionality reduction. Two dimensional representations of each reduction method can be visualized using the plot_dim_red() function.

The function requires the user to specify a condor object, the reduction method (e.g. pca, umap or tSNE) and the name of the actual reduction_slot, e.g. “orig”. Further, a variable needs to be provided to the parameter param, which is used to color the dots.

PCA

Let’s plot the first two Principle components of the PCA and color by the meta variable “group”.

plot_dim_red(fcd = condor,
             expr_slot = NULL,
             reduction_method = "pca",
             reduction_slot = "orig",
             cluster_slot = NULL,
             param = "group",
             title = "PCA")

tSNE

Changing reduction_method = "tSNE" and reduction_slot = "pca_orig", results in a plot of the tSNE.

plot_dim_red(fcd = condor,
             expr_slot = NULL,
             reduction_method = "tSNE",
             reduction_slot = "pca_orig",
             cluster_slot = NULL,
             param = "group",
             title = "tSNE")

UMAP

Similiarly, reduction_method = "umap" and reduction_slot = "pca_orig", gives us a the UMAP representation that was calculated on the PCA on the transformed expression data.

plot_dim_red(fcd = condor,
             expr_slot = NULL,
             reduction_method = "umap",
             reduction_slot = "pca_orig",
             cluster_slot = NULL,
             param = "group",
             title = "UMAP")

Colored by Phenograph, FlowSOM clustering or metaclusters

Instead of meta variables available in the cell_anno slot, it is also possible to overlay cell population identities, determined by cyCONDOR's clustering or cell label implementations. In this case, the function additionally requires the specification of a cluster_slot as input, to define were param should be taken from.

In the following example, we will visualize the cluster identities (param = "Phenograph") and the related metaclustering annotation (param = "metaclusters") in the cluster_slot “phenograph_pca_orig_k_60”.

p1<-plot_dim_red(fcd = condor,
                 expr_slot = NULL,
                 reduction_method = "umap",
                 reduction_slot = "pca_orig",
                 cluster_slot = "phenograph_pca_orig_k_60",
                 param = "Phenograph",
                 title = "UMAP colored by Phenograph clusters")

p2<-plot_dim_red(fcd = condor,
                 expr_slot = NULL,
                 reduction_method = "umap",
                 reduction_slot = "pca_orig",
                 cluster_slot = "phenograph_pca_orig_k_60",
                 param = "metaclusters",
                 title = "UMAP colored by metaclusters")

cowplot::plot_grid(plotlist = list(p1,p2),align = "v")

In the same manner, FlowSOM results can be plotted on the dimensionality reduction.

plot_dim_red(fcd = condor,
             expr_slot = NULL,
             reduction_method = "umap",
             reduction_slot = "pca_orig",
             cluster_slot = "FlowSOM_pca_orig_k_15",
             param = "FlowSOM",
             title = "UMAP colored by FlowSOM clusters")

Split plot by a variable

Sometimes it comes in handy to split the dimensionality reduction by a variable, e.g. group, sample ID or experimental batches. In the plot_dim_red() function this can be achieved via the facet_by_variable parameter.

Setting facet_by_variable = T, will split the plot by the variable provided in param.

plot_dim_red(fcd = condor,
             expr_slot = NULL,
             reduction_method = "umap",
             reduction_slot = "pca_orig",
             cluster_slot = NULL,
             param = "group",
             facet_by_variable = T,
             title = "UMAP")

Providing facet_by_variable with a different variable than specified in param, will keep the coloring by the variable in param, but splits the plot by the faceting variable. Note, that in case clustering variables are used, a cluster_slot needs to be provided as well.

plot_dim_red(fcd = condor,
             expr_slot = NULL,
             reduction_method = "umap",
             reduction_slot = "pca_orig",
             cluster_slot = "phenograph_pca_orig_k_60",
             param = "metaclusters",
             facet_by_variable = "group",
             title = "UMAP colored by metaclusters")

Export the plot as raster image

Visualizing hundred thousands of events can be demanding. Using raster = T, the function will generate a raster image, instead of plotting each event individually.

plot_dim_red(fcd = condor,
             expr_slot = NULL,
             reduction_method = "umap",
             reduction_slot = "pca_orig",
             cluster_slot = "FlowSOM_pca_orig_k_15",
             param = "FlowSOM",
             raster = T,
             title = "UMAP colored by FlowSOM clusters")

Visualization of marker expression

In the next section, we will go through some examples of how marker expression can be visualized with cyCONDOR. Since this is most interesting, when the data are already clustered, almost all functions require cluster or cell label information obtained via cyCONDOR's clustering or cell label prediction workflows. Only the function, plot_dim_red(), can be used without any cell population labels.

Marker expression overlayed on dimensionality reduction

To overlay marker expression values on the dimensionality reduction, we can use the plot_dim_red() function introduced in the section before. Instead of a clustering_slot, the expression_slot in which the expression values are stored needs to be specified and the marker to be visualized is given to the parameter param.

In large data sets, the dimensionality reduction can be “crowded” and it might be useful to order the cells by their expression. Setting order = T, will plot the cells with the highest expression at the top.

p1<-plot_dim_red(fcd = condor,
                 expr_slot = "orig",
                 reduction_method = "umap",
                 reduction_slot = "pca_orig",
                 cluster_slot = NULL,
                 param = "CD3",
                 order = F, #default
                 title = "CD3 expression - random order")

p2<-plot_dim_red(fcd = condor,
                 expr_slot = "orig",
                 reduction_method = "umap",
                 reduction_slot = "pca_orig",
                 cluster_slot = NULL,
                 param = "CD3", 
                 order = T,
                 title = "CD3 expression - ordered")

cowplot::plot_grid(plotlist = list(p1,p2),align = "v")

As above a facet_by_variable can be used to split the plot by another variable.

plot_dim_red(fcd = condor,
             expr_slot = "orig",
             reduction_method = "umap",
             reduction_slot = "pca_orig",
             cluster_slot = NULL,
             param = "CD3",
             facet_by_variable = "group",
             title = "CD3 expression split by group")

Heatmap of marker expression

Heatmap visualizations are useful to get a fast overview across many markers and cell populations. The plot_marker_HM() function calculates the mean transformed expression for each cell population and marker combination. The means are centered and scaled for each marker and subsequently visualized as heatmap.

However, it should be mention that this comes with certain draw backs: 1) the distribution of the expression is not considered when looking at the mean and 2) the actual expression level is somewhat obscured by the row-wise scaling.

plot_marker_HM(fcd = condor,
               expr_slot = "orig",
               marker_to_exclude = c("FSC-A","SSC-A"),
               cluster_slot = "phenograph_pca_orig_k_60",
               cluster_var = "metaclusters")

By setting cluster_rows = T and cluster_cols, rows and columns get clustered.

plot_marker_HM(fcd = condor,
               expr_slot = "orig",
               marker_to_exclude = c("FSC-A","SSC-A"),
               cluster_slot = "phenograph_pca_orig_k_60",
               cluster_var = "metaclusters",
               cluster_rows = T,
               cluster_cols = T)

The function plot_marker_group_HM works very similarly with the addition that a meta variable available in cell_anno is provided and used to further split the columns by the levels of that meta variable. In the following example, we are interested whether mean expression of phenotaping markers like CD3 or CD19 is stable across the different samples by using group_var = sample_ID.

plot_marker_group_HM(fcd = condor,
                     expr_slot = "orig",
                     marker_to_exclude = c("FSC-A","SSC-A"),
                     cluster_slot = "phenograph_pca_orig_k_60",
                     cluster_var = "metaclusters",
                     group_var = "sample_ID")

Plot mean expression as boxplots

Instead of as a heatmap, the mean (or median) expression can be visualized as boxplots with each sample being represented by a dot. For this, the plot_marker_boxplot requires the user to specify a variable containing sample IDs in sample_var and a grouping variable in group_var. Each sample ID should be uniquely associated with one level in group_var. The grouping variable could for example be the disease status or the batch variable. Since the data has no batch and we are not yet interested in differences in our biological groups (see vignette("Differential Analysis"), we are using the variable “experiment_name” in the following chunk to get an overview about the expression in our samples.

condor$anno$cell_anno$experiment_name <-"test_data"

plot_marker_boxplot(fcd = condor,
                    expr_slot = "orig", 
                    cluster_slot = "phenograph_pca_orig_k_60", 
                    cluster_var = "metaclusters",
                    group_var = "experiment_name",
                    sample_var = "sample_ID", 
                    marker = c("CD3","CD4","CD8","CD14","CD19","HLA-DR"),
                    fun = "mean",
                    facet_ncol = 3,
                    dot_size = 1)

By default the function will generate boxplots for all marker and cell population combinations, which depending on the panel size can be too much to inspect at once. With the parameters marker the user can select the markers of interest, while cluster_to_show allows to subset to certain cell populations present in the given cluster_var. Further, it is possible to calculate the median expression instead of mean by using fun = "median".

Distribution of expression

Besides visualizing aggregated expression, cyCONDOR also provides different visualization options to investigate the distribution of marker expression across all cells in a population.

plot_marker_ridgeplot() and plot_marker_violinplot(), both visualize the density distribution of a marker for each cell population in cluster_var and therefor provide insights whether a marker is homogeneously expressed in a certain cluster (or cell population) or whether only a part of the cells is expressing the marker highly or lowly. These plots can be very useful, when inspecting and annotating clusters, since they e.g. enable the detection of smaller subsets or contamination in a cluster of cells, which is not visible in a heatmap.

plot_marker_density() and (optionally) plot_marker_violinplot() further split the distributions by meta variables present in the cell_anno slot, which can help to investigate technical and/or bioligical influencing factors.

Ridgeline plot

plot_marker_ridgeplot() visualizes a density distribution of the expression for each cell population in cluster_var for a marker specified in marker.

plot_marker_ridgeplot(fcd = condor,
                      expr_slot = "orig", 
                      cluster_slot = "phenograph_pca_orig_k_60", 
                      cluster_var = "metaclusters", 
                      marker = "CD3")
## Warning: `expand_scale()` was deprecated in ggplot2 3.3.0.
##  Please use `expansion()` instead.
##  The deprecated feature was likely used in the cyCONDOR package.
##   Please report the issue to the authors.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.
## Picking joint bandwidth of 0.0733

In case more than one marker are specified, the function returns a list of plots - one plot for each marker.

plot.list<- plot_marker_ridgeplot(fcd = condor,
                      expr_slot = "orig", 
                      cluster_slot = "phenograph_pca_orig_k_60", 
                      cluster_var = "metaclusters", 
                      marker = c("CD3","CD4"))

cowplot::plot_grid(plotlist = plot.list,align = "v")
## Picking joint bandwidth of 0.0733
## Picking joint bandwidth of 0.0737

Violin plot

The plot_marker_violinplot requires the same input as plot_marker_ridgeplot. But the density distribution of marker expression is visualized as violins for each cell population and the populations are shown next to each other instead of being vertically stacked.

plot_marker_violinplot(fcd = condor, 
                       expr_slot = "orig", 
                       cluster_slot = "phenograph_pca_orig_k_60", 
                       cluster_var = "metaclusters", 
                       marker = "CD56")

Again, provided with several marker names, the function returns a list of plots.

plot.list<-plot_marker_violinplot(fcd = condor, 
                                  expr_slot = "orig", 
                                  cluster_slot = "phenograph_pca_orig_k_60", 
                                  cluster_var = "metaclusters", 
                                  marker = c("CD3","CD56","HLA-DR","CD19"))

cowplot::plot_grid(plotlist = plot.list,align = "hv")

As a site note, plot_marker_violinplot() optionally can be given a grouping variable group_var which is used to split each violin plot by. This can be useful when looking at biological groups or batch variables.

Density plot

The plot_marker_density() can be used to compare expression distributions between different levels in a given group_var. This can for example be applied to investigate homogeneity of staining and measuring procedure between samples or experimental days.

plot_marker_density(fcd = condor,
                    expr_slot = "orig", 
                    cluster_slot = "phenograph_pca_orig_k_60", 
                    cluster_var = "metaclusters",
                    group_var = "sample_ID",
                    marker = "CD57")

Classical cytometry dotplot

Finally, using plot_marker_dotplot() a scatter plot of two markers can be generated to investigate the relation of their expression. The marker on the x-axis is specified in marker_x, while the marker on the y-axis is specified in marker_y.

plot_marker_dotplot(fcd = condor, 
                    expr_slot = "orig",
                    marker_x = "CD3",
                    marker_y = "CD19",
                    cluster_slot = "phenograph_pca_orig_k_60",
                    cluster_var = "metaclusters", 
                    dot_size = 0.5)

Inspection of cell counts

As always, it is important to consider how many cells are actually underlying visualizations that conceal the actual cells behind aggregated expression values (mean/median) or density distributions. cyCONDOR provides functions to quickly assess cell counts.

You can either look at the cell counts per sample and cell population in table format with the getTable() function setting output_type = "counts", or visualize cell numbers with the plot_counts_barplot() function.

# get counts as data frame
counts<-getTable(fcd = condor,
                 output_type = "counts",
                 cluster_slot = "phenograph_pca_orig_k_60", 
                 cluster_var = "metaclusters", 
                 group_var = "sample_ID", 
                 numeric = F)
counts
##      group_var B cells Basophils CD16+ Monocytes CD4 CD127- CD4 CD25+
## ID10      ID10     111        13             342        365       101
## ID3        ID3     354        80             350        500       324
## ID5        ID5     493        35             219        485       202
## ID6        ID6     192        24             494        263       312
## ID7        ID7     171        59             143        875       126
## ID8        ID8      86        25             255        533       114
##      CD4 CD45RA- CD127+ CD4 CD45RA+ CD127+ CD8 CD45RA- CD127+
## ID10                564                569                461
## ID3                1837                993                472
## ID5                1614                933                727
## ID6                 535                191                500
## ID7                1572               1475                974
## ID8                 613               1498                333
##      CD8 CD45RA+ CD127- CD8 CD45RA+ CD127+ Classical Monocytes Mixed NK bright
## ID10               2123                682                3184     7       317
## ID3                 142               1165                2338    48       464
## ID5                 623                920                2372   248       512
## ID6                1085                894                2102    90       667
## ID7                  68                308                2151    10       515
## ID8                1829                697                3008    31       247
##      NK dim pDCs Unconventional T cells
## ID10    641   24                    496
## ID3     825   80                     28
## ID5     517   66                     34
## ID6    1242   30                    428
## ID7    1490   55                      8
## ID8      79   54                    598
# get cells per cluster_var
colSums(counts[,c(-1)])
##                B cells              Basophils        CD16+ Monocytes 
##                   1407                    236                   1803 
##             CD4 CD127-              CD4 CD25+     CD4 CD45RA- CD127+ 
##                   3021                   1179                   6735 
##     CD4 CD45RA+ CD127+     CD8 CD45RA- CD127+     CD8 CD45RA+ CD127- 
##                   5659                   3467                   5870 
##     CD8 CD45RA+ CD127+    Classical Monocytes                  Mixed 
##                   4666                  15155                    434 
##              NK bright                 NK dim                   pDCs 
##                   2722                   4794                    309 
## Unconventional T cells 
##                   1592

The plot_counts_barplot() function stacks absolute cell numbers of each cell population on top of each other for each group in the grouping variable, which can be set via the group_var parameter.

# visualize counts as stacked bar plot, faceted by clustering
plot_counts_barplot(fcd = condor,
                    cluster_slot = "phenograph_pca_orig_k_60",
                    cluster_var = "metaclusters",
                    group_var = "sample_ID",
                    facet_by_clustering = F,
                    facet_ncol = 5
)

A faceting of the plot by cell population can be achieved by setting the parameter facet_by_group = T.

# visualize counts as stacked bar plot, faceted by clustering
plot_counts_barplot(fcd = condor,
                    cluster_slot = "phenograph_pca_orig_k_60",
                    cluster_var = "metaclusters",
                    group_var = "sample_ID",
                    facet_by_clustering = T,
                    facet_ncol = 5
)

Others

Visualize the loadings of PCs

PC_loadings() can be used to visualize the loadings for each principle component.

PC_loadings(fcd = condor, data_slot = "orig")

Density plot

plot_dim_density(fcd = condor,
                 reduction_method = "umap",
                 reduction_slot = "pca_orig",
                 group_var = "group",
                 color_density = c("Greys", "Reds"))

MORE visualization?

In this vignette, we mostly focused on visualizations that are useful to investigate clusterings and support annotation of cell populations. However, biological questions often revolve around comparing different biological groups of samples. To get some inspirations how those can be visualized, check out the vignette("Differential Analysis")!

Session Info

info <- sessionInfo()
info
## R version 4.3.1 (2023-06-16)
## Platform: x86_64-pc-linux-gnu (64-bit)
## Running under: Ubuntu 22.04.3 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.20.so;  LAPACK version 3.10.0
## 
## locale:
##  [1] LC_CTYPE=en_US.UTF-8       LC_NUMERIC=C              
##  [3] LC_TIME=en_US.UTF-8        LC_COLLATE=en_US.UTF-8    
##  [5] LC_MONETARY=en_US.UTF-8    LC_MESSAGES=en_US.UTF-8   
##  [7] LC_PAPER=en_US.UTF-8       LC_NAME=C                 
##  [9] LC_ADDRESS=C               LC_TELEPHONE=C            
## [11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C       
## 
## time zone: Etc/UTC
## tzcode source: system (glibc)
## 
## attached base packages:
## [1] stats     graphics  grDevices utils     datasets  methods   base     
## 
## other attached packages:
## [1] cyCONDOR_0.2.0
## 
## loaded via a namespace (and not attached):
##   [1] IRanges_2.34.1              Rmisc_1.5.1                
##   [3] urlchecker_1.0.1            nnet_7.3-19                
##   [5] CytoNorm_2.0.1              TH.data_1.1-2              
##   [7] vctrs_0.6.4                 digest_0.6.33              
##   [9] png_0.1-8                   shape_1.4.6                
##  [11] proxy_0.4-27                slingshot_2.8.0            
##  [13] ggrepel_0.9.4               parallelly_1.36.0          
##  [15] MASS_7.3-60                 pkgdown_2.0.7              
##  [17] reshape2_1.4.4              httpuv_1.6.12              
##  [19] foreach_1.5.2               BiocGenerics_0.46.0        
##  [21] withr_2.5.1                 ggrastr_1.0.2              
##  [23] xfun_0.40                   ggpubr_0.6.0               
##  [25] ellipsis_0.3.2              survival_3.5-7             
##  [27] memoise_2.0.1               hexbin_1.28.3              
##  [29] ggbeeswarm_0.7.2            RProtoBufLib_2.12.1        
##  [31] princurve_2.1.6             profvis_0.3.8              
##  [33] ggsci_3.0.0                 systemfonts_1.0.5          
##  [35] ragg_1.2.6                  zoo_1.8-12                 
##  [37] GlobalOptions_0.1.2         DEoptimR_1.1-3             
##  [39] Formula_1.2-5               prettyunits_1.2.0          
##  [41] promises_1.2.1              scatterplot3d_0.3-44       
##  [43] rstatix_0.7.2               globals_0.16.2             
##  [45] ps_1.7.5                    rstudioapi_0.15.0          
##  [47] miniUI_0.1.1.1              generics_0.1.3             
##  [49] ggcyto_1.28.1               base64enc_0.1-3            
##  [51] processx_3.8.2              curl_5.1.0                 
##  [53] S4Vectors_0.38.2            zlibbioc_1.46.0            
##  [55] flowWorkspace_4.12.2        polyclip_1.10-6            
##  [57] randomForest_4.7-1.1        GenomeInfoDbData_1.2.10    
##  [59] RBGL_1.76.0                 ncdfFlow_2.46.0            
##  [61] RcppEigen_0.3.3.9.4         xtable_1.8-4               
##  [63] stringr_1.5.0               desc_1.4.2                 
##  [65] doParallel_1.0.17           evaluate_0.22              
##  [67] S4Arrays_1.0.6              hms_1.1.3                  
##  [69] glmnet_4.1-8                GenomicRanges_1.52.1       
##  [71] irlba_2.3.5.1               colorspace_2.1-0           
##  [73] isoband_0.2.7               harmony_1.1.0              
##  [75] reticulate_1.34.0           readxl_1.4.3               
##  [77] magrittr_2.0.3              lmtest_0.9-40              
##  [79] readr_2.1.4                 Rgraphviz_2.44.0           
##  [81] later_1.3.1                 lattice_0.22-5             
##  [83] future.apply_1.11.0         robustbase_0.99-0          
##  [85] XML_3.99-0.15               cowplot_1.1.1              
##  [87] matrixStats_1.1.0           xts_0.13.1                 
##  [89] class_7.3-22                Hmisc_5.1-1                
##  [91] pillar_1.9.0                nlme_3.1-163               
##  [93] iterators_1.0.14            compiler_4.3.1             
##  [95] RSpectra_0.16-1             stringi_1.7.12             
##  [97] gower_1.0.1                 minqa_1.2.6                
##  [99] SummarizedExperiment_1.30.2 lubridate_1.9.3            
## [101] devtools_2.4.5              CytoML_2.12.0              
## [103] plyr_1.8.9                  crayon_1.5.2               
## [105] abind_1.4-5                 locfit_1.5-9.8             
## [107] sp_2.1-1                    sandwich_3.0-2             
## [109] pcaMethods_1.92.0           dplyr_1.1.3                
## [111] codetools_0.2-19            multcomp_1.4-25            
## [113] textshaping_0.3.7           recipes_1.0.8              
## [115] openssl_2.1.1               Rphenograph_0.99.1         
## [117] TTR_0.24.3                  bslib_0.5.1                
## [119] e1071_1.7-13                destiny_3.14.0             
## [121] GetoptLong_1.0.5            ggplot.multistats_1.0.0    
## [123] mime_0.12                   splines_4.3.1              
## [125] circlize_0.4.15             Rcpp_1.0.11                
## [127] sparseMatrixStats_1.12.2    cellranger_1.1.0           
## [129] knitr_1.44                  utf8_1.2.4                 
## [131] clue_0.3-65                 lme4_1.1-35.1              
## [133] fs_1.6.3                    listenv_0.9.0              
## [135] checkmate_2.3.0             DelayedMatrixStats_1.22.6  
## [137] pkgbuild_1.4.2              ggsignif_0.6.4             
## [139] tibble_3.2.1                Matrix_1.6-1.1             
## [141] rpart.plot_3.1.1            callr_3.7.3                
## [143] tzdb_0.4.0                  tweenr_2.0.2               
## [145] pkgconfig_2.0.3             pheatmap_1.0.12            
## [147] tools_4.3.1                 cachem_1.0.8               
## [149] smoother_1.1                fastmap_1.1.1              
## [151] rmarkdown_2.25              scales_1.2.1               
## [153] grid_4.3.1                  usethis_2.2.2              
## [155] broom_1.0.5                 sass_0.4.7                 
## [157] graph_1.78.0                carData_3.0-5              
## [159] RANN_2.6.1                  rpart_4.1.21               
## [161] farver_2.1.1                yaml_2.3.7                 
## [163] MatrixGenerics_1.12.3       foreign_0.8-85             
## [165] ggthemes_4.2.4              cli_3.6.1                  
## [167] purrr_1.0.2                 stats4_4.3.1               
## [169] lifecycle_1.0.3             uwot_0.1.16                
## [171] askpass_1.2.0               caret_6.0-94               
## [173] Biobase_2.60.0              mvtnorm_1.2-3              
## [175] lava_1.7.3                  sessioninfo_1.2.2          
## [177] backports_1.4.1             cytolib_2.12.1             
## [179] timechange_0.2.0            gtable_0.3.4               
## [181] rjson_0.2.21                umap_0.2.10.0              
## [183] ggridges_0.5.4              parallel_4.3.1             
## [185] pROC_1.18.5                 limma_3.56.2               
## [187] jsonlite_1.8.7              edgeR_3.42.4               
## [189] RcppHNSW_0.5.0              bitops_1.0-7               
## [191] ggplot2_3.4.4               Rtsne_0.16                 
## [193] FlowSOM_2.8.0               ranger_0.16.0              
## [195] flowCore_2.12.2             jquerylib_0.1.4            
## [197] timeDate_4022.108           shiny_1.7.5.1              
## [199] ConsensusClusterPlus_1.64.0 htmltools_0.5.6.1          
## [201] diffcyt_1.20.0              glue_1.6.2                 
## [203] XVector_0.40.0              VIM_6.2.2                  
## [205] RCurl_1.98-1.13             rprojroot_2.0.3            
## [207] gridExtra_2.3               boot_1.3-28.1              
## [209] TrajectoryUtils_1.8.0       igraph_1.5.1               
## [211] R6_2.5.1                    tidyr_1.3.0                
## [213] SingleCellExperiment_1.22.0 labeling_0.4.3             
## [215] vcd_1.4-11                  cluster_2.1.4              
## [217] pkgload_1.3.3               GenomeInfoDb_1.36.4        
## [219] ipred_0.9-14                nloptr_2.0.3               
## [221] DelayedArray_0.26.7         tidyselect_1.2.0           
## [223] vipor_0.4.5                 htmlTable_2.4.2            
## [225] ggforce_0.4.1               CytoDx_1.20.0              
## [227] car_3.1-2                   future_1.33.0              
## [229] ModelMetrics_1.2.2.2        munsell_0.5.0              
## [231] laeken_0.5.2                data.table_1.14.8          
## [233] htmlwidgets_1.6.2           ComplexHeatmap_2.16.0      
## [235] RColorBrewer_1.1-3          rlang_1.1.1                
## [237] remotes_2.4.2.1             colorRamps_2.3.1           
## [239] Cairo_1.6-1                 ggnewscale_0.4.9           
## [241] fansi_1.0.5                 hardhat_1.3.0              
## [243] beeswarm_0.4.0              prodlim_2023.08.28