⑤单细胞学习-cellchat组间通讯差异分析

时间:2024-12-10 22:01:03

目录

1,数据加载

2, 分别创建CellChat对象

①LS组数据

②NL组数据

3,分别构建cellchat文件

①构建LS组cellchat数据

②构建NL组cellchat数据

4,进行cellchat分析

①LS组的cellchat分析

②NL组的cellchat分析

5,合并分组cellchat对象

①数据加载

②合并cellchat对象

进行分析

1.总体比较:通讯数目与通讯强度差异

2.细胞亚群水平的通讯差异

2.1 细胞通讯差异网络图

2.2 细胞通讯差异热图

3.信号通路水平的通讯差异

3.1 组间富集信号通路差异条形图

3.2 传出信号通路水平热图

3.3 传入信号通路水平热图

3.4 总体信号通路水平热图

4.配受体对水平通讯差异

4.1 总配受体对概率差异气泡图

4.2 区分上下调配受体对

5.单个/特定信号通路水平差异可视化

5.1网络图

5.2热图

④-2单细胞学习-cellchat单数据代码补充版(通讯网络)-****博客

1,数据加载
  1. # 包的加载
  2. #CellChat细胞通讯之组间差异分析#
  3. rm(list=ls())
  4. library(CellChat)
  5. library(patchwork)
  6. library(ggplot2)
  7. library(Seurat)
  8. library(ggalluvial)#绘制桑基图
  9. library(expm)
  10. library(sna)
  11. library(NMF)
  12. library(ComplexHeatmap)
  13. options(stringsAsFactors = FALSE)##输入数据不自动转换成因子(防止数据格式错误)

数据加载

  1. #数据加载################
  2. load("data_humanSkin.Rdata")#数据加载:这里是count data数据
  3. data.input = data_humanSkin$data#需标准化的基因表达量矩阵和细胞分组信息文件
  4. #dat <- as.data.frame(data.input)#可以查看表达矩阵 [1] 17328 7563
  5. meta = data_humanSkin$meta
  6. data.input[1:6,1:3]#表达count
  7. head(meta);table(meta$condition) #含normal(NL)和diseases(LS)
  8. unique(meta$labels) #检查细胞亚群标签类型

2, 分别创建CellChat对象
①LS组数据
  1. #LS组数据
  2. cell.use1 = rownames(meta)[meta$condition == 'LS'] #提取LS的细胞名称
  3. data.input1 = data.input[, cell.use1]#提取LS表达矩阵
  4. meta1 = meta[cell.use1, ]#提取LS细胞信息
  5. identical(rownames(meta1),colnames(data.input1)) #检查矩阵列名和分组文件行名是否一致
  6. unique(meta1$labels) #检查细胞亚群标签类型
②NL组数据
  1. #NL组数据
  2. cell.use2 = rownames(meta)[meta$condition == 'NL'] #提取NL的细胞名称
  3. data.input2 = data.input[, cell.use2]#提取NL表达矩阵
  4. meta2 = meta[cell.use2, ]#提取NL细胞信息
  5. identical(rownames(meta2),colnames(data.input2)) #检查矩阵列名和分组文件行名是否一致
  6. unique(meta2$labels) #检查细胞亚群标签类型
  7. #数据检查:不同分组的细胞系检查
  8. setdiff(unique(meta1$labels),unique(meta2$labels))#character(0) 细胞分类都是一致的
3,分别构建cellchat文件
①构建LS组cellchat数据
  1. #分别构建cellchat文件
  2. ##构建LS组cellchat数据
  3. cellchatLS <- createCellChat(object = data.input1, #支持normalized表达矩阵,Seurat对象,和SingleCellExperiment对象
  4. meta = meta1, #meta文件
  5. group.by = 'labels') #meta中的细胞分类列
②构建NL组cellchat数据
  1. ##构建NL组cellchat数据
  2. cellchatNL <- createCellChat(object = data.input2, #支持normalized表达矩阵,Seurat对象,和SingleCellExperiment对象
  3. meta = meta2, #meta文件
  4. group.by = 'labels') #meta中的细胞分类列
  5. save(cellchatLS, cellchatNL, file = "")#暂存分组的cellchat数据
4,进行cellchat分析
①LS组的cellchat分析
  1. #重新加载数据进行cellchat分析#################################################
  2. rm(list=ls())
  3. load("")
  4. #LS组的cellchat分析
  5. cellchat <- cellchatLS
  6. cellchat <- setIdent(cellchat, = 'labels') #将label设置为显示的默认顺序
  7. levels(cellchat@idents) #查看celltype和factor顺序
  8. table(cellchat@idents) #每个celltype中的细胞数
  9. cellchat@DB <- ##设置配受体数据库(CellChatDB):
  10. cellchat <- subsetData(cellchat)##信号基因的表达矩阵子集 赋值到cellchat@
  11. cellchat <- identifyOverExpressedGenes(cellchat)##鉴定与每个细胞亚群相关的过表达信号基因
  12. cellchat <- identifyOverExpressedInteractions(cellchat)##识别过表达基因配体-受体互作
  13. cellchat <- projectData(cellchat, )#将基因表达数据映射到PPI网络(可跳过)
  14. cellchat <- computeCommunProb(cellchat, = TRUE) #计算细胞通讯概率
  15. cellchat <- filterCommunication(cellchat, = 10)##细胞通讯过滤
  16. cellchat <- computeCommunProbPathway(cellchat)#计算信号通路水平上的通讯概率
  17. cellchat <- aggregateNet(cellchat)#计算细胞对间通讯的数量和概率强度
  18. cellchat <- netAnalysis_computeCentrality(cellchat,#计算网络中心性权重:识别每类细胞在信号通路中的角色/作用
  19. = "netP")
  20. cellchatLS <- cellchat
  21. saveRDS(cellchatLS, "")
②NL组的cellchat分析
  1. #cellchatNL组的cellchat分析
  2. rm(list=ls())
  3. load("")
  4. cellchat <- cellchatNL
  5. cellchat <- setIdent(cellchat, = 'labels') #将label设置为显示的默认顺序
  6. levels(cellchat@idents) #查看celltype和factor顺序
  7. table(cellchat@idents) #每个celltype中的细胞数
  8. cellchat@DB <- ##设置配受体数据库(CellChatDB):
  9. cellchat <- subsetData(cellchat)##信号基因的表达矩阵子集 赋值到cellchat@
  10. cellchat <- identifyOverExpressedGenes(cellchat)##鉴定与每个细胞亚群相关的过表达信号基因
  11. cellchat <- identifyOverExpressedInteractions(cellchat)##识别过表达基因配体-受体互作
  12. cellchat <- projectData(cellchat, )#将基因表达数据映射到PPI网络(可跳过)
  13. cellchat <- computeCommunProb(cellchat, = TRUE) #计算细胞通讯概率
  14. cellchat <- filterCommunication(cellchat, = 10)##细胞通讯过滤
  15. cellchat <- computeCommunProbPathway(cellchat)#计算信号通路水平上的通讯概率
  16. cellchat <- aggregateNet(cellchat)#计算细胞对间通讯的数量和概率强度
  17. cellchat <- netAnalysis_computeCentrality(cellchat,#计算网络中心性权重:识别每类细胞在信号通路中的角色/作用
  18. = "netP")
  19. cellchatNL <- cellchat
  20. saveRDS(cellchatNL, "")
  21. #######################################################

5,合并分组cellchat对象
①数据加载
  1. #两个特应性皮炎患者的皮肤样本数据集:非病变性(NL,正常)和病变性(LS,患病)
  2. rm(list=ls())
  3. cellchatNL <- readRDS("")
  4. cellchatLS <- readRDS("")
  5. levels(cellchatNL@idents)
  6. levels(cellchatLS@idents)
  7. identical(levels(cellchatNL@idents),levels(cellchatLS@idents))#数据检查一致的[1] TRUE
②合并cellchat对象
  1. #合并cellchat对象:
  2. object.list <- list(NL = cellchatNL,
  3. LS = cellchatLS) #对照组(NL)在前,比较组(LS)在后,注意顺序
  4. cellchat <- mergeCellChat(object.list, add.names = names(object.list))
  5. cellchat
  6. dplyr::glimpse(cellchat)#数据结构查看
  7. ##合并内容:'','images','net','netP','meta','idents','','DB',and 'LR'

接下来开始组间cellchat分析


1.总体比较:通讯数目与通讯强度差异
  1. #1.总体比较:通讯数目与通讯强度差异
  2. p1 <- compareInteractions(cellchat, = F, group = c(1,2))
  3. p2 <- compareInteractions(cellchat, = F, group = c(1,2),
  4. measure = "weight")
  5. p1 + p2

左图展示了两数据集通讯数量间的差异,右图则展示了通讯强度间的差异。

2.细胞亚群水平的通讯差异
2.1 细胞通讯差异网络图
  1. #2.细胞亚群水平的通讯差异
  2. par(mfrow = c(1,2), xpd = TRUE)
  3. netVisual_diffInteraction(cellchat, = T)
  4. netVisual_diffInteraction(cellchat, = T, measure = "weight")

展示了样本间所有细胞亚群中的配受体对数目差异(左)及通讯概率差异(右);外周圆不同颜色代表不同细胞亚群,大小表示亚群的配受体对数目,圈越大,细胞间配受体对数目比值越大.蓝线表示对照组通讯较强,红线表示比较组通讯较强。线越粗表示通讯变化程度越强。

2.2 细胞通讯差异热图
  1. #细胞通讯差异热图
  2. p3 <- netVisual_heatmap(cellchat)
  3. p4 <- netVisual_heatmap(cellchat, measure = "weight")
  4. p3 + p4
  5. dev.off()

纵坐标为配体细胞,横坐标为受体细胞,热图颜色代表通讯概率差异,颜色越深,通讯越强。上侧和右侧的柱子是纵轴和横轴通讯概率差异的累积。左图为细胞间配受体对数目差异,右图为通讯概率差异。

3.信号通路水平的通讯差异
3.1 组间富集信号通路差异条形图
  1. #3.信号通路水平的通讯差异
  2. ##基于信息流或互作数对信号通路进行排序
  3. p5 <- rankNet(cellchat, mode = "comparison", stacked = T, = TRUE) #堆叠
  4. p6 <- rankNet(cellchat, mode = "comparison", stacked = F, = TRUE) #不堆叠
  5. p5 + p6

当比较(LS)组与对照组(NL)的通路概率总和的比值<0.95且差异pval<0.05(秩和检验)时,则该通路在对照组中的通讯强度显著增加(纵坐标为红色);当比较组与对照组的通路概率总和的比值>1.05且差异pval<0.05时,则该通路在比较组中的通讯强度显著增加(纵坐标为蓝色);纵坐标为黑色表示该通路在两组间没有差异。左侧为比例图,右侧为实际数值比对图。

3.2 传出信号通路水平热图
  1. # 传出信号通路水平热图
  2. i = 1
  3. <- union(object.list[[i]]@netP$pathways,
  4. object.list[[i+1]]@netP$pathways)
  5. ht1 = netAnalysis_signalingRole_heatmap(object.list[[i]],
  6. pattern = "outgoing", #传出
  7. signaling = ,
  8. title = names(object.list)[i],
  9. width = 5,
  10. height = 6)
  11. ht2 = netAnalysis_signalingRole_heatmap(object.list[[i+1]],
  12. pattern = "outgoing", #传出
  13. signaling = ,
  14. title = names(object.list)[i+1],
  15. width = 5,
  16. height = 6)
  17. draw(ht1 + ht2, ht_gap = unit(0.5, "cm"))

3.3 传入信号通路水平热图
  1. #传入信号通路水平热图
  2. ht3 = netAnalysis_signalingRole_heatmap(object.list[[i]],
  3. pattern = "incoming", #传入
  4. signaling = ,
  5. title = names(object.list)[i],
  6. width = 5, height = 6,
  7. = "GnBu")
  8. ht4 = netAnalysis_signalingRole_heatmap(object.list[[i+1]],
  9. pattern = "incoming", #传入
  10. signaling = ,
  11. title = names(object.list)[i+1],
  12. width = 5, height = 6,
  13. = "GnBu")
  14. draw(ht3 + ht4, ht_gap = unit(0.5, "cm"))

3.4 总体信号通路水平热图
  1. #总体信号通路水平热图
  2. ht5 = netAnalysis_signalingRole_heatmap(object.list[[i]],
  3. pattern = "all", #总体
  4. signaling = ,
  5. title = names(object.list)[i],
  6. width = 5, height = 6,
  7. = "OrRd")
  8. ht6 = netAnalysis_signalingRole_heatmap(object.list[[i+1]],
  9. pattern = "all", #总体
  10. signaling = ,
  11. title = names(object.list)[i+1],
  12. width = 5, height = 6,
  13. = "OrRd")
  14. draw(ht5 + ht6, ht_gap = unit(0.5, "cm"))

纵坐标为信号通路,横坐标为细胞亚群,热图颜色代表信号强度,颜色越深,通讯越强。上侧和右侧的柱子是纵轴和横轴强度的累积。左图NL组,右图LS组。

4.配受体对水平通讯差异
4.1 总配受体对概率差异气泡图
  1. levels(cellchat@idents$joint) #查看细胞亚群
  2. netVisual_bubble(cellchat,
  3. sources.use = 4,
  4. targets.use = c(5:12),
  5. comparison = c(1, 2),
  6. = 45)

4.2 区分上下调配受体对
  1. p7 <- netVisual_bubble(cellchat,
  2. sources.use = 4,
  3. targets.use = c(5:12),
  4. comparison = c(1, 2),
  5. = 2,
  6. = "Increased signaling in LS",
  7. = 45,
  8. = T) #Increased为比较组通讯概率更强的配受体对信息
  9. p8 <- netVisual_bubble(cellchat,
  10. sources.use = 4,
  11. targets.use = c(5:12),
  12. comparison = c(1, 2),
  13. = 1,
  14. = "Decreased signaling in LS",
  15. = 45,
  16. = T) #Decreased为对照组通讯概率更强的配受体对信息
  17. p7 + p8

在气泡图中,横坐标为细胞对,颜色区分样本;纵坐标为配受体。气泡的大小表示p值,p值越小气泡越大。颜色表示通讯概率的大小。

5.单个/特定信号通路水平差异可视化
5.1网络图
  1. #使用网络图:
  2. <- c("CXCL") #选择目标信号通路
  3. <- getMaxWeight(object.list,
  4. = c("netP"),
  5. attribute = ) #控制不同数据集的边权重
  6. par(mfrow = c(1,2), xpd = TRUE)
  7. for (i in 1:length(object.list)) {
  8. netVisual_aggregate(object.list[[i]],
  9. signaling = ,
  10. layout = "circle",
  11. = [1],
  12. = 10,
  13. = paste(, names(object.list)[i]))
  14. }

5.2热图
  1. <- c("CXCL")
  2. par(mfrow = c(1,2), xpd = TRUE)
  3. ht <- list()
  4. for (i in 1:length(object.list)) {
  5. ht[[i]] <- netVisual_heatmap(object.list[[i]],
  6. signaling = ,
  7. = "Reds",
  8. = paste(, "signaling ",names(object.list)[i]))
  9. }
  10. ComplexHeatmap::draw(ht[[1]] + ht[[2]], ht_gap = unit(0.5, "cm"))


参考:

1:单细胞分析之细胞交互-3:CellChat - 简书 ()

2:CellChat细胞通讯分析(下)--实操代码·多个数据集比较分析 - 知乎 ()

3:CellChat细胞通讯之组间差异分析 ()

4:focuslyj/CellChat ()