run cellchat scRNAseq data human LN
Load packages
## load packages
suppressPackageStartupMessages({
library(dplyr)
library(reshape2)
library(ggplot2)
library(purrr)
library(Seurat)
library(tidyverse)
library(ggpubr)
library(runSeurat3)
library(here)
library(ggsci)
library(pheatmap)
library(scater)
library(SingleCellExperiment)
library(scran)
library(CellChat)
library(patchwork)
library(ComplexHeatmap)
})
load seurat object
<- here()
basedir
<- readRDS(file= paste0(basedir,
seuratFRC "/data/AllPatWithoutCM_FRConly_intOrig",
"_seurat.rds"))
<- readRDS(file= paste0(basedir,
seuratIMM "/data/AllPatWithoutCM_IMMMerged_integrated_label",
"_seurat.rds"))
## add label FRCs
$label <- "medRCIFRC"
seuratFRC$label[which(seuratFRC$intCluster == "7")] <- "BRC"
seuratFRC$label[which(seuratFRC$intCluster == "2")] <- "TRC"
seuratFRC$label[which(seuratFRC$intCluster == "3")] <- "ACTA2+PRC"
seuratFRC$label[which(seuratFRC$intCluster == "4")] <- "VSMC"
seuratFRC$label[which(seuratFRC$intCluster == "5")] <- "PI16+RC"
seuratFRC$label[which(seuratFRC$intCluster == "6")] <- "PRC1"
seuratFRC
$cond2 <- seuratFRC$cond
seuratFRC$cond2[which(seuratFRC$cond %in% c("acute", "chronic"))] <- "activated"
seuratFRC
## group imm cells
$label2 <- seuratIMM$label
seuratIMM$label <- as.character(seuratIMM$label)
seuratIMM$label[which(seuratIMM$label %in% c("naiveCD4-2", "naiveCD4-3",
seuratIMM"naiveCD4-1", "Treg" ))] <- "CD4T"
$label[which(seuratIMM$label %in% c("pDC-2", "pDC-1" ))] <- "pDC"
seuratIMM$label[which(seuratIMM$label %in% c("naiveB", "preB" ))] <- "naiveB"
seuratIMM
<- merge(seuratFRC, c(seuratIMM))
seurat $label_plus_cond <- paste0(seurat$label, "_", seurat$cond2)
seurattable(seurat$label_plus_cond)
ACTA2+PRC_activated ACTA2+PRC_resting BRC_activated BRC_resting
4244 1560 1487 390
CD4T_activated CD4T_resting CD8Tcm_activated CD8Tcm_resting
38543 39380 6234 4006
CTL/NKcell_activated CTL/NKcell_resting GCB_activated GCB_resting
4129 10339 687 869
ILC3_activated ILC3_resting MBC_activated MBC_resting
79 1819 10732 17174
medRCIFRC_activated medRCIFRC_resting Mph/DC-1_activated Mph/DC-1_resting
10342 10129 118 2952
Mph/DC-2_activated Mph/DC-2_resting naiveB_activated naiveB_resting
157 980 8295 14118
pDC_activated pDC_resting PI16+RC_activated PI16+RC_resting
558 6750 1917 986
plasmaCell_activated plasmaCell_resting PRC1_activated PRC1_resting
53 326 1528 760
TRC_activated TRC_resting VSMC_activated VSMC_resting
3164 3773 2767 724
Idents(seurat) <- seurat$label_plus_cond
<- subset(x = seurat, downsample = 500)
seurat table(seurat$label_plus_cond)
ACTA2+PRC_activated ACTA2+PRC_resting BRC_activated BRC_resting
500 500 500 390
CD4T_activated CD4T_resting CD8Tcm_activated CD8Tcm_resting
500 500 500 500
CTL/NKcell_activated CTL/NKcell_resting GCB_activated GCB_resting
500 500 500 500
ILC3_activated ILC3_resting MBC_activated MBC_resting
79 500 500 500
medRCIFRC_activated medRCIFRC_resting Mph/DC-1_activated Mph/DC-1_resting
500 500 118 500
Mph/DC-2_activated Mph/DC-2_resting naiveB_activated naiveB_resting
157 500 500 500
pDC_activated pDC_resting PI16+RC_activated PI16+RC_resting
500 500 500 500
plasmaCell_activated plasmaCell_resting PRC1_activated PRC1_resting
53 326 500 500
TRC_activated TRC_resting VSMC_activated VSMC_resting
500 500 500 500
table(seurat$patient)
P_20200220 P_20200722 P_20200909 P_20210113 P_20210224 P_20220201 P_20220202 ucd010 ucd13
1482 600 1282 1925 1474 2251 2658 1939 1046
ucd14
1466
dim(seurat)
[1] 39642 16123
remove(seuratIMM, seuratFRC)
<- NormalizeData(object = seurat)
seurat <- FindVariableFeatures(object = seurat)
seurat <- ScaleData(object = seurat, verbose = FALSE)
seurat <- RunPCA(object = seurat, npcs = 30, verbose = FALSE)
seurat <- RunTSNE(object = seurat, reduction = "pca", dims = 1:20)
seurat <- RunUMAP(object = seurat, reduction = "pca", dims = 1:20) seurat
set color palettes
<- c("#800000FF", "#FFA319FF","#8A9045FF", "#155F83FF",
colFRC "#C16622FF", "#6692a3", "#3b7f60")
names(colFRC) <- c("medRCIFRC", "TRC", "ACTA2+PRC", "VSMC", "PI16+RC", "PRC1",
"BRC")
<- c("#0b6647", "#54907e", "#94c78a", "#6f9568",
colImm "#8f2810", "#d0ac21","#9e9f0b", "#486584",
"#4b5397", "#8873d3", "#6e3e7a")
names(colImm) <- c("naiveB", "GCB", "MBC", "plasmaCell",
"CD4T", "CD8Tcm", "CTL/NKcell", "ILC3", "pDC",
"Mph/DC-1", "Mph/DC-2" )
<- c(colFRC, colImm)
colAll
<- c(pal_uchicago()(6), "#6692a3", "#3b7f60")
colPal names(colPal) <- c("0", "1", "2", "3", "4", "5", "6", "7")
<- c(pal_nejm()(7),pal_futurama()(12))[1:length(unique(seurat$patient))]
colPat names(colPat) <- unique(seurat$patient)
<- c("#6692a3","#971c1c","#d17d67")
colCond names(colCond) <- unique(seurat$cond)
<- pal_npg()(length(unique(seurat$origin)))
colOri names(colOri) <- unique(seurat$origin)
<- c("#6692a3","#971c1c")
colCond2 names(colCond2) <- c("resting", "activated")
visualize data
label
DimPlot(seurat, reduction = "umap", cols=colAll, group.by = "label")+
theme_bw() +
theme(axis.text = element_blank(), axis.ticks = element_blank(),
panel.grid.minor = element_blank()) +
xlab("UMAP1") +
ylab("UMAP2")
patient
## visualize input data
DimPlot(seurat, reduction = "umap", cols=colPat, group.by = "patient")+
theme_bw() +
theme(axis.text = element_blank(), axis.ticks = element_blank(),
panel.grid.minor = element_blank()) +
xlab("UMAP1") +
ylab("UMAP2")
cond2
## visualize input data
DimPlot(seurat, reduction = "umap", cols=colCond2, group.by = "cond2")+
theme_bw() +
theme(axis.text = element_blank(), axis.ticks = element_blank(),
panel.grid.minor = element_blank()) +
xlab("UMAP1") +
ylab("UMAP2")
origin
## visualize input data
DimPlot(seurat, reduction = "umap", cols=colOri, group.by = "origin")+
theme_bw() +
theme(axis.text = element_blank(), axis.ticks = element_blank(),
panel.grid.minor = element_blank()) +
xlab("UMAP1") +
ylab("UMAP2")
cellchat analysis
create cellchat object
::plan("multisession", workers = 4)
future
### --------------- resting LNs ----------------- ###
<- subset(seurat, cond2 == "resting")
seurat.res <- seurat.res@assays$RNA$data
data.inp.res rownames(data.inp.res) <- gsub(".*\\.", "", rownames(data.inp.res))
<- createCellChat(object = data.inp.res, meta = seurat.res@meta.data,
cellchat.res group.by = "label")
[1] "Create a CellChat object from a data matrix"
Set cell identities for the new CellChat object
The cell groups used for CellChat analysis are ACTA2+PRC BRC CD4T CD8Tcm CTL/NKcell GCB ILC3 MBC medRCIFRC Mph/DC-1 Mph/DC-2 naiveB pDC PI16+RC plasmaCell PRC1 TRC VSMC
<- CellChatDB.human
CellChatDB @DB <- CellChatDB
cellchat.res
## preprocessing
<- CellChat::subsetData(cellchat.res)
cellchat.res <- identifyOverExpressedGenes(cellchat.res)
cellchat.res <- identifyOverExpressedInteractions(cellchat.res)
cellchat.res
### --------------- activated LNs ----------------- ###
<- subset(seurat, cond2 == "activated")
seurat.act <- seurat.act@assays$RNA$data
data.inp.act rownames(data.inp.act) <- gsub(".*\\.", "", rownames(data.inp.act))
<- createCellChat(object = data.inp.act, meta = seurat.act@meta.data,
cellchat.act group.by = "label")
[1] "Create a CellChat object from a data matrix"
Set cell identities for the new CellChat object
The cell groups used for CellChat analysis are ACTA2+PRC BRC CD4T CD8Tcm CTL/NKcell GCB ILC3 MBC medRCIFRC Mph/DC-1 Mph/DC-2 naiveB pDC PI16+RC plasmaCell PRC1 TRC VSMC
@DB <- CellChatDB
cellchat.act
## preprocessing
<- CellChat::subsetData(cellchat.act)
cellchat.act <- identifyOverExpressedGenes(cellchat.act)
cellchat.act <- identifyOverExpressedInteractions(cellchat.act) cellchat.act
compute communication probability res
<- computeCommunProb(cellchat.res, type = "truncatedMean") cellchat.res
truncatedMean is used for calculating the average gene expression per cell group.
[1] ">>> Run CellChat on sc/snRNA-seq data <<< [2024-03-13 22:35:11.748377]"
[1] ">>> CellChat inference is done. Parameter values are stored in `object@options$parameter` <<< [2024-03-13 22:57:18.652009]"
<- filterCommunication(cellchat.res, min.cells = 10)
cellchat.res <- computeCommunProbPathway(cellchat.res)
cellchat.res
<- subsetCommunication(cellchat.res,
df.net.res sources.use = c("PI16+RC", "PRC1", "ACTA2+PRC"),
targets.use = c("CD4T", "CTL/NKcell", "GCB",
"ILC3", "naiveB", "MBC",
"plasmaCell", "CD8Tcm",
"Mph/DC-1", "Mph/DC-2"))
<- subsetCommunication(cellchat.res, sources.use = c("CD4T", "CTL/NKcell",
df.net2.res "GCB",
"ILC3", "naiveB", "MBC",
"plasmaCell", "CD8Tcm",
"Mph/DC-1", "Mph/DC-2"),
targets.use = c("PI16+RC", "PRC1", "ACTA2+PRC"))
<- aggregateNet(cellchat.res)
cellchat.res <- netAnalysis_computeCentrality(cellchat.res, slot.name = "netP") cellchat.res
vis int partner rest
<- as.numeric(table(cellchat.res@idents))
groupSize <- cellchat.res@net$weight
matPre <- matPre[names(colAll), names(colAll)]
mat for (i in 1:nrow(mat)) {
<- matrix(0, nrow = nrow(mat), ncol = ncol(mat), dimnames = dimnames(mat))
mat2 <- mat[i, ]
mat2[i, ] netVisual_circle(mat2, vertex.weight = groupSize, weight.scale = T,
edge.weight.max = max(mat), title.name = rownames(mat)[i],
color.use = colAll)
}
compute communication probability act
<- computeCommunProb(cellchat.act, type = "truncatedMean") cellchat.act
truncatedMean is used for calculating the average gene expression per cell group.
[1] ">>> Run CellChat on sc/snRNA-seq data <<< [2024-03-13 22:57:25.050967]"
[1] ">>> CellChat inference is done. Parameter values are stored in `object@options$parameter` <<< [2024-03-13 23:08:37.2176]"
<- filterCommunication(cellchat.act, min.cells = 10)
cellchat.act <- computeCommunProbPathway(cellchat.act)
cellchat.act
<- subsetCommunication(cellchat.act,
df.net.act sources.use = c("PI16+RC", "PRC1", "ACTA2+PRC"),
targets.use = c("CD4T", "CTL/NKcell", "GCB",
"ILC3", "naiveB", "MBC",
"plasmaCell", "CD8Tcm" ,
"Mph/DC-1", "Mph/DC-2"))
<- subsetCommunication(cellchat.act, sources.use = c("CD4T",
df.net2.act "CTL/NKcell",
"GCB",
"ILC3", "naiveB", "MBC",
"plasmaCell", "CD8Tcm",
"Mph/DC-1", "Mph/DC-2"),
targets.use = c("PI16+RC", "PRC1", "ACTA2+PRC"))
<- aggregateNet(cellchat.act)
cellchat.act <- netAnalysis_computeCentrality(cellchat.act, slot.name = "netP") cellchat.act
vis int partner act
<- as.numeric(table(cellchat.act@idents))
groupSize <- cellchat.act@net$weight
matPre <- matPre[names(colAll), names(colAll)]
mat for (i in 1:nrow(mat)) {
<- matrix(0, nrow = nrow(mat), ncol = ncol(mat), dimnames = dimnames(mat))
mat2 <- mat[i, ]
mat2[i, ] netVisual_circle(mat2, vertex.weight = groupSize, weight.scale = T,
edge.weight.max = max(mat), title.name = rownames(mat)[i],
color.use = colAll)
}
compare interaction counts/strength
<- list(act = cellchat.act, res = cellchat.res)
object.list <- mergeCellChat(object.list, add.names = names(object.list))
cellchat.merge
<- colCond2
colCond3 names(colCond3) <- c("res", "act")
<- compareInteractions(cellchat.merge, show.legend = F,
gg1 group = c("act","res")) +
scale_fill_manual(values = colCond3)
<- compareInteractions(cellchat.merge, show.legend = F,
gg2 group = c("act","res"), measure = "weight") +
scale_fill_manual(values = colCond3)
+ gg2 gg1
netVisual_diffInteraction(cellchat.merge, weight.scale = T)
netVisual_diffInteraction(cellchat.merge, weight.scale = T, measure = "weight")
<- netVisual_heatmap(cellchat.merge)
gg1 <- netVisual_heatmap(cellchat.merge, measure = "weight")
gg2 + gg2 gg1
<- getMaxWeight(object.list, attribute = c("idents","count"))
weight.max par(mfrow = c(1,2), xpd=TRUE)
for (i in 1:length(object.list)) {
netVisual_circle(object.list[[i]]@net$count, weight.scale = T, label.edge= F,
edge.weight.max = weight.max[2], edge.width.max = 12,
title.name = paste0("Number of interactions - ",
names(object.list)[i]))
}
comp int cnt/strength subsets
########### ------------ PI16+RC ------------------- #############
<- c(rep("PI16+RC", 3), rep("CD4T", 3), rep("CTL/NKcell", 3),
group.cellType rep("Mph/DC-2", 3), rep("CD8Tcm", 3))
<- factor(group.cellType, levels = c("PI16+RC", "CD4T",
group.cellType "CTL/NKcell", "Mph/DC-2",
"CD8Tcm"))
<- lapply(object.list, function(x) {
object.list.sub mergeInteractions(x, group.cellType)})
<- mergeCellChat(object.list.sub,
cellchat.sub add.names = names(object.list.sub))
<- getMaxWeight(object.list.sub,
weight.max slot.name = c("idents", "net", "net"),
attribute = c("idents","count", "count.merged"))
par(mfrow = c(1,2), xpd=TRUE)
for (i in 1:length(object.list.sub)) {
netVisual_circle(object.list.sub[[i]]@net$count.merged, weight.scale = T,
label.edge= T, edge.weight.max = weight.max[3],
edge.width.max = 12,
title.name = paste0("Number of interactions - ",
names(object.list.sub)[i]))
}
<- c(rep("PI16+RC", 3), rep("GCB", 3), rep("MBC", 3),
group.cellType rep("naiveB", 3), rep("plasmaCell", 3))
<- factor(group.cellType, levels = c("PI16+RC","GCB", "naiveB",
group.cellType "MBC", "plasmaCell"))
<- lapply(object.list, function(x) {
object.list.sub mergeInteractions(x, group.cellType)
})<- mergeCellChat(object.list.sub,
cellchat.sub add.names = names(object.list.sub))
<- getMaxWeight(object.list.sub,
weight.max slot.name = c("idents", "net", "net"),
attribute = c("idents","count", "count.merged"))
par(mfrow = c(1,2), xpd=TRUE)
for (i in 1:length(object.list.sub)) {
netVisual_circle(object.list.sub[[i]]@net$count.merged, weight.scale = T,
label.edge= T, edge.weight.max = weight.max[3],
edge.width.max = 12,
title.name = paste0("Number of interactions - ",
names(object.list.sub)[i]))
}
<- c(rep("PI16+RC", 4), rep("ILC3", 4), rep("Mph/DC-1", 4))
group.cellType <- factor(group.cellType, levels = c("PI16+RC", "ILC3",
group.cellType "Mph/DC-1"))
<- lapply(object.list, function(x) {
object.list.sub mergeInteractions(x, group.cellType)
})<- mergeCellChat(object.list.sub,
cellchat.sub add.names = names(object.list.sub))
<- getMaxWeight(object.list.sub,
weight.max slot.name = c("idents", "net", "net"),
attribute = c("idents","count", "count.merged"))
par(mfrow = c(1,2), xpd=TRUE)
for (i in 1:length(object.list.sub)) {
netVisual_circle(object.list.sub[[i]]@net$count.merged, weight.scale = T,
label.edge= T, edge.weight.max = weight.max[3],
edge.width.max = 12,
title.name = paste0("Number of interactions - ",
names(object.list.sub)[i]))
}
########### ------------ PRC1 ------------------- #############
<- c(rep("PRC1", 3), rep("CD4T", 3), rep("CTL/NKcell", 3),
group.cellType rep("Mph/DC-2", 3), rep("CD8Tcm", 3))
<- factor(group.cellType, levels = c("PRC1", "CD4T",
group.cellType "CTL/NKcell","Mph/DC-2",
"CD8Tcm"))
<- lapply(object.list, function(x) {
object.list.sub mergeInteractions(x, group.cellType)})
<- mergeCellChat(object.list.sub,
cellchat.sub add.names = names(object.list.sub))
<- getMaxWeight(object.list.sub,
weight.max slot.name = c("idents", "net", "net"),
attribute = c("idents","count", "count.merged"))
par(mfrow = c(1,2), xpd=TRUE)
for (i in 1:length(object.list.sub)) {
netVisual_circle(object.list.sub[[i]]@net$count.merged, weight.scale = T,
label.edge= T, edge.weight.max = weight.max[3],
edge.width.max = 12,
title.name = paste0("Number of interactions - ",
names(object.list.sub)[i]))
}
<- c(rep("PRC1", 3), rep("GCB", 3), rep("MBC", 3),
group.cellType rep("naiveB", 3), rep("plasmaCell", 3))
<- factor(group.cellType, levels = c("PRC1","GCB", "naiveB",
group.cellType "MBC", "plasmaCell"))
<- lapply(object.list, function(x) {
object.list.sub mergeInteractions(x, group.cellType)
})<- mergeCellChat(object.list.sub,
cellchat.sub add.names = names(object.list.sub))
<- getMaxWeight(object.list.sub,
weight.max slot.name = c("idents", "net", "net"),
attribute = c("idents","count", "count.merged"))
par(mfrow = c(1,2), xpd=TRUE)
for (i in 1:length(object.list.sub)) {
netVisual_circle(object.list.sub[[i]]@net$count.merged, weight.scale = T,
label.edge= T, edge.weight.max = weight.max[3],
edge.width.max = 12,
title.name = paste0("Number of interactions - ",
names(object.list.sub)[i]))
}
<- c(rep("PRC1", 4), rep("ILC3", 4), rep("Mph/DC-1", 4))
group.cellType <- factor(group.cellType, levels = c("PRC1", "ILC3", "Mph/DC-1"))
group.cellType
<- lapply(object.list, function(x) {
object.list.sub mergeInteractions(x, group.cellType)
})<- mergeCellChat(object.list.sub,
cellchat.sub add.names = names(object.list.sub))
<- getMaxWeight(object.list.sub,
weight.max slot.name = c("idents", "net", "net"),
attribute = c("idents","count", "count.merged"))
par(mfrow = c(1,2), xpd=TRUE)
for (i in 1:length(object.list.sub)) {
netVisual_circle(object.list.sub[[i]]@net$count.merged, weight.scale = T,
label.edge= T, edge.weight.max = weight.max[3],
edge.width.max = 12,
title.name = paste0("Number of interactions - ",
names(object.list.sub)[i]))
}
########### ------------ PRC1 ------------------- #############
<- c(rep("PRC1", 3), rep("CD4T", 3), rep("CTL/NKcell", 3),
group.cellType rep("Mph/DC-2", 3), rep("CD8Tcm", 3))
<- factor(group.cellType, levels = c("PRC1", "CD4T",
group.cellType "CTL/NKcell","Mph/DC-2",
"CD8Tcm"))
<- lapply(object.list, function(x) {
object.list.sub mergeInteractions(x, group.cellType)})
<- mergeCellChat(object.list.sub,
cellchat.sub add.names = names(object.list.sub))
<- getMaxWeight(object.list.sub,
weight.max slot.name = c("idents", "net", "net"),
attribute = c("idents","count", "count.merged"))
par(mfrow = c(1,2), xpd=TRUE)
for (i in 1:length(object.list.sub)) {
netVisual_circle(object.list.sub[[i]]@net$count.merged, weight.scale = T,
label.edge= T, edge.weight.max = weight.max[3],
edge.width.max = 12,
title.name = paste0("Number of interactions - ",
names(object.list.sub)[i]))
}
<- c(rep("PRC1", 3), rep("GCB", 3), rep("MBC", 3),
group.cellType rep("naiveB", 3), rep("plasmaCell", 3))
<- factor(group.cellType, levels = c("PRC1","GCB", "naiveB",
group.cellType "MBC", "plasmaCell"))
<- lapply(object.list, function(x) {
object.list.sub mergeInteractions(x, group.cellType)
})<- mergeCellChat(object.list.sub,
cellchat.sub add.names = names(object.list.sub))
<- getMaxWeight(object.list.sub,
weight.max slot.name = c("idents", "net", "net"),
attribute = c("idents","count", "count.merged"))
par(mfrow = c(1,2), xpd=TRUE)
for (i in 1:length(object.list.sub)) {
netVisual_circle(object.list.sub[[i]]@net$count.merged, weight.scale = T,
label.edge= T, edge.weight.max = weight.max[3],
edge.width.max = 12,
title.name = paste0("Number of interactions - ",
names(object.list.sub)[i]))
}
<- c(rep("PRC1", 4), rep("ILC3", 4), rep("Mph/DC-1", 4))
group.cellType <- factor(group.cellType, levels = c("PRC1", "ILC3", "Mph/DC-1"))
group.cellType
<- lapply(object.list, function(x) {
object.list.sub mergeInteractions(x, group.cellType)
})<- mergeCellChat(object.list.sub,
cellchat.sub add.names = names(object.list.sub))
<- getMaxWeight(object.list.sub,
weight.max slot.name = c("idents", "net", "net"),
attribute = c("idents","count", "count.merged"))
par(mfrow = c(1,2), xpd=TRUE)
for (i in 1:length(object.list.sub)) {
netVisual_circle(object.list.sub[[i]]@net$count.merged, weight.scale = T,
label.edge= T, edge.weight.max = weight.max[3],
edge.width.max = 12,
title.name = paste0("Number of interactions - ",
names(object.list.sub)[i]))
}
########### ------------ ACTA2+PRC ------------------- #############
<- c(rep("ACTA2+PRC", 3), rep("CD4T", 3), rep("CTL/NKcell", 3),
group.cellType rep("Mph/DC-2", 3), rep("CD8Tcm", 3))
<- factor(group.cellType, levels = c("ACTA2+PRC", "CD4T",
group.cellType "CTL/NKcell","Mph/DC-2",
"CD8Tcm"))
<- lapply(object.list, function(x) {
object.list.sub mergeInteractions(x, group.cellType)})
<- mergeCellChat(object.list.sub,
cellchat.sub add.names = names(object.list.sub))
<- getMaxWeight(object.list.sub,
weight.max slot.name = c("idents", "net", "net"),
attribute = c("idents","count", "count.merged"))
par(mfrow = c(1,2), xpd=TRUE)
for (i in 1:length(object.list.sub)) {
netVisual_circle(object.list.sub[[i]]@net$count.merged, weight.scale = T,
label.edge= T, edge.weight.max = weight.max[3],
edge.width.max = 12,
title.name = paste0("Number of interactions - ",
names(object.list.sub)[i]))
}
<- c(rep("ACTA2+PRC", 3), rep("GCB", 3), rep("MBC", 3),
group.cellType rep("naiveB", 3), rep("plasmaCell", 3))
<- factor(group.cellType, levels = c("ACTA2+PRC","GCB", "naiveB",
group.cellType "MBC", "plasmaCell"))
<- lapply(object.list, function(x) {
object.list.sub mergeInteractions(x, group.cellType)
})<- mergeCellChat(object.list.sub,
cellchat.sub add.names = names(object.list.sub))
<- getMaxWeight(object.list.sub,
weight.max slot.name = c("idents", "net", "net"),
attribute = c("idents","count", "count.merged"))
par(mfrow = c(1,2), xpd=TRUE)
for (i in 1:length(object.list.sub)) {
netVisual_circle(object.list.sub[[i]]@net$count.merged, weight.scale = T,
label.edge= T, edge.weight.max = weight.max[3],
edge.width.max = 12,
title.name = paste0("Number of interactions - ",
names(object.list.sub)[i]))
}
<- c(rep("ACTA2+PRC", 4), rep("ILC3", 4), rep("Mph/DC-1", 4))
group.cellType <- factor(group.cellType, levels = c("ACTA2+PRC", "ILC3",
group.cellType "Mph/DC-1"))
<- lapply(object.list, function(x) {
object.list.sub mergeInteractions(x, group.cellType)
})<- mergeCellChat(object.list.sub,
cellchat.sub add.names = names(object.list.sub))
<- getMaxWeight(object.list.sub,
weight.max slot.name = c("idents", "net", "net"),
attribute = c("idents","count", "count.merged"))
par(mfrow = c(1,2), xpd=TRUE)
for (i in 1:length(object.list.sub)) {
netVisual_circle(object.list.sub[[i]]@net$count.merged, weight.scale = T,
label.edge= T, edge.weight.max = weight.max[3],
edge.width.max = 12,
title.name = paste0("Number of interactions - ",
names(object.list.sub)[i]))
}
changes in signaling of subsets
<- sapply(object.list, function(x) {rowSums(x@net$count) +
num.link colSums(x@net$count)-diag(x@net$count)})
<- c(min(num.link), max(num.link))
weight.MinMax
<- list()
gg for (i in 1:length(object.list)) {
<- netAnalysis_signalingRole_scatter(object.list[[i]],
gg[[i]] title = names(object.list)[i], weight.MinMax = weight.MinMax)
}::wrap_plots(plots = gg) patchwork
<- netAnalysis_signalingChanges_scatter(cellchat.merge,
gg1 idents.use = "PI16+RC")
<- netAnalysis_signalingChanges_scatter(cellchat.merge,
gg2 idents.use = "PRC1")
<- netAnalysis_signalingChanges_scatter(cellchat.merge,
gg3 idents.use = "ACTA2+PRC")
gg1
gg2
gg3
signaling pathways between cond
<- computeNetSimilarityPairwise(cellchat.merge, type = "functional") cellchat.merge
Compute signaling network similarity for datasets 1 2
<- netEmbedding(cellchat.merge, type = "functional", umap.method = "uwot") cellchat.merge
Manifold learning of the signaling networks for datasets 1 2
<- netClustering(cellchat.merge, type = "functional", do.parallel = F) cellchat.merge
Classification learning of the signaling networks for datasets 1 2
netVisual_embeddingPairwise(cellchat.merge, type = "functional", label.size = 2,
top.label=100)
2D visualization of signaling networks from datasets 1 2
<- computeNetSimilarityPairwise(cellchat.merge, type = "structural") cellchat.merge
Compute signaling network similarity for datasets 1 2
<- netEmbedding(cellchat.merge, type = "structural", umap.method = "uwot") cellchat.merge
Manifold learning of the signaling networks for datasets 1 2
<- netClustering(cellchat.merge, type = "structural", do.parallel = F) cellchat.merge
Classification learning of the signaling networks for datasets 1 2
netVisual_embeddingPairwise(cellchat.merge, type = "structural", label.size = 2)
2D visualization of signaling networks from datasets 1 2
rankSimilarity(cellchat.merge, type = "functional")
Compute the distance of signaling networks between datasets 1 2
diff usage of PW
<- rankNet(cellchat.merge, mode = "comparison", stacked = T, do.stat = TRUE)
gg1 <- rankNet(cellchat.merge, mode = "comparison", stacked = F, do.stat = TRUE)
gg2 gg1
gg2
in out signalling
= 1
i <- union(object.list[[i]]@netP$pathways, object.list[[i+1]]@netP$pathways)
pathway.union = netAnalysis_signalingRole_heatmap(object.list[[i]], pattern = "outgoing", signaling = pathway.union, title = names(object.list)[i], width = 12, height = 26)
ht1 = netAnalysis_signalingRole_heatmap(object.list[[i+1]], pattern = "outgoing", signaling = pathway.union, title = names(object.list)[i+1], width = 12, height = 26)
ht2 draw(ht1 + ht2, ht_gap = unit(0.5, "cm"))
= netAnalysis_signalingRole_heatmap(object.list[[i]], pattern = "incoming", signaling = pathway.union, title = names(object.list)[i], width = 12, height = 26, color.heatmap = "GnBu")
ht1 = netAnalysis_signalingRole_heatmap(object.list[[i+1]], pattern = "incoming", signaling = pathway.union, title = names(object.list)[i+1], width = 12, height = 26, color.heatmap = "GnBu")
ht2 draw(ht1 + ht2, ht_gap = unit(0.5, "cm"))
R L pairs
vis exp of RL pairs
netVisual_bubble(cellchat.merge, sources.use = "PI16+RC",
targets.use = c("CD4T", "CTL/NKcell", "GCB", "ILC3",
"naiveB", "MBC", "plasmaCell", "CD8Tcm",
"Mph/DC-1", "Mph/DC-2"),
comparison = c(1, 2), angle.x = 45)
netVisual_bubble(cellchat.merge, sources.use = c("CD4T", "CTL/NKcell", "GCB", "ILC3",
"naiveB", "MBC", "plasmaCell", "CD8Tcm",
"Mph/DC-1", "Mph/DC-2"),
targets.use = "PI16+RC",
comparison = c(1, 2), angle.x = 45)
netVisual_bubble(cellchat.merge, sources.use = "PRC1",
targets.use = c("CD4T", "CTL/NKcell", "GCB", "ILC3",
"naiveB", "MBC", "plasmaCell", "CD8Tcm",
"Mph/DC-1", "Mph/DC-2"),
comparison = c(1, 2), angle.x = 45)
netVisual_bubble(cellchat.merge, sources.use = c("CD4T", "CTL/NKcell", "GCB", "ILC3",
"naiveB", "MBC", "plasmaCell", "CD8Tcm",
"Mph/DC-1", "Mph/DC-2"),
targets.use = "PRC1",
comparison = c(1, 2), angle.x = 45)
netVisual_bubble(cellchat.merge, sources.use = "ACTA2+PRC",
targets.use = c("CD4T", "CTL/NKcell", "GCB", "ILC3",
"naiveB", "MBC", "plasmaCell", "CD8Tcm",
"Mph/DC-1", "Mph/DC-2"),
comparison = c(1, 2), angle.x = 45)
netVisual_bubble(cellchat.merge, sources.use = c("CD4T", "CTL/NKcell", "GCB", "ILC3",
"naiveB", "MBC", "plasmaCell", "CD8Tcm",
"Mph/DC-1", "Mph/DC-2"),
targets.use = "ACTA2+PRC",
comparison = c(1, 2), angle.x = 45)
vis exp of diff RL pairs
##### ----------------- FRC to immune cells ------------------- ######
<- netVisual_bubble(cellchat.merge, sources.use = "PI16+RC",
gg1 targets.use = c("CD4T", "CTL/NKcell", "GCB", "ILC3",
"naiveB", "MBC", "plasmaCell", "CD8Tcm",
"Mph/DC-1", "Mph/DC-2"),
comparison = c(1, 2), max.dataset = 2,
title.name = "Increased signaling in resting", angle.x = 45,
remove.isolate = T)
<- netVisual_bubble(cellchat.merge, sources.use = "PI16+RC",
gg2 targets.use = c("CD4T", "CTL/NKcell", "GCB", "ILC3",
"naiveB", "MBC", "plasmaCell", "CD8Tcm",
"Mph/DC-1", "Mph/DC-2"),
comparison = c(1, 2), max.dataset = 1,
title.name = "Increased signaling in activated", angle.x = 45,
remove.isolate = T)
+ gg2 gg1
<- netVisual_bubble(cellchat.merge, sources.use = "PRC1",
gg1 targets.use = c("CD4T", "CTL/NKcell", "GCB", "ILC3",
"naiveB", "MBC", "plasmaCell", "CD8Tcm",
"Mph/DC-1", "Mph/DC-2"),
comparison = c(1, 2), max.dataset = 2,
title.name = "Increased signaling in resting", angle.x = 45,
remove.isolate = T)
<- netVisual_bubble(cellchat.merge, sources.use = "PRC1",
gg2 targets.use = c("CD4T", "CTL/NKcell", "GCB", "ILC3",
"naiveB", "MBC", "plasmaCell", "CD8Tcm",
"Mph/DC-1", "Mph/DC-2"),
comparison = c(1, 2), max.dataset = 1,
title.name = "Increased signaling in activated", angle.x = 45,
remove.isolate = T)
+ gg2 gg1
<- netVisual_bubble(cellchat.merge, sources.use = "ACTA2+PRC",
gg1 targets.use = c("CD4T", "CTL/NKcell", "GCB", "ILC3",
"naiveB", "MBC", "plasmaCell", "CD8Tcm",
"Mph/DC-1", "Mph/DC-2"),
comparison = c(1, 2), max.dataset = 2,
title.name = "Increased signaling in resting", angle.x = 45,
remove.isolate = T)
<- netVisual_bubble(cellchat.merge, sources.use = "ACTA2+PRC",
gg2 targets.use = c("CD4T", "CTL/NKcell", "GCB", "ILC3",
"naiveB", "MBC", "plasmaCell", "CD8Tcm",
"Mph/DC-1", "Mph/DC-2"),
comparison = c(1, 2), max.dataset = 1,
title.name = "Increased signaling in activated", angle.x = 45,
remove.isolate = T)
+ gg2 gg1
##### ----------------- Immune cells to FRCs ------------------- ######
<- netVisual_bubble(cellchat.merge, sources.use = c("CD4T", "CTL/NKcell",
gg1 "GCB", "ILC3",
"naiveB", "MBC", "plasmaCell", "CD8Tcm",
"Mph/DC-1", "Mph/DC-2"),
targets.use = "PI16+RC",
comparison = c(1, 2), max.dataset = 2,
title.name = "Increased signaling in resting", angle.x = 45,
remove.isolate = T)
<- netVisual_bubble(cellchat.merge, sources.use = c("CD4T", "CTL/NKcell",
gg2 "GCB", "ILC3",
"naiveB", "MBC", "plasmaCell", "CD8Tcm",
"Mph/DC-1", "Mph/DC-2"),
targets.use = "PI16+RC",
comparison = c(1, 2), max.dataset = 1,
title.name = "Increased signaling in activated", angle.x = 45,
remove.isolate = T)
+ gg2 gg1
<- netVisual_bubble(cellchat.merge, sources.use = c("CD4T", "CTL/NKcell",
gg1 "GCB", "ILC3",
"naiveB", "MBC", "plasmaCell", "CD8Tcm",
"Mph/DC-1", "Mph/DC-2"),
targets.use = "PRC1",
comparison = c(1, 2), max.dataset = 2,
title.name = "Increased signaling in resting", angle.x = 45,
remove.isolate = T)
<- netVisual_bubble(cellchat.merge, sources.use = c("CD4T", "CTL/NKcell",
gg2 "GCB", "ILC3",
"naiveB", "MBC", "plasmaCell", "CD8Tcm",
"Mph/DC-1", "Mph/DC-2"),
targets.use = "PRC1",
comparison = c(1, 2), max.dataset = 1,
title.name = "Increased signaling in activated", angle.x = 45,
remove.isolate = T)
+ gg2 gg1
<- netVisual_bubble(cellchat.merge, sources.use = c("CD4T", "CTL/NKcell",
gg1 "GCB", "ILC3",
"naiveB", "MBC", "plasmaCell", "CD8Tcm",
"Mph/DC-1", "Mph/DC-2"),
targets.use = "ACTA2+PRC",
comparison = c(1, 2), max.dataset = 2,
title.name = "Increased signaling in resting", angle.x = 45,
remove.isolate = T)
<- netVisual_bubble(cellchat.merge, sources.use = c("CD4T", "CTL/NKcell",
gg2 "GCB", "ILC3",
"naiveB", "MBC", "plasmaCell", "CD8Tcm",
"Mph/DC-1", "Mph/DC-2"),
targets.use = "ACTA2+PRC",
comparison = c(1, 2), max.dataset = 1,
title.name = "Increased signaling in activated", angle.x = 45,
remove.isolate = T)
+ gg2 gg1
diff RL pairs based on DE genes
= "act"
pos.dataset = pos.dataset
features.name <- identifyOverExpressedGenes(cellchat.merge,
cellchat.merge group.dataset = "datasets",
pos.dataset = pos.dataset,
features.name = features.name,
only.pos = FALSE, thresh.pc = 0.05,
thresh.fc = 0.05, thresh.p = 1)
<- netMappingDEG(cellchat.merge, features.name = features.name)
net <- subsetCommunication(cellchat.merge, net = net, datasets = "act",
net.up ligand.logFC = 0.05, receptor.logFC = 0.05)
<- subsetCommunication(cellchat.merge, net = net, datasets = "res",
net.down ligand.logFC = -0.05, receptor.logFC = -0.05)
<- extractGeneSubsetFromPair(net.up, cellchat.merge)
gene.up <- extractGeneSubsetFromPair(net.down, cellchat.merge)
gene.down
= net.up[, "interaction_name", drop = F]
pairLR.use.up = net.down[, "interaction_name", drop = F]
pairLR.use.down
##### ----------------- FRCs to immune cells ------------------- ######
<- netVisual_bubble(cellchat.merge, pairLR.use = pairLR.use.up,
gg1 sources.use = "PI16+RC",
targets.use = c("CD4T", "CTL/NKcell", "GCB",
"ILC3", "naiveB", "MBC", "plasmaCell",
"CD8Tcm", "Mph/DC-1", "Mph/DC-2"),
comparison = c(1, 2), angle.x = 90, remove.isolate = T,
title.name = paste0("Up-regulated signaling in ",
names(object.list)[1]))
<- netVisual_bubble(cellchat.merge, pairLR.use = pairLR.use.down,
gg2 sources.use = "PI16+RC",
targets.use = c("CD4T", "CTL/NKcell", "GCB",
"ILC3", "naiveB", "MBC", "plasmaCell",
"CD8Tcm", "Mph/DC-1", "Mph/DC-2"),
comparison = c(1, 2), angle.x = 90, remove.isolate = T,
title.name = paste0("Down-regulated signaling in ",
names(object.list)[1]))
+ gg2 gg1
<- netVisual_bubble(cellchat.merge, pairLR.use = pairLR.use.up,
gg1 sources.use = "PRC1",
targets.use = c("CD4T", "CTL/NKcell", "GCB",
"ILC3", "naiveB", "MBC", "plasmaCell",
"CD8Tcm", "Mph/DC-1", "Mph/DC-2"),
comparison = c(1, 2), angle.x = 90, remove.isolate = T,
title.name = paste0("Up-regulated signaling in ",
names(object.list)[1]))
<- netVisual_bubble(cellchat.merge, pairLR.use = pairLR.use.down,
gg2 sources.use = "PRC1",
targets.use = c("CD4T", "CTL/NKcell", "GCB",
"ILC3", "naiveB", "MBC", "plasmaCell",
"CD8Tcm", "Mph/DC-1", "Mph/DC-2"),
comparison = c(1, 2), angle.x = 90, remove.isolate = T,
title.name = paste0("Down-regulated signaling in ",
names(object.list)[1]))
+ gg2 gg1
<- netVisual_bubble(cellchat.merge, pairLR.use = pairLR.use.up,
gg1 sources.use = "ACTA2+PRC",
targets.use = c("CD4T", "CTL/NKcell", "GCB",
"ILC3", "naiveB", "MBC", "plasmaCell",
"CD8Tcm", "Mph/DC-1", "Mph/DC-2"),
comparison = c(1, 2), angle.x = 90, remove.isolate = T,
title.name = paste0("Up-regulated signaling in ",
names(object.list)[1]))
<- netVisual_bubble(cellchat.merge, pairLR.use = pairLR.use.down,
gg2 sources.use = "ACTA2+PRC",
targets.use = c("CD4T", "CTL/NKcell", "GCB",
"ILC3", "naiveB", "MBC", "plasmaCell",
"CD8Tcm", "Mph/DC-1", "Mph/DC-2"),
comparison = c(1, 2), angle.x = 90, remove.isolate = T,
title.name = paste0("Down-regulated signaling in ",
names(object.list)[1]))
+ gg2 gg1
##### ----------------- Immune cells to FRCs ------------------- ######
<- netVisual_bubble(cellchat.merge, pairLR.use = pairLR.use.up,
gg1 sources.use = c("CD4T", "CTL/NKcell", "GCB",
"ILC3", "naiveB", "MBC", "plasmaCell",
"CD8Tcm","Mph/DC-1", "Mph/DC-2"),
targets.use = "PI16+RC",
comparison = c(1, 2), angle.x = 90, remove.isolate = T,
title.name = paste0("Up-regulated signaling in ",
names(object.list)[1]))
<- netVisual_bubble(cellchat.merge, pairLR.use = pairLR.use.down,
gg2 sources.use = c("CD4T", "CTL/NKcell", "GCB",
"ILC3", "naiveB", "MBC", "plasmaCell",
"CD8Tcm","Mph/DC-1", "Mph/DC-2"),
targets.use = "PI16+RC",
comparison = c(1, 2), angle.x = 90, remove.isolate = T,
title.name = paste0("Down-regulated signaling in ",
names(object.list)[1]))
+ gg2 gg1
<- netVisual_bubble(cellchat.merge, pairLR.use = pairLR.use.up,
gg1 sources.use = c("CD4T", "CTL/NKcell", "GCB",
"ILC3", "naiveB", "MBC", "plasmaCell",
"CD8Tcm","Mph/DC-1", "Mph/DC-2"),
targets.use = "PRC1",
comparison = c(1, 2), angle.x = 90, remove.isolate = T,
title.name = paste0("Up-regulated signaling in ",
names(object.list)[1]))
<- netVisual_bubble(cellchat.merge, pairLR.use = pairLR.use.down,
gg2 sources.use = c("CD4T", "CTL/NKcell", "GCB",
"ILC3", "naiveB", "MBC", "plasmaCell",
"CD8Tcm","Mph/DC-1", "Mph/DC-2"),
targets.use = "PRC1",
comparison = c(1, 2), angle.x = 90, remove.isolate = T,
title.name = paste0("Down-regulated signaling in ",
names(object.list)[1]))
+ gg2 gg1
<- netVisual_bubble(cellchat.merge, pairLR.use = pairLR.use.up,
gg1 sources.use = c("CD4T", "CTL/NKcell", "GCB",
"ILC3", "naiveB", "MBC", "plasmaCell",
"CD8Tcm","Mph/DC-1", "Mph/DC-2"),
targets.use = "ACTA2+PRC",
comparison = c(1, 2), angle.x = 90, remove.isolate = T,
title.name = paste0("Up-regulated signaling in ",
names(object.list)[1]))
<- netVisual_bubble(cellchat.merge, pairLR.use = pairLR.use.down,
gg2 sources.use = c("CD4T", "CTL/NKcell", "GCB",
"ILC3", "naiveB", "MBC", "plasmaCell",
"CD8Tcm","Mph/DC-1", "Mph/DC-2"),
targets.use = "ACTA2+PRC",
comparison = c(1, 2), angle.x = 90, remove.isolate = T,
title.name = paste0("Down-regulated signaling in ",
names(object.list)[1]))
+ gg2 gg1
save cellchat objects
saveRDS(cellchat.merge, file = paste0(basedir, "/data/cellchat/FRCplusImmune_",
"resPlusActMerge_cellchat.rds"))
saveRDS(cellchat.res, file = paste0(basedir, "/data/cellchat/FRCplusImmune_",
"resOnly_cellchat.rds"))
saveRDS(cellchat.act, file = paste0(basedir, "/data/cellchat/FRCplusImmune_",
"actOnly_cellchat.rds"))
session info
sessionInfo()
R version 4.3.0 (2023-04-21)
Platform: x86_64-apple-darwin20 (64-bit)
Running under: macOS Ventura 13.4.1
Matrix products: default
BLAS: /Library/Frameworks/R.framework/Versions/4.3-x86_64/Resources/lib/libRblas.0.dylib
LAPACK: /Library/Frameworks/R.framework/Versions/4.3-x86_64/Resources/lib/libRlapack.dylib; LAPACK version 3.11.0
locale:
[1] en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8
time zone: Europe/Berlin
tzcode source: internal
attached base packages:
[1] grid stats4 stats graphics grDevices utils datasets methods base
other attached packages:
[1] ComplexHeatmap_2.16.0 patchwork_1.2.0 CellChat_1.6.1
[4] igraph_2.0.2 scran_1.28.2 scater_1.28.0
[7] scuttle_1.10.3 SingleCellExperiment_1.22.0 SummarizedExperiment_1.30.2
[10] Biobase_2.60.0 GenomicRanges_1.52.1 GenomeInfoDb_1.36.4
[13] IRanges_2.36.0 S4Vectors_0.40.1 BiocGenerics_0.48.0
[16] MatrixGenerics_1.12.3 matrixStats_1.2.0 pheatmap_1.0.12
[19] ggsci_3.0.1 here_1.0.1 runSeurat3_0.1.0
[22] ggpubr_0.6.0 lubridate_1.9.3 forcats_1.0.0
[25] stringr_1.5.1 readr_2.1.5 tidyr_1.3.1
[28] tibble_3.2.1 tidyverse_2.0.0 Seurat_5.0.2
[31] SeuratObject_5.0.1 sp_2.1-3 purrr_1.0.2
[34] ggplot2_3.5.0 reshape2_1.4.4 dplyr_1.1.4
loaded via a namespace (and not attached):
[1] spatstat.sparse_3.0-3 bitops_1.0-7 httr_1.4.7
[4] RColorBrewer_1.1-3 doParallel_1.0.17 tools_4.3.0
[7] sctransform_0.4.1 backports_1.4.1 utf8_1.2.4
[10] R6_2.5.1 lazyeval_0.2.2 uwot_0.1.16
[13] GetoptLong_1.0.5 withr_3.0.0 gridExtra_2.3
[16] progressr_0.14.0 textshaping_0.3.7 cli_3.6.2
[19] Cairo_1.6-2 spatstat.explore_3.2-6 fastDummies_1.7.3
[22] network_1.18.2 labeling_0.4.3 spatstat.data_3.0-4
[25] ggridges_0.5.6 pbapply_1.7-2 systemfonts_1.0.5
[28] svglite_2.1.3 parallelly_1.37.1 limma_3.56.2
[31] rstudioapi_0.15.0 FNN_1.1.4 generics_0.1.3
[34] shape_1.4.6.1 ica_1.0-3 spatstat.random_3.2-3
[37] car_3.1-2 Matrix_1.6-5 ggbeeswarm_0.7.2
[40] fansi_1.0.6 abind_1.4-5 lifecycle_1.0.4
[43] yaml_2.3.8 edgeR_3.42.4 carData_3.0-5
[46] Rtsne_0.17 promises_1.2.1 dqrng_0.3.2
[49] crayon_1.5.2 miniUI_0.1.1.1 lattice_0.22-5
[52] beachmat_2.16.0 cowplot_1.1.3 magick_2.8.3
[55] sna_2.7-2 pillar_1.9.0 knitr_1.45
[58] metapod_1.8.0 rjson_0.2.21 future.apply_1.11.1
[61] codetools_0.2-19 leiden_0.4.3.1 glue_1.7.0
[64] data.table_1.15.2 vctrs_0.6.5 png_0.1-8
[67] spam_2.10-0 gtable_0.3.4 xfun_0.42
[70] S4Arrays_1.0.6 mime_0.12 coda_0.19-4.1
[73] survival_3.5-8 iterators_1.0.14 statmod_1.5.0
[76] bluster_1.10.0 ellipsis_0.3.2 fitdistrplus_1.1-11
[79] ROCR_1.0-11 nlme_3.1-164 RcppAnnoy_0.0.22
[82] rprojroot_2.0.4 irlba_2.3.5.1 vipor_0.4.7
[85] KernSmooth_2.23-22 colorspace_2.1-0 tidyselect_1.2.0
[88] compiler_4.3.0 BiocNeighbors_1.18.0 DelayedArray_0.26.7
[91] plotly_4.10.4 scales_1.3.0 lmtest_0.9-40
[94] NMF_0.27 digest_0.6.34 goftest_1.2-3
[97] spatstat.utils_3.0-4 rmarkdown_2.26 XVector_0.40.0
[100] htmltools_0.5.7 pkgconfig_2.0.3 sparseMatrixStats_1.12.2
[103] fastmap_1.1.1 rlang_1.1.3 GlobalOptions_0.1.2
[106] htmlwidgets_1.6.4 shiny_1.8.0 DelayedMatrixStats_1.22.6
[109] farver_2.1.1 zoo_1.8-12 jsonlite_1.8.8
[112] statnet.common_4.9.0 BiocParallel_1.34.2 BiocSingular_1.16.0
[115] RCurl_1.98-1.14 magrittr_2.0.3 ggnetwork_0.5.13
[118] GenomeInfoDbData_1.2.10 dotCall64_1.1-1 munsell_0.5.0
[121] Rcpp_1.0.12 viridis_0.6.5 reticulate_1.35.0
[124] stringi_1.8.3 ggalluvial_0.12.5 zlibbioc_1.46.0
[127] MASS_7.3-60.0.1 plyr_1.8.9 parallel_4.3.0
[130] listenv_0.9.1 ggrepel_0.9.5 deldir_2.0-4
[133] splines_4.3.0 tensor_1.5 hms_1.1.3
[136] circlize_0.4.16 locfit_1.5-9.9 spatstat.geom_3.2-9
[139] ggsignif_0.6.4 RcppHNSW_0.6.0 rngtools_1.5.2
[142] ScaledMatrix_1.8.1 evaluate_0.23 tzdb_0.4.0
[145] foreach_1.5.2 httpuv_1.6.14 RANN_2.6.1
[148] polyclip_1.10-6 future_1.33.1 clue_0.3-65
[151] scattermore_1.2 gridBase_0.4-7 rsvd_1.0.5
[154] broom_1.0.5 xtable_1.8-4 RSpectra_0.16-1
[157] rstatix_0.7.2 later_1.3.2 ragg_1.2.7
[160] viridisLite_0.4.2 beeswarm_0.4.0 registry_0.5-1
[163] cluster_2.1.6 timechange_0.3.0 globals_0.16.2
date()
[1] "Wed Mar 13 23:29:37 2024"