news 2026/8/14 9:18:47

细胞在悄悄“聊天“?用 CellChat 快速破解单细胞通讯网络的完整指南

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
细胞在悄悄“聊天“?用 CellChat 快速破解单细胞通讯网络的完整指南

细胞在悄悄"聊天"?用 CellChat 快速破解单细胞通讯网络的完整指南

【免费下载链接】CellChatR toolkit for inference, visualization and analysis of cell-cell communication from single-cell data项目地址: https://gitcode.com/gh_mirrors/ce/CellChat

把单细胞测序跑完、聚类图画出来,往往只完成了第一个问题——有哪些细胞;紧接着更棘手的问题是:这些细胞之间如何相互影响?CellChat 正是用于从单细胞数据推断、可视化与分析细胞间通讯的 R 工具包,它把你的表达矩阵变成一张张"谁在给谁发信号"的通讯网络图,帮你从聚类结果再往前迈一步。

一个让所有单细胞研究者都沉默的问题

想象这样一个场景:你花了两周跑完 Seurat 的标准流程,UMAP 图上十几个细胞群整整齐齐,你甚至给每个 cluster 都起了名字——巨噬细胞、成纤维细胞、T 细胞、内皮细胞……这时导师走过来问了一句:"这些细胞之间是怎么互相影响的?谁在给谁发信号?"你盯着聚类图,沉默了。

这不是你的问题,而是单细胞数据分析里最普遍的真实困境。聚类能回答"有哪些细胞",但细胞与细胞之间的对话——谁分泌配体、谁表达受体、信号沿着什么通路流动——藏在海量表达矩阵里,肉眼根本看不出来。人工去翻文献逐对验证,几万行数据根本翻不完。

CellChat 就是为回答这个问题而生的。它由华盛顿大学团队开发,自 2021 年发表在 Nature Communications 之后,已经成为单细胞通讯分析领域绕不开的经典工具,被大量肿瘤微环境、发育生物学、免疫学论文引用。

这个工具到底解决什么问题、适合谁

先别被"通讯推断"这个名词吓到。CellChat 的定位非常清楚:输入你已经分好群的单细胞数据,输出细胞之间的通讯网络和一堆能放进论文的图。

它适合的场景很典型:

  • 你已经用 Seurat 或 SingleCellExperiment 完成了聚类,想知道不同细胞类型之间的信号关系;
  • 你想找某个通路(比如 CXCL、TGFb)到底由谁发出、被谁接收;
  • 你想比较正常组和疾病组之间,哪些通讯被增强、哪些被削弱;
  • 你拿到了空间转录组数据(比如 10X Visium),想看细胞在空间距离内的局部通讯。

它的底层逻辑可以浓缩成一句话:把"配体—受体"的已知规则和你的表达数据结合起来,用质量作用定律算出每条通讯的概率,再用置换检验筛出显著的那些。说白了,就是用先验知识当"字典",把数据翻译成通讯事件。

上面这张官方全景图展示了 CellChat 的完整链路:先有人工整理的配体-受体数据库,再基于质量作用定律建模推断通讯概率,随后输出层级图、圆环图、弦图、热图、气泡图等可视化结果,最后还能做网络中心性、通讯模式识别和跨条件比较等深度分析。后面我们会把这四步逐个拆开讲。

三步完成环境配置并跑通第一个示例

CellChat 是一个正经的 R 包,安装并不复杂,但依赖较多(dplyr、igraph、ggplot2、circlize、ComplexHeatmap、NMF 等都在其中),需要 R 3.6.0 及以上版本。

第一步:获取代码并安装

仓库代码可以通过 git 直接克隆到本地:

git clone https://gitcode.com/gh_mirrors/ce/CellChat

然后在 R 里用 devtools 从本地目录安装:

devtools::install_local("CellChat", build_vignettes = TRUE)

如果你更习惯传统方式,也可以在克隆目录下运行R CMD INSTALL .。安装完成后,用library(CellChat)验证即可。

第二步:准备好两样输入

CellChat 需要的输入非常"朴素":

  • 表达矩阵:基因在行、细胞在列,并且必须是归一化并 log 变换后的数据(如果只有原始 count,可以用包内的normalizeData先处理);
  • 细胞分组信息:一个以细胞名为行名的数据框,里面至少有一列是细胞类型标签。

如果你手里的对象已经是 Seurat 或 SingleCellExperiment,更省事——直接传对象进去,再指定group.by参数即可。

library(CellChat) # 方式一:从矩阵 + meta 创建 cellchat <- createCellChat(object = data.input, meta = meta, group.by = "labels") # 方式二:直接从 Seurat 对象创建 cellchat <- createCellChat(object = seurat_obj, group.by = "ident")

第三步:跑通核心推断流水线

创建好对象后,把配体-受体数据库挂上去,然后依次执行以下几步,整条流水线不超过 10 行代码:

# 1. 选择物种对应的数据库(人 / 小鼠 / 斑马鱼) CellChatDB <- CellChatDB.human cellchat@DB <- CellChatDB # 2. 预处理:只保留信号相关基因,识别过表达配体受体 cellchat <- subsetData(cellchat) cellchat <- identifyOverExpressedGenes(cellchat) cellchat <- identifyOverExpressedInteractions(cellchat) # 3. 推断:算通讯概率 -> 过滤 -> 通路层汇总 -> 网络聚合 cellchat <- computeCommunProb(cellchat) cellchat <- filterCommunication(cellchat, min.cells = 10) cellchat <- computeCommunProbPathway(cellchat) cellchat <- aggregateNet(cellchat) # 4. 画图:圆环图展示细胞群之间的通讯强度和数量 netVisual_circle(cellchat@net$count)

到这里,你已经完成了"从数据到通讯网络"的第一次跑通。如果一切顺利,一张漂亮的细胞通讯网络图就会出现在绘图窗口里——恭喜,你离"细胞在聊什么"的答案只差一次解读了。

核心原理拆解:把细胞通讯想象成一场"微信聊天"

光会跑代码还不够,理解原理才能选对参数。这里用一个生活化的类比帮你建立直觉。

把细胞通讯想象成一场热闹的微信群聊:

  • 配体(Ligand)是发送方发出去的消息内容;
  • 受体(Receptor)是接收方手机上的"接收器",只有装了对的接收器,消息才被读到;
  • 共因子(Cofactor)是帮消息送达的"信号增强器",比如让信号更强或更弱的调节分子;
  • 信号通路(Pathway)就是群聊里围绕某个话题展开的一整串对话。

CellChatDB 相当于提前整理好的"通讯录词典":它告诉你哪些基因组合起来能构成一次有效通话(很多配体受体是复合物,比如异二聚体需要两个亚基都表达才行)、哪些辅助分子参与其中、这条通讯属于哪个信号通路。有了这本词典,CellChat 再结合你的表达数据,就能回答:这个群里,谁在说话、说给谁听、音量多大、是否真的被听到了。

需要特别说明的是,CellChatDB 不是自动抓取的数据库,而是人工从文献和 KEGG 等来源逐条整理、校验的。以小鼠数据库为例,它收录了 2021 条经过验证的分子互作,其中约六成是分泌型自分泌/旁分泌信号,两成是细胞外基质-受体互作,近两成是细胞接触型互作;人类数据库收录约 1939 条。这种人工把关保证了后续推断的"词典"质量,这也是很多论文愿意引用它的原因。

三层"翻译":从分子、通路到网络,快速定位关键信号

跑通流水线只是开始,CellChat 真正强大的地方在于它把结果分成了三个层次,你可以在不同粒度上审视同一个问题:

层级对应函数存储位置一句话解释
分子层computeCommunProbnet每条配体-受体边上的通讯概率,最细粒度
通路层computeCommunProbPathwaynetP把同一条通路的所有 L-R 概率汇总,看通路整体强弱
网络层aggregateNetnet$count/net$weight全细胞群之间的通讯边数矩阵和强度矩阵,俯瞰全局

想快速拿到"哪两个细胞群之间有通讯、强度多大"的表格,用subsetCommunication一行就能导出数据框;想看某个通路,比如 CXCL,用netVisual_aggregate可以一键切换层级图、圆环图、弦图、热图四种画法;想追究到某个具体的配体-受体对,就用netVisual_individual

可视化函数看着多,其实都是同一套数据换画法:

函数图型什么时候用
netVisual_aggregate层级/圆环/弦/热图整体看一条通路
netVisual_individual同左细看单个 L-R 对
netVisual_bubble气泡图横比多个 L-R 对
netVisual_chord_gene弦图多通路/多基因的复杂关系
netAnalysis_contribution柱状图看每个 L-R 对在通路中的贡献占比

进阶玩法:四个少有人知的深度分析姿势

基础流程跑通后,如果你还想"再挖深一层",下面这几个功能才是 CellChat 的真正宝藏。

1. 网络中心性分析:找出真正的"话痨"和"听众"。netAnalysis_computeCentrality会为每个细胞群计算出度、入度、流介数、信息中心性等指标,分别对应信号的主导发送者、接收者、中介者和影响者。配合netAnalysis_signalingRole_heatmap出热图,一眼就能看出"谁在指挥、谁在响应"。

2. 全局通讯模式识别:用 NMF 找出"群聊分组"。单个通路看多了容易只见树木不见森林。identifyCommunicationPatterns基于 NMF 分解出若干种通讯模式,再用selectK帮你选模式数量,最后用netAnalysis_river(河流图)和netAnalysis_dot展示哪些细胞群和哪些通路在"协同作战"。

3. 通路相似性聚类:看哪些通路在功能上冗余。computeNetSimilarity支持 functional 和 structural 两种相似度,配合netEmbeddingnetClustering可以把 20 多条信号通路降维聚类,帮你发现功能高度相似、可能冗余的通路组。

4. 多数据集比较:两个条件差异在哪,一目了然。mergeCellChat合并不同条件下的 CellChat 对象后,netVisual_diffInteraction直接画出通讯差异网络,rankNet对比通路强度排名,netAnalysis_signalingChanges_scatter定位具体某个细胞群的信号变化。这套组合拳是发比较类论文的利器。

另外还有一个容易被忽略的冷门技巧:如果你只想关注某几个细胞群,用subsetCellChat切出子集再分析,速度会快很多;想验证某个基因在每个细胞群里的平均表达,computeAveExpr可以帮你"盯住"信号基因的表达水平;如果测序深度浅、dropout 严重,projectData(cellchat, PPI.human)可以把表达量投影到蛋白互作网络上做平滑,再用raw.use = FALSEcomputeCommunProb重算,常常能救回一批被淹没的弱信号。

新手最容易踩的 5 个坑

作为老用户,下面这几个坑几乎人人都踩过,提前知道能帮你省下大半天。

1. 基因名格式不统一。人、鼠基因名大小写规则完全不同,物种选错数据库或者基因名格式不一致,会导致通讯结果大面积为空。先用checkGeneSymbol校验一下数据里的基因名能否在数据库里对上。

2. 把 count 数据直接喂进去。CellChat 要求归一化 + log 变换后的数据。如果强行用原始 count,概率估计会明显失真。分不清的话,先用normalizeData处理一遍最稳妥。

3. 平均表达方法选错,通路"静音"。computeCommunProb默认用 triMean 这种稳健均值,结果更保守,但可能漏掉一些真实存在的弱通路。如果你明明知道某个通路很重要却算不出来,试试type = "truncatedMean", trim = 0.1

4. 忽略细胞数很少的组别。某个细胞群只有几个细胞时,算出来的通讯概率噪声很大。filterCommunication(cellchat, min.cells = 10)这步别省。

5. 加载旧版本对象直接报错。1.6.0 之后对象结构重新设计过,如果你手里是旧版本存下来的.rds,记得先跑一次updateCellChat

生态、版本与社区现状

CellChat 目前仓库内版本为 1.6.1,采用 GPL-3 开源协议。它的版本迭代脉络很清晰:1.0 版本对应 2021 年 Nature Communications 的正式发表;1.4 加入了富集分数计算和条形图;1.6 版本是一个重要里程碑——正式支持空间转录组数据,新增netVisual_spatialcomputeRegionDistance,可以把通讯限制在分子的实际扩散距离内,适用于 10X Visium 等平台的数据。

这里要如实提醒你一点:作者团队已经把 CellChat 升级到了v2,并在新仓库中继续维护和开发(v2 的完整协议见 2023 年的预印本,重点是空间解析转录组方向),当前这个仓库作为 v1 时代的代码镜像保留,不会再有新功能更新。换句话说:如果你追求稳定复现经典流程,用这个仓库的 v1 足够;如果想要最新功能,建议关注 v2。

项目的tutorial/目录是真正的宝藏,里面躺着 7 份可以直接跑通的教程:基础的CellChat-vignette.Rmd、空间成像数据分析、多数据集比较(包括细胞组成不同时的比较)、与其他单细胞分析工具的对接、以及如何自定义更新 CellChatDB。如果你想把自己发现的配体-受体对加进数据库,跟着Update-CellChatDB.Rmd走一遍就能学会。

写在最后:让数据开口说话

回到开头的场景。同样是"细胞之间如何互相影响"这个问题,有了 CellChat,你不再需要盯着 UMAP 图干瞪眼。十几行代码之后,你能清楚地告诉导师:哪群细胞是信号源、哪群是接收者、哪个通路在暗中主导,甚至还能指出疾病组里哪条通讯被异常放大。

这就是这类工具的价值——它把一张静态的"细胞类型地图",升级成一张动态的"细胞社交网络"。而你要做的,只是迈出第一步。

现在就去实践吧:克隆仓库git clone https://gitcode.com/gh_mirrors/ce/CellChat,先把tutorial/CellChat-vignette.Rmd完整跑通一遍,然后换成你自己的数据试一次。等第一张通讯网络图出现在屏幕上,你会理解为什么那么多论文都选择了它。

【免费下载链接】CellChatR toolkit for inference, visualization and analysis of cell-cell communication from single-cell data项目地址: https://gitcode.com/gh_mirrors/ce/CellChat

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/14 9:12:57

案例一:某大型运营商基于AI技术的数据中心智能化运维实践

案例关键词:智能化运维运维大模型数据中心安全运营 实践感悟:智能化运维的演进不仅需要AI算法与工具的引入&#xff0c;更需要将大模型的能力与实际运维场景深度融合&#xff0c;从而实现从被动响应到主动预防的运维范式转变。在现阶段的“人机共智”中&#xff0c;AI承担了全天…

作者头像 李华
网站建设 2026/8/14 9:12:26

前端开发者如何构建AI全链路工作流:从需求到部署的智能提效实践

1. 从“切图仔”到“流程架构师”&#xff1a;一个前端老兵的AI工作流转型之路干了十几年前端&#xff0c;从最早的jQuery一把梭&#xff0c;到后来的React全家桶、Vue生态&#xff0c;再到现在的微前端、低代码平台&#xff0c;我自认为算是见证了前端这个行当的“野蛮生长”。…

作者头像 李华
网站建设 2026/8/14 9:04:18

深入解析String类:从不可变性到性能优化的编程实践

1. 项目概述&#xff1a;为什么我们需要重新审视String类&#xff1f;在编程世界里&#xff0c;无论你是刚入门的新手&#xff0c;还是摸爬滚打多年的老手&#xff0c;有一个类你几乎每天都会和它打交道&#xff0c;那就是String。它太常见了&#xff0c;常见到我们常常会忽略它…

作者头像 李华
网站建设 2026/8/14 9:02:47

SQL重构:从语法到思维的全面升级,打造高效可维护的数据库查询

1. 从“复习”到“重构”&#xff1a;为什么你的SQL需要一次系统性重写“SQL语句书写复习”——看到这个标题&#xff0c;你脑海里浮现的是什么&#xff1f;是大学课本里那些SELECT * FROM student的简单示例&#xff0c;还是工作中那些动辄几十行、嵌套五六层、连自己都看不懂…

作者头像 李华
网站建设 2026/8/14 9:02:26

小熊猫Dev-C++:免费开源的C++开发环境,从零到跑通只需5分钟

小熊猫Dev-C&#xff1a;免费开源的C开发环境&#xff0c;从零到跑通只需5分钟 【免费下载链接】Dev-CPP A greatly improved Dev-Cpp 项目地址: https://gitcode.com/gh_mirrors/dev/Dev-CPP 学C最痛苦的从来不是语法&#xff0c;而是搭环境——装编译器、配环境变量、…

作者头像 李华