细胞通讯-5 实操完整代码

2022-08-25  本文已影响0人  oceanandshore

所在位置 D:\细胞通讯-0808 复现视频1.R

1、单样本

suppressMessages(if(!require(CellChat))devtools::install_github("sqjin/CellChat"))
#需要安装rtools才能运行
#suppressMessages(reticulate::py_install(packages = 'umap-learn'))
###通过minicnda安装帮助后续评估通路间得相似性
suppressMessages(if(!require(ggplot2))install.packages('ggplot2'))
suppressMessages(if(!require(patchwork))install.packages('patchwork') )
suppressMessages(if(!require(ggalluvial))install.packages('ggalluvial'))
suppressMessages(if(!require(igraph))install.packages('igraph'))
suppressMessages(if(!require(dplyr))install.packages('dplyr'))
suppressMessages(options(stringsAsFactors = FALSE))


# library packages
library(Seurat)
library(dplyr)
library(SeuratData)
library(patchwork) #最强大的拼图包
library(ggplot2)
library(CellChat)
library(ggalluvial)
library(svglite)

rm(list=ls()) #清空所有变量
options(stringsAsFactors = F) #输入数据不自动转换成因子(防止数据格式错误)

getwd()




#load(url("https://ndownloader.figshare.com/files/25950872"))#读取示例数据集
#View(data_humanSkin)
#saveRDS(data_humanSkin,'data_humanSkin.rds')
data_humanSkin <- readRDS('data_humanSkin.rds')
class(data_humanSkin)
## [1] "list"
#示例数据:来源于人类皮肤
#作者发表文献 #https://www.nature.com/articles/s41467-021-21246-9.pdf

#把表达矩阵取出来,用于输入
data.input <- data_humanSkin$data # 标准化过的矩阵
#单细胞对象的话,是取这个pbmc[["RNA"]]@data

# 把临床信息,也就是注释信息取出来
meta <- data_humanSkin$meta # a dataframe with rownames containing cell mata data 

unique(meta$condition)
## [1] "LS" "NL"

#原文的作者只取了 LS 进行下游分析
cell.use <- rownames(meta)[meta$condition == "LS"] # 按指定的变量提取细胞
data.input <- data.input[, cell.use]#取出对应细胞
meta = meta[cell.use, ]#取出对应细胞的meta信息
# meta = data.frame(labels = meta$labels[cell.use], row.names = colnames(data.input)) # manually create a dataframe consisting of the cell labels

unique(meta$labels)
##  [1] Inflam. FIB  FBN1+ FIB    APOE+ FIB    COL11A1+ FIB cDC2        
##  [6] LC           Inflam. DC   cDC1         CD40LG+ TC   Inflam. TC  
## [11] TC           NKT         
## 12 Levels: APOE+ FIB FBN1+ FIB COL11A1+ FIB Inflam. FIB cDC1 cDC2 ... NKT

#创建CellChat对象
cellchat <- createCellChat(object = data.input, meta = meta, group.by = "labels")
## Create a CellChat object from a data matrix
## Set cell identities for the new CellChat object
## The cell groups used for CellChat analysis are  APOE+ FIB FBN1+ FIB COL11A1+ FIB Inflam. FIB cDC1 cDC2 LC Inflam. DC TC Inflam. TC CD40LG+ TC NKT
#创建celllchat对象,group.by指定通讯间的对象,用meta中的注释作为分组依据

######如果上述没有指定meta=meta,可以如下手动加入
#cellchat <- createCellChat(object = data.input, group.by = "labels")
#cellchat <- addMeta(cellchat, meta = meta)

cellchat <- setIdent(cellchat, ident.use = "labels") # set "labels" as default cell identity
#Idents(pbmc) <- 'group'

levels(cellchat@idents) # show factor levels of the cell labels
##  [1] "APOE+ FIB"    "FBN1+ FIB"    "COL11A1+ FIB" "Inflam. FIB"  "cDC1"        
##  [6] "cDC2"         "LC"           "Inflam. DC"   "TC"           "Inflam. TC"  
## [11] "CD40LG+ TC"   "NKT"
groupSize <- as.numeric(table(cellchat@idents)) # number of cells in each cell group
groupSize
##  [1] 1228  813  181  484  121  294   67   81  765  266  630   81


###载入数据库并开始计算
CellChatDB <- CellChatDB.human # use CellChatDB.mouse if running on mouse data
showDatabaseCategory(CellChatDB)


#展示细胞组成的比例:
dplyr::glimpse(CellChatDB$interaction)#展示互作的记录
## Rows: 1,939
## Columns: 11
## $ interaction_name   <chr> "TGFB1_TGFBR1_TGFBR2", "TGFB2_TGFBR1_TGFBR2", "TGFB…
## $ pathway_name       <chr> "TGFb", "TGFb", "TGFb", "TGFb", "TGFb", "TGFb", "TG…
## $ ligand             <chr> "TGFB1", "TGFB2", "TGFB3", "TGFB1", "TGFB1", "TGFB2…
## $ receptor           <chr> "TGFbR1_R2", "TGFbR1_R2", "TGFbR1_R2", "ACVR1B_TGFb…
## $ agonist            <chr> "TGFb agonist", "TGFb agonist", "TGFb agonist", "TG…
## $ antagonist         <chr> "TGFb antagonist", "TGFb antagonist", "TGFb antagon…
## $ co_A_receptor      <chr> "", "", "", "", "", "", "", "", "", "", "", "", "",…
## $ co_I_receptor      <chr> "TGFb inhibition receptor", "TGFb inhibition recept…
## $ evidence           <chr> "KEGG: hsa04350", "KEGG: hsa04350", "KEGG: hsa04350…
## $ annotation         <chr> "Secreted Signaling", "Secreted Signaling", "Secret…
## $ interaction_name_2 <chr> "TGFB1 - (TGFBR1+TGFBR2)", "TGFB2 - (TGFBR1+TGFBR2)…
#CellChatDB.use <- CellChatDB

#这一步类似取子集的操作,单独去除“分泌”这一条通路,类似取子集 pbmc < - subset(pbmc, ident ='T cell')
CellChatDB.use <- subsetDB(CellChatDB, search = "Secreted Signaling")#取出相应分类用作分析数据库

#CellChatDB.use <- CellChatDB # simply use the default CellChatDB
cellchat@DB <- CellChatDB.use#将数据库内容载入cellchat对象中


#表达量预处理
#这一步是取出表达数据,如果你有感兴趣的基因可以填在features里,没有的话,就写NULL
cellchat <- subsetData(cellchat,features = NULL)#取出表达数据

cellchat <- identifyOverExpressedGenes(cellchat)#寻找高表达的基因#
#类似寻找高变基因FindVariableFeatures()

cellchat <- identifyOverExpressedInteractions(cellchat)#寻找高表达的通路
cellchat <- projectData(cellchat, PPI.human)#投影到PPI
 
cellchat <- computeCommunProb(cellchat, raw.use = T)#默认计算方式为type = "truncatedMean",
#默认cutoff的值为20%,即表达比例在25%以下的基因会被认为是0, trim = 0.1可以调整比例阈值

cellchat <- filterCommunication(cellchat, min.cells = 10)

#去掉通讯数量很少的细胞
df.net <- subsetCommunication(cellchat)#将细胞通讯预测结果以数据框的形式取出

View(df.net)
DT::datatable(df.net)


write.csv(df.net,'01.df.net.csv')

#这种方式只取通路,数据结构更简单
df.netp <- subsetCommunication(cellchat,slot.name = "netP")

#这一步类似取子集,source可以以细胞类型的名称定义,也可以按照细胞名称中的顺序以数值向量直接取
df.net <- subsetCommunication(cellchat, sources.use = c(1,2), targets.use = c(4,5))
# levels(meta$labels)
#[1] "APOE+ FIB"    "FBN1+ FIB"    "COL11A1+ FIB" "Inflam. FIB"  "cDC1"         "cDC2"        
#[7] "LC"           "Inflam. DC"   "TC"           "Inflam. TC"   "CD40LG+ TC"   "NKT"  
# c(1,2) 就是"APOE+ FIB"    "FBN1+ FIB"这两种细胞,这里也可以换成c("APOE+ FIB","FBN1+ FIB")


#指定输入与输出的细胞集群
#df.net <- subsetCommunication(cellchat, signaling = c("WNT", "TGFb"))#指定通路提取
cellchat <- computeCommunProbPathway(cellchat)

#每对配受体的预测结果存在net中,每条通路的预测结果存在netp中
cellchat <- aggregateNet(cellchat)
#计算联路数与通讯概率,可用sources.use and targets.use指定来源与去向




##################可视化######################
groupSize
##  [1] 1228  813  181  484  121  294   67   81  765  266  630   81
library(patchwork)
par(mfrow = c(1,3), xpd=TRUE) #c(1,3)的意思是,画一个 一行三列的图片
netVisual_circle(cellchat@net$count, vertex.weight = groupSize, weight.scale = T,
                 label.edge= F, title.name = "Number of interactions") # 展示互作数量

netVisual_circle(cellchat@net$weight, vertex.weight = groupSize, weight.scale = T, 
                 label.edge= F, title.name = "Interaction weights/strength")   #展示互作权重

netVisual_circle(cellchat@net$weight, vertex.weight = groupSize, weight.scale = T, 
                 label.edge= F, title.name = "Interaction weights/strength",
                 targets.use = 'cDC2')   #只展示与CD2相关的互作,箭头指向DC2



#互作数量与重要性图
mat <- cellchat@net$weight
par(mfrow = c(3,4), xpd=TRUE)

for (i in 1:nrow(mat)) {#
  mat2 <- matrix(0, nrow = nrow(mat), ncol = ncol(mat), dimnames = dimnames(mat))
  mat2[i, ] <- mat[i, ]
  netVisual_circle(mat2, vertex.weight = groupSize, weight.scale = T, 
                   edge.weight.max = max(mat), title.name = rownames(mat)[i])
} #循环绘出每种与其他细胞之间互作的关系


#for (i in 1:nrow(mat)) {
  mat2 <- matrix(0, nrow = nrow(mat), ncol = ncol(mat), dimnames = dimnames(mat))
  mat2[i, ] <- mat[i, ]
  
  netVisual_circle(mat2, vertex.weight = groupSize, weight.scale = T, 
                   edge.weight.max = max(mat), title.name = rownames(mat)[i])


  #####进阶可视化
pathways.show <- df.net$pathway_name#计算到的所有通路
# Hierarchy plot
par(mfrow = c(1,2), xpd=TRUE)
vertex.receiver = seq(1,4) 
netVisual_aggregate(cellchat, signaling =pathways.show[1],  
                      vertex.receiver = vertex.receiver,layout = 'hierarchy')




#左侧显示只当细胞的的通讯,右侧显示剩余细胞的通讯情况

# Circle plot
netVisual_aggregate(cellchat, signaling = pathways.show[1], layout = "circle")
#以circle的方式展示通讯

pdf('Rplot05.pdf',width = 7, height = 7)
netVisual_aggregate(cellchat, signaling = pathways.show[1], layout = "chord")
dev.off()
 
#把所有的通路都画出来
dir.create('chord/')
for(i in 1:length(pathways.show)){
  pdf(paste0('chord/',pathways.show[i],'.pdf'),width = 7,height = 7)
  netVisual_aggregate(cellchat, signaling = pathways.show[i], layout = "chord")
  dev.off()
  
}
#> length(pathways.show)
#[1] 4
#视频里 length 长度271条通路,为什么我只有4条???




# Chord diagram
group.cellType <- c(rep("FIB", 4), rep("DC", 4), rep("TC", 4)) # grouping cell clusters into fibroblast, DC and TC cells
names(group.cellType) <- levels(cellchat@idents)
par(mfrow = c(1,2), xpd=TRUE)
netVisual_chord_cell(cellchat, signaling = pathways.show[1],
                     group = group.cellType, #分组展示的顺序
                     title.name = paste0(pathways.show[1], " signaling network"))
## Plot the aggregated cell-cell communication network at the signaling pathway level

netVisual_chord_cell(cellchat, signaling = pathways.show[1],
                     title.name = paste0(pathways.show[1], " signaling network"))
## Plot the aggregated cell-cell communication network at the signaling pathway level
# p1加了分组顺序,p2没加,可以看出,细胞分类的话,类与类之间有个小间隔,更容易分辨


#####配受体展示
p1 <- netAnalysis_contribution(cellchat, signaling = pathways.show[1],
                               title =  pathways.show[1])#展现对特定通路的贡献程度
p2 <- netAnalysis_contribution(cellchat, signaling = pathways.show)
cowplot::plot_grid(p1, p2, align = "h",ncol=2)




#指定通路画连线图
pairLR.CXCL <- extractEnrichedLR(cellchat, signaling = pathways.show[1],
                                 geneLR.return = FALSE) #提取显著作用的配受体对
LR.show <- pairLR.CXCL[1,] # show one ligand-receptor pair

vertex.receiver = seq(1,4) # a numeric vector 取1到4的时候,source就只有4种细胞,其实也就是取多少个levels作为source
p1<-netVisual_individual(cellchat, signaling = pathways.show,  
                         pairLR.use = LR.show, vertex.receiver = vertex.receiver,
                         layout = 'hierarchy')



vertex.receiver = seq(1,7) # a numeric vector 取1到7的时候,source就只有7种细胞
p2<-netVisual_individual(cellchat, signaling = pathways.show,  
                         pairLR.use = LR.show, vertex.receiver = vertex.receiver,
                         layout = 'hierarchy')




cowplot::plot_grid(p1, p2 ,align = "h",ncol=2)



netVisual_individual(cellchat, signaling = pathways.show[1], 
                     pairLR.use = LR.show, layout = "circle") 
# 取的是LR.show,也就是最显著的一个配受体,所以这个函数可以指定配受体
#LR.show
#[1] "FGF7_FGFR1"



## [[1]]
# Circle plot


netVisual_individual(cellchat, signaling = pathways.show,
                     pairLR.use = LR.show, layout = "chord")



## [[1]]

# Chord diagram



#####通路展示
pathways.show.all <- cellchat@netP$pathways
# check the order of cell identity to set suitable vertex.receiver
levels(cellchat@idents)
##  [1] "APOE+ FIB"    "FBN1+ FIB"    "COL11A1+ FIB" "Inflam. FIB"  "cDC1"        
##  [6] "cDC2"         "LC"           "Inflam. DC"   "TC"           "Inflam. TC"  
## [11] "CD40LG+ TC"   "NKT"
vertex.receiver = seq(1,4)
dir.create('04.pathwat.show')
for (i in 1:length(pathways.show.all)) {
  # Visualize communication network associated with both signaling pathway and individual L-R pairs
  # netVisual(cellchat, signaling = pathways.show.all[i], 
  #           vertex.receiver = vertex.receiver, layout = "hierarchy")#直接出pdf与svg
  # Compute and visualize the contribution of each ligand-receptor pair to the overall signaling pathway
  gg <- netAnalysis_contribution(cellchat, signaling = pathways.show.all[i])
  ggsave(filename=paste0('04.pathwat.show/',pathways.show.all[i], "_L-R_contribution.pdf"),
         plot=gg, width = 3, height = 2, units = 'in', dpi = 300)
}
#循环存出连线图
gg



#####多个细胞通讯通路气泡图可视化
#指定发送者与接收者,展示所有配受体对
levels(cellchat@idents)
##  [1] "APOE+ FIB"    "FBN1+ FIB"    "COL11A1+ FIB" "Inflam. FIB"  "cDC1"        
##  [6] "cDC2"         "LC"           "Inflam. DC"   "TC"           "Inflam. TC"  
## [11] "CD40LG+ TC"   "NKT"
par(mfrow = c(1,3), xpd=TRUE)
p1 <- netVisual_bubble(cellchat, sources.use = 4, 
                       targets.use = c(5:11), remove.isolate = FALSE) # targets.use 只展示想要的目标
## Comparing communications on a single object
p2 <- netVisual_bubble(cellchat, sources.use = 4, 
                       targets.use = c("cDC1","cDC2","LC","Inflam. DC","TC","Inflam. TC",  
                                       "CD40LG+ TC"), remove.isolate = FALSE)
## Comparing communications on a single object
p3 <-netVisual_bubble(cellchat, sources.use = 4, 
                      targets.use = c("cDC1","cDC2"), remove.isolate = FALSE)
## Comparing communications on a single object
#指定信号通路
p4 <-netVisual_bubble(cellchat, sources.use = 4, 
                      targets.use = c(5:11), signaling = c("CCL","CXCL"), 
                      remove.isolate = FALSE)
## Comparing communications on a single object
cowplot::plot_grid(p1, p2,p3,p4, align = "h",ncol=4)
#纵坐标展示的是配受体的名称;p1和p2两张图是一模一样的,一个是数字,一个是用标签标识,结果都一样





#指定信号通路提取配受体
par(mfrow = c(1,3), xpd=TRUE)
pairLR.use <- extractEnrichedLR(cellchat, signaling = c("CCL","CXCL","FGF")) 
pairLR.use
##   interaction_name
## 1       CCL19_CCR7
## 2     CXCL12_CXCR4
## 3     CXCL12_ACKR3
## 4       FGF7_FGFR1
#也即是说"CCL","CXCL","FGF"这3个通路当中,有4对显著的配受体

p1 <-netVisual_bubble(cellchat, sources.use = c(3,4), targets.use = c(5:8), 
                      pairLR.use = pairLR.use, remove.isolate = TRUE)  #remove.isolate = TRUE 去除空的通路
## Comparing communications on a single object
p2 <-netVisual_bubble(cellchat, sources.use = 4, targets.use = c(5:11), 
                      signaling = c("CCL","CXCL"), remove.isolate = FALSE)
## Comparing communications on a single object
p3 <-netVisual_bubble(cellchat, sources.use = 4, targets.use = c(5:11), 
                      signaling = c("CCL","CXCL"), remove.isolate = T)
## Comparing communications on a single object
cowplot::plot_grid(p1, p2,p3, align = "h",ncol=3)
#p1是指定了配受体对(pairLR.use),并且指定了2种细胞sources.use = c(3,4);
#p2指定的是通路的名称,指定了一种细胞sources.use = 4;
#p3里面用了targets.use = c(5:11)
#> levels(meta$labels)[5:11]
#[1] "cDC1"       "cDC2"       "LC"         "Inflam. DC" "TC"         "Inflam. TC" "CD40LG+ TC"

#指定通路,发出、接收的点图

2、多组别

所在位置 D:\细胞通讯-0808 多组别的细胞通讯.R

#这部分的内容主要分析目的为:
#1、细胞通讯在不同组别中是否发生变化
#2、细胞通讯在不同细胞类型中是否发生变化
#3、细胞通讯的“发起者”与接收者是否随组别发生变化
#首先还是做点准备工作

library(CellChat)
library(patchwork)
library(cowplot)
dir.create('./comparison')
setwd('./comparison')


#加载两个数据集
#这个数据集相当于我们上次课程中已经进行细胞通讯计算的cellchat对象,没有这部分基础的同学请回顾:https://www.bilibili.com/video/BV1Ab4y1W7qx?p=3
#cellchat.NL <- readRDS(url("https://ndownloader.figshare.com/files/25954199"))
#cellchat.LS <- readRDS(url("https://ndownloader.figshare.com/files/25956518"))
#dir.create('data')
#saveRDS(cellchat.LS,'./data/cellchat.LS.rds')
#saveRDS(cellchat.NL,'./data/cellchat.NL.rds')
cellchat.LS <- readRDS('./data/cellchat.LS.rds')
cellchat.NL <- readRDS('./data/cellchat.NL.rds')
object.list <- list(NL = cellchat.NL, LS = cellchat.LS) #构建整合list
cellchat <- mergeCellChat(object.list, add.names = names(object.list))  #进行合并,相当于seurat里面的merge函数
## 合并的数据槽:
##Merge the following slots: 'data.signaling','net', 'netP','meta', 'idents', 'var.features' , 'DB', and 'LR'.

cellchat
## An object of class CellChat created from a merged object with multiple datasets 
##  555 signaling genes.
##  7563 cells.  # 这里的7563个细胞就是合并前加起来的和

#最简单的展示,查看细胞互作的数量在不同条件下是否有差异
gg1 <- compareInteractions(cellchat, show.legend = F, group = c(1,2))
gg2 <- compareInteractions(cellchat, show.legend = F, group = c(1,2), measure = "weight")
gg1 + gg2


#查看细胞通路在两组间的富集程度
gg1 <- rankNet(cellchat, mode = "comparison", stacked = T, do.stat = TRUE)
gg2 <- rankNet(cellchat, mode = "comparison", stacked = F, do.stat = TRUE)
gg1 + gg2


#以circle plot的形式展示第二个组别中相较于第一个组别细胞通讯发生的变化,红色为上调蓝色为下调
par(mfrow = c(1,2), xpd=TRUE)
netVisual_diffInteraction(cellchat, weight.scale = T)
netVisual_diffInteraction(cellchat, weight.scale = T, measure = "weight")
#不是以分组拆开的方式去展示,而是直接以两组数据相减(第二组减去第一组)得到的结果展示
#红色代表在第二个组别当中上调,蓝色代表在第二个组别当中这些通路下调
#如何看哪个是第一个组别,哪个是第二个组别,用names ( object.list)看 NL是第一组
#> names ( object.list)
#[1] "NL" "LS"


#以上是直接展示二组“相减”的结果,当然你也可以直接将两组分开展示:
weight.max <- getMaxWeight(object.list, attribute = c("idents","count"))
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]))
}



#同理,用heatmap也可以进行展示
gg1 <- netVisual_heatmap(cellchat)
## Do heatmap based on a merged object
gg2 <- netVisual_heatmap(cellchat, measure = "weight")
## Do heatmap based on a merged object
gg1 + gg2
#同样是第二个组减去第一个组,左侧是细胞通讯数量,右侧是细胞通讯强度,和上面的圈图一样的。



#展示特定通路, 老三样
#cicle
pathways.show <- c("CXCL") 
weight.max <- getMaxWeight(object.list, slot.name = c("netP"), attribute = pathways.show) # control the edge weights across different datasets
par(mfrow = c(1,2), xpd=TRUE)
for (i in 1:length(object.list)) {
  netVisual_aggregate(object.list[[i]], signaling = pathways.show, layout = "circle", edge.weight.max = weight.max[1], edge.width.max = 10, signaling.name = paste(pathways.show, names(object.list)[i]))
}
# 展示CXCL通路在组间的差异,可以看到在LS组有更多的细胞参与这个通路



#heatmap
pathways.show <- c("CXCL") 
par(mfrow = c(1,2), xpd=TRUE)
ht <- list()
for (i in 1:length(object.list)) {
  ht[[i]] <- netVisual_heatmap(object.list[[i]], signaling = pathways.show, 
                               color.heatmap = "Reds",
                               title.name = paste(pathways.show, "signaling ",names(object.list)[i]))
}
## Do heatmap based on a single object 
## 
## Do heatmap based on a single object
ComplexHeatmap::draw(ht[[1]] + ht[[2]], ht_gap = unit(0.5, "cm"))
#Rplot7




#弦图
pathways.show <- c("CXCL") 
par(mfrow = c(1,2), xpd=TRUE)
for (i in 1:length(object.list)) {
  netVisual_aggregate(object.list[[i]], signaling = pathways.show, 
                      layout = "chord", 
                      signaling.name = paste(pathways.show, names(object.list)[i]))
}



#基因表达情况
cellchat@meta$datasets = factor(cellchat@meta$datasets, 
                                levels = c("NL", "LS")#设定组别的level
)
plotGeneExpression(cellchat, signaling = "CXCL", split.by = "datasets", colors.ggplot = T)
## Registered S3 method overwritten by 'spatstat.geom':
##   method      from  
##   plot.imlist imager
## The default behaviour of split.by has changed.
## Separate violin plots are now plotted side-by-side.
## To restore the old behaviour of a single split violin,
## set split.plot = TRUE.
##       
## This message will be shown once per session.
## Scale for 'y' is already present. Adding another scale for 'y', which will
## replace the existing scale.
## Scale for 'y' is already present. Adding another scale for 'y', which will
## replace the existing scale.
## Scale for 'y' is already present. Adding another scale for 'y', which will
## replace the existing scale.




#研究细胞类型之间的通讯差异
#按照组别拆分整合
levels(object.list[[1]]@idents) 
##  [1] "APOE+ FIB"    "FBN1+ FIB"    "COL11A1+ FIB" "Inflam. FIB"  "cDC1"        
##  [6] "cDC2"         "LC"           "Inflam. DC"   "TC"           "Inflam. TC"  
## [11] "CD40LG+ TC"   "NKT"
levels(object.list[[2]]@idents) 
##  [1] "APOE+ FIB"    "FBN1+ FIB"    "COL11A1+ FIB" "Inflam. FIB"  "cDC1"        
##  [6] "cDC2"         "LC"           "Inflam. DC"   "TC"           "Inflam. TC"  
## [11] "CD40LG+ TC"   "NKT"
group.cellType <- c(rep("FIB", 4), rep("DC", 4), rep("TC", 4))
group.cellType <- factor(group.cellType, levels = c("FIB", "DC", "TC"))
object.list <- lapply(object.list, function(x) {mergeInteractions(x, group.cellType)})#合并细胞类型
cellchat <- mergeCellChat(object.list, add.names = names(object.list))#合并两组数据
## Merge the following slots: 'data.signaling','net', 'netP','meta', 'idents', 'var.features' , 'DB', and 'LR'.

#直接展示相减的结果
par(mfrow = c(1,2), xpd=TRUE)
netVisual_diffInteraction(cellchat, weight.scale = T, measure = "count.merged", label.edge = T)
netVisual_diffInteraction(cellchat, weight.scale = T, measure = "weight.merged", label.edge = T)
# 这里还是两组数据相减的结果,把12种细胞类型汇聚成3大类。DC相较其他两类,变化最大



#两组分别展示
weight.max <- getMaxWeight(object.list, 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)) {
  netVisual_circle(object.list[[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)[i]))
}
#Rplot11 DC与TC之间的通讯,显然LS组更强一些



#展示两组间各类细胞incoming与outcoming通讯的强度
num.link <- sapply(object.list, function(x) {rowSums(x@net$count) +
    colSums(x@net$count)-diag(x@net$count)})
weight.MinMax <- c(min(num.link), max(num.link)) # control the dot size in the different datasets
gg <- list()
for (i in 1:length(object.list)) {
  gg[[i]] <- netAnalysis_signalingRole_scatter(object.list[[i]],
                                               title = names(object.list)[i], 
                                               weight.MinMax = weight.MinMax)
}
## Signaling role analysis on the aggregated cell-cell communication network from all signaling pathways
## Signaling role analysis on the aggregated cell-cell communication network from all signaling pathways

patchwork::wrap_plots(plots = gg)
#Rplot12




#展示两组间的差异
gg1 <- netAnalysis_signalingChanges_scatter(cellchat,
                                            idents.use = "Inflam. DC",
                                            signaling.exclude = "MIF")
## Visualizing differential outgoing and incoming signaling changes from NL to LS
gg2 <- netAnalysis_signalingChanges_scatter(cellchat, idents.use = "cDC1",
                                            signaling.exclude = c("MIF"))
## Visualizing differential outgoing and incoming signaling changes from NL to LS
patchwork::wrap_plots(plots = list(gg1,gg2))
#报错,视频说需要环境相同,视频在17:30秒处



#继续探索outgoing与incoming的组间模式差异
suppressMessages(library(ComplexHeatmap))
i = 1
#outgoing 
pathway.union <- union(object.list[[i]]@netP$pathways, object.list[[i+1]]@netP$pathways)
ht1 = netAnalysis_signalingRole_heatmap(object.list[[i]], pattern = "outgoing", signaling = pathway.union, title = names(object.list)[i], width = 5, height = 6)
ht2 = netAnalysis_signalingRole_heatmap(object.list[[i+1]], pattern = "outgoing", signaling = pathway.union, title = names(object.list)[i+1], width = 5, height = 6)
draw(ht1 + ht2, ht_gap = unit(0.5, "cm"))
# cDC1 在两组中差异较大
#Rplot13


#incoming
ht1 = netAnalysis_signalingRole_heatmap(object.list[[i]], pattern = "incoming", signaling = pathway.union, title = names(object.list)[i], width = 5, height = 6, color.heatmap = "GnBu")
ht2 = netAnalysis_signalingRole_heatmap(object.list[[i+1]], pattern = "incoming", signaling = pathway.union, title = names(object.list)[i+1], width = 5, height = 6, color.heatmap = "GnBu")
draw(ht1 + ht2, ht_gap = unit(0.5, "cm"))
#Rplot14




#overall
ht1 = netAnalysis_signalingRole_heatmap(object.list[[i]], pattern = "all", signaling = pathway.union, title = names(object.list)[i], width = 5, height = 6, color.heatmap = "OrRd")
ht2 = netAnalysis_signalingRole_heatmap(object.list[[i+1]], pattern = "all", signaling = pathway.union, title = names(object.list)[i+1], width = 5, height = 6, color.heatmap = "OrRd")
draw(ht1 + ht2, ht_gap = unit(0.5, "cm"))
#Rplot15


#从配受体的角度画一画气泡图
netVisual_bubble(cellchat, sources.use = 4, 
                 targets.use = c(5:11),  comparison = c(1, 2), angle.x = 45)
## Comparing communications on a merged object
#Rplot16

gg1 <- netVisual_bubble(cellchat, sources.use = 4, targets.use = c(5:11),  comparison = c(1, 2), max.dataset = 2, title.name = "Increased signaling in LS", angle.x = 45, remove.isolate = T)
## Comparing communications on a merged object
gg2 <- netVisual_bubble(cellchat, sources.use = 4, targets.use = c(5:11),  comparison = c(1, 2), max.dataset = 1, title.name = "Decreased signaling in LS", angle.x = 45, remove.isolate = T)
## Comparing communications on a merged object
gg1 + gg2
#Rplot17






#以上的计算依赖的都是细胞通讯的可能性(强度),接下来我们将通过配受体对基因表达的角度进一步研究
#以通路为单位
pos.dataset = "LS"
features.name = pos.dataset
#差异计算:
cellchat <- identifyOverExpressedGenes(cellchat, 
                                       group.dataset = "datasets", 
                                       pos.dataset = pos.dataset, 
                                       features.name = features.name, 
                                       only.pos = FALSE, thresh.pc = 0.1, 
                                       thresh.fc = 0.1, thresh.p = 1)
## Use the joint cell labels from the merged CellChat object

#提取细胞通讯预测数据框
net <- netMappingDEG(cellchat, features.name = features.name)

#提取LS组上调的配体以及NL上调的受体,
net.up <- subsetCommunication(cellchat, net = net, datasets = "LS",
                              ligand.logFC = 0.2, receptor.logFC = NULL)

#反之亦然
net.down <- subsetCommunication(cellchat, net = net, datasets = "LS",
                                ligand.logFC = -0.2, receptor.logFC = -0.1)


gene.up <- extractGeneSubsetFromPair(net.up, cellchat)
gene.down <- extractGeneSubsetFromPair(net.down, cellchat)

#可视化:
#气泡图
pairLR.use.up = net.up[, "interaction_name", drop = F]
gg1 <- netVisual_bubble(cellchat, pairLR.use = pairLR.use.up, 
                        sources.use = 4, targets.use = c(5:11), 
                        comparison = c(1, 2),  angle.x = 90, 
                        remove.isolate = T,
                        title.name = paste0("Up-regulated signaling in ", 
                                            names(object.list)[2]))
## Comparing communications on a merged object
pairLR.use.down = net.down[, "interaction_name", drop = F]
gg2 <- netVisual_bubble(cellchat, pairLR.use = pairLR.use.down, 
                        sources.use = 4, targets.use = c(5:11), 
                        comparison = c(1, 2),  angle.x = 90, remove.isolate = T,
                        title.name = paste0("Down-regulated signaling in ", 
                                            names(object.list)[2]))
## Comparing communications on a merged object
gg1 + gg2
#Rplot18




#弦图
par(mfrow = c(1,2), xpd=TRUE)

netVisual_chord_gene(object.list[[1]], sources.use = 4, targets.use = c(5:11), 
                     slot.name = 'net', net = net.down, lab.cex = 0.8, small.gap = 3.5, 
                     title.name = paste0("Down-regulated signaling in ", 
                                         names(object.list)[1]))
## You may try the function `netVisual_chord_cell` for visualizing individual signaling pathway
netVisual_chord_gene(object.list[[2]], sources.use = 4, targets.use = c(5:11), 
                     slot.name = 'net', net = net.up, lab.cex = 0.8, small.gap = 3.5, 
                     title.name = paste0("Up-regulated signaling in ", 
                                         names(object.list)[2]))
#Rplot19




#基因表达情况
cellchat@meta$datasets = factor(cellchat@meta$datasets, 
                                levels = c("NL", "LS")#设定组别的level
)
plotGeneExpression(cellchat, signaling = "CXCL", split.by = "datasets", colors.ggplot = T)
#这部分结果展示建议用Seurat做


## Registered S3 method overwritten by 'spatstat.geom':
##   method      from  
##   plot.imlist imager
## The default behaviour of split.by has changed.
## Separate violin plots are now plotted side-by-side.
## To restore the old behaviour of a single split violin,
## set split.plot = TRUE.
##       
## This message will be shown once per session.
## Scale for 'y' is already present. Adding another scale for 'y', which will
## replace the existing scale.
## Scale for 'y' is already present. Adding another scale for 'y', which will
## replace the existing scale.
## Scale for 'y' is already present. Adding another scale for 'y', which will
## replace the existing scale.




#版本信息
#sessionInfo()
## R version 4.1.2 (2021-11-01)
## Platform: x86_64-pc-linux-gnu (64-bit)
## Running under: Ubuntu 20.04.3 LTS
## 
## Matrix products: default
## BLAS:   /usr/lib/x86_64-linux-gnu/blas/libblas.so.3.9.0
## LAPACK: /usr/lib/x86_64-linux-gnu/lapack/liblapack.so.3.9.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       
## 
## attached base packages:
## [1] grid      stats     graphics  grDevices utils     datasets  methods  
## [8] base     
## 
## other attached packages:
##  [1] ComplexHeatmap_2.10.0 cowplot_1.1.1         patchwork_1.1.1      
##  [4] CellChat_1.1.3        Biobase_2.54.0        BiocGenerics_0.40.0  
##  [7] ggplot2_3.3.5         igraph_1.2.8          dplyr_1.0.7          
## [10] imager_0.42.13        magrittr_2.0.1       
## 
## loaded via a namespace (and not attached):
##   [1] circlize_0.4.13       systemfonts_1.0.3     NMF_0.23.0           
##   [4] plyr_1.8.6            lazyeval_0.2.2        splines_4.1.2        
##   [7] listenv_0.8.0         scattermore_0.7       gridBase_0.4-7       
##  [10] digest_0.6.29         foreach_1.5.1         htmltools_0.5.2      
##  [13] magick_2.7.3          tiff_0.1-11           ggalluvial_0.12.3    
##  [16] fansi_1.0.2           tensor_1.5            cluster_2.1.2        
##  [19] doParallel_1.0.16     ROCR_1.0-11           sna_2.6              
##  [22] globals_0.14.0        matrixStats_0.61.0    svglite_2.0.0        
##  [25] spatstat.sparse_2.0-0 jpeg_0.1-9            colorspace_2.0-2     
##  [28] ggrepel_0.9.1         xfun_0.29             crayon_1.4.2         
##  [31] jsonlite_1.7.3        spatstat.data_2.1-0   survival_3.2-13      
##  [34] zoo_1.8-9             iterators_1.0.13      glue_1.6.0           
##  [37] polyclip_1.10-0       registry_0.5-1        gtable_0.3.0         
##  [40] leiden_0.3.9          GetoptLong_1.0.5      future.apply_1.8.1   
##  [43] shape_1.4.6           abind_1.4-5           scales_1.1.1         
##  [46] DBI_1.1.1             rngtools_1.5.2        miniUI_0.1.1.1       
##  [49] Rcpp_1.0.8            viridisLite_0.4.0     xtable_1.8-4         
##  [52] clue_0.3-60           spatstat.core_2.3-1   reticulate_1.22      
##  [55] stats4_4.1.2          htmlwidgets_1.5.4     httr_1.4.2           
##  [58] FNN_1.1.3             RColorBrewer_1.1-2    ellipsis_0.3.2       
##  [61] Seurat_4.0.5          ica_1.0-2             pkgconfig_2.0.3      
##  [64] farver_2.1.0          uwot_0.1.10           deldir_1.0-6         
##  [67] sass_0.4.0            utf8_1.2.2            tidyselect_1.1.1     
##  [70] labeling_0.4.2        rlang_0.4.12          reshape2_1.4.4       
##  [73] later_1.3.0           munsell_0.5.0         tools_4.1.2          
##  [76] generics_0.1.1        statnet.common_4.5.0  ggridges_0.5.3       
##  [79] evaluate_0.14         stringr_1.4.0         fastmap_1.1.0        
##  [82] goftest_1.2-3         yaml_2.2.1            knitr_1.37           
##  [85] fitdistrplus_1.1-6    purrr_0.3.4           RANN_2.6.1           
##  [88] readbitmap_0.1.5      nlme_3.1-155          pbapply_1.5-0        
##  [91] future_1.23.0         mime_0.12             compiler_4.1.2       
##  [94] plotly_4.10.0         png_0.1-7             spatstat.utils_2.2-0 
##  [97] tibble_3.1.6          bslib_0.3.1           stringi_1.7.6        
## [100] highr_0.9             RSpectra_0.16-0       lattice_0.20-45      
## [103] Matrix_1.4-0          vctrs_0.3.8           pillar_1.6.4         
## [106] lifecycle_1.0.1       spatstat.geom_2.3-0   lmtest_0.9-39        
## [109] jquerylib_0.1.4       GlobalOptions_0.1.2   RcppAnnoy_0.0.19     
## [112] data.table_1.14.2     irlba_2.3.3           httpuv_1.6.3         
## [115] R6_2.5.1              promises_1.2.0.1      network_1.17.1       
## [118] gridExtra_2.3         KernSmooth_2.23-20    bmp_0.3              
## [121] IRanges_2.28.0        parallelly_1.30.0     codetools_0.2-18     
## [124] MASS_7.3-54           assertthat_0.2.1      pkgmaker_0.32.2      
## [127] rjson_0.2.21          withr_2.4.3           SeuratObject_4.0.3   
## [130] sctransform_0.3.2     S4Vectors_0.32.2      mgcv_1.8-38          
## [133] parallel_4.1.2        rpart_4.1-15          tidyr_1.1.4          
## [136] coda_0.19-4           rmarkdown_2.11        Rtsne_0.15           
## [139] shiny_1.7.1

上一篇下一篇

猜你喜欢

热点阅读