
有段时间没在博客里写生信实操了今天想认真聊聊一个我这两年重复用得最多、也是让很多刚入门的朋友一头雾水的数据库——CMap。如果你手头正好有一堆RNA-seq或者芯片数据跑完差异分析拿到上调下调基因列表但下一步不知道往哪走那这篇就是给你准备的。我们要做的事情很具体把基因表达谱变成药物重定位的线索再把这些线索用图表清晰地讲出来。这个过程不玄幻也不难但它需要你把CMap背后的逻辑吃透否则出来的结果就是一堆你解释不了的分数和气泡图。这篇内容适合正在做疾病机制、药物筛选、中药药理或者想低成本做新适应症探索的人也适合被审稿人要求“补一个CMap分析”却不知道该怎么交差的研究生。我会把从表达谱提取、签名构建、查询参数选择到结果解读与可视化的完整链路走一遍重点讲那些数据库官方文档不会写、但你在实际操作中一定用得上的细节。1. CMap的核心逻辑与药物重定位的底层思路1.1 “连接”到底是什么意思CMap全称是Connectivity Map中文常译作“连接图谱”由布罗德研究所的Justin Lamb团队在2006年发起。当时他们做的事情很朴素把大量药物处理细胞后产生的基因表达谱存下来形成一个参考数据库。然后你把自己疾病样本的表达谱拿过来去数据库里找“反向”或“正向”的相关性。如果某个药物的表达谱恰好能逆转你疾病状态下的表达方向那这个药就有潜力治疗这种病。这里的关键词是“逆转”。疾病状态下某些基因上调、某些基因下调如果一种药物能让这些基因的表达方向反过来那么该药物就可能把病态细胞拉回正常状态。这比传统的“找到一个靶点再筛一堆化合物”要快得多因为它不依赖你对致病机制的完整理解只要表达谱方向的关联成立就可以产生候选药物。这就是药物重定位也叫药物再利用英文drug repurposing或drug repositioning。1.2 从经典版到LINCS版本差异要知道不同文献里提到的CMap很可能是两个完全不同的东西。早期经典版CMap数据量不大大概覆盖1300多个小分子化合物大多还都是FDA已批准药物检测平台也是老式的Affymetrix芯片。当时做一次分析需要在网页上提交返回结果也相对简单。后来随着LINCS计划Library of Integrated Network-Based Cellular Signatures推进CMap数据全面升级检测平台换成了L1000技术即通过测量1000个标志基因的表达量再推断全基因组表达趋势覆盖的扰动类型也大幅扩展包括小分子、shRNA、过表达质粒、抗体等。现在大家说的CMap很多时候其实是指CLUE平台clue.io背后的数据集。我下面的实操部分会以新版CMap为主同时提到经典版工具因为不少课题组的分析流程仍然沿用老方法你知道区别才能灵活对应文献里的描述。1.3 逆向思维的价值也有限制CMap的逆向关联思想听起来很简单但它的适用范围是有边界的。它假设疾病状态可以用一组差异表达基因来表征又假设药物作用可以用另一组转录变化来描述。这两个假设在很多场景下成立但并不普遍。比如某些疾病的核心驱动事件是蛋白质层面的构象改变或翻译后修饰转录组层面变化可能很微弱又比如疾病组织由复杂的细胞类型构成而CMap数据库的参考谱大多来自癌细胞系或永生化细胞系这种细胞环境的差异会直接影响相关性判断。所以从一开始就要摆正心态CMap是产生假说的工具不是验证因果的实验终点。它给你的是一份“值得看看”的候选名单至于候选药物在真实疾病模型里是否有效需要后续实验去确认。多数发表的CMap相关研究也是这样用的先筛出候选药再做体内外验证。别指望输入一组基因就能直接回答“这个药能不能治这个病”CMap回答的是“哪些化合物在转录组层面和你的疾病特征存在有趣的连接”。2. 实操前置表达谱如何整理成可查的“签名”2.1 签名Signature是什么好的签名长什么样在CMap分析里你要提交的不是全部表达矩阵而是一个压缩过的基因签名。简单理解签名就是你疾病状态的特征指纹通常是一组上调基因和一组下调基因。这些基因来自你自己数据的差异表达分析。一个高质量的签名要满足几个条件基因数不能太少太少覆盖不了疾病特征但也不能太多太多会引入噪声导致打分趋平区分度下降。我通常习惯上调下调各取100到300个基因这个范围能兼顾稳定性和特异度。排序依据是差异倍数和显著性综合后的打分常规做法是用差异倍数加调整后p值做双重筛选再按实际需要裁剪数量。签名基因还必须是数据库平台能识别的基因。L1000平台本身只直接测量1000个标志基因但官方已经通过推断算法为全基因组约一万两千多个基因提供了表达改变数据。所以你的基因只要是常见蛋白编码基因基本都能映射到只是不同物种之间需要注意转换人是人的符号小鼠要做同源转换这点后面再细说。2.2 DESeq2标准流程里如何截取签名基因假设你的数据是转录组count矩阵使用的是DESeq2做差异分析。运行完results()之后你会得到每个基因的log2FoldChange和padj。我这里给一个常见的截取逻辑。用代码表示很直接# 假设res是DESeq2的结果对象 library(dplyr) res_df - as.data.frame(res) %% tibble::rownames_to_column(gene) up_genes - res_df %% filter(padj 0.05, log2FoldChange 0.5) %% arrange(desc(log2FoldChange)) %% head(150) down_genes - res_df %% filter(padj 0.05, log2FoldChange -0.5) %% arrange(log2FoldChange) %% head(150)head(150)这一步看似随意其实很有讲究。我对比过取50、100、150、300个基因的查询结果发现对于大多数数据集上下调各100到150个基因时结果相对稳定且富集信号最强。基因太少连接分数容易受个别强差异基因驱动假阳性高基因太多背景噪声抵消信号显著富集的药物就会被淹没。2.3 物种转换与基因名规范问题做人类疾病数据还好来就是人类基因符号直接提交即可。但如果你做的是小鼠疾病模型就必须做同源转换否则CMap数据库里根本匹配不上。转换工具可以用biomaRt也可以直接去MGI数据库下载同源列表定制映射。这里分享一个我在实操中碰到的坑小鼠基因符号首字母大写、其余小写如Cd44换成人类对应符号时如CD44如果不做统一大小写处理很容易出现一部分基因匹配不到。我的建议是在转化后生成一个干净的人类基因符号列表再用unique()去重同时过滤掉已经被合并到历史符号中的旧别名aliases。CMap官方虽然做了部分别名映射但它优先识别标准符号你给得越规范匹配率越高结果就越可信。3. 查询CMap关键参数与打分机制解读3.1 去哪里查CLUE平台与经典CMap两个入口新版CMap数据查询推荐去CLUE平台clue.io注册后登录进入“Query”页面选择“Data type”为“Gene Expression”把你的上调基因和下调基因分别粘贴进去即可。CLUE的界面这几年改版过几次但核心操作逻辑没变你指定上传或下调列表选择参考数据库版本建议直接使用最新构建点击查询然后等待结果返回。经典版的入口则是原版CMap网页连接的是早期Lamb数据。虽然它的数据量小但很多经典文献里的结果就是基于那个版本做的如果你是为了复现文献分析那就得用经典版。两个入口我都用过人的习惯是探索新结果用CLUE复现老研究用经典版。别拿新版数据去硬套老文献里的结论时代背景不同数据的可比性有限。3.2 查询界面里的参数怎么选第一次用CLUE的人通常会被一堆选项吓到其实核心就几个参考数据集选“L1000 Differential Expression”相关集合细胞系选择方面如果没特殊需求默认使用全部细胞系的结果即可扰动类型选“small molecule”时间点和浓度可以不限因为CLUE默认综合多个条件给出一个综合连接分数官方叫“average”的计算方式。如果你有明确的机制偏好比如只想看激酶抑制剂那可以在筛选条件里加扰动类别的过滤。但我个人建议第一轮查询不要加额外过滤条件先看全景观测让数据自己说话。第一轮结果出来后如果候选药物里确实出现某类化合物富集比如多个组蛋白去乙酰化酶抑制剂那这本身就是一条有价值的机制线索。3.3 连接分数、富集方向和p值怎么读CLUE返回的每个查询结果都带有几个关键指标。首先是Connectivity Score有的地方标注为“Score”范围从-100到100。负分表示候选药物的表达谱与你的疾病签名反向相关即药物可能逆转疾病特征这正是药物重定位最关心的方向。正分则意味着药物效果与疾病特征一致在很多场景下代表着该药物可能有类似疾病诱导的副作用或者在疾病动物模型里会加重病情。正分数不是没价值它提示了风险例如筛选化疗辅助用药时你肯定不想选一个正分极高、把疾病通路往反方向推的化合物。还有一个常见指标是up/down pathway enrichment信息CLUE返回结果里会展示富集图显示你的上调基因是否在药物处理后的下调基因集合中显著出现、你的下调基因是否在药物处理后的上调集合中显著出现。双向都显著意味着强负相关这种药品值得优先关注。p值方面CLUE给的是置换检验推导的经验p值可以理解为“随机提交一组等量基因得到当前分数的概率”。p值越小越好但注意大查询量会产生多重比较问题所以要以调整后的显著性为标准。经验上我倾向只看连通分数绝对值大于等于90、且调整后p值小于0.05的候选分数绝对值低于80的就作为次级候选一般不会再深挖。4. 可视化分析如何把结果讲成一条清晰的故事线4.1 最常见的四类图分别讲什么查询完成后得到一堆候选药物但直接贴表格到文章里很劝退也不利于你的思考。这时就需要可视化。围绕CMap结果我在实际写论文做汇报时最常用到四类图。第一类是最简单的排名条形图横坐标是候选药物的连接分数排序可以用彩色区分正负一眼看出哪些化合物负分最显著。第二类是富集图enrichment plot这是连接分析的本质所在展示你的签名基因在药物处理数据中的排序分布如果上调基因显著集中在药物下调基因列表的头部就会形成一种类似GSEA富集图的陡峭曲线。第三类是散点或气泡图展示多个候选药物的连通分数与p值关系某种程度上是火山图的变异。第四类是热力图展示每个候选药物对应的标志基因表达方向矩阵常作为补充证据放在补充材料里。4.2 手把手画一张排名条形图排名条形图最适合快速汇报。我一般用R画代码很简单library(ggplot2) # 假设cmap_result是查询结果包含pert_name, score, p_adjust top_hits - cmap_result %% arrange(score) %% head(20) top_hits$pert_name - factor(top_hits$pert_name, levels top_hits$pert_name[order(top_hits$score)]) ggplot(top_hits, aes(x score, y pert_name, fill score 0)) geom_col() scale_fill_manual(values c(FALSE #C0392B, TRUE #2980B9)) labs(x Connectivity Score, y ) theme_minimal() theme(legend.position none)其实把这段代码里面的score字段替换成CLUE导出表格的对应列就能直接跑通。先按分数升序排列最负分的排在上面然后把颜色定为负分蓝色、正分红色不用加其他花哨的装饰审稿人和导师都能立刻抓住重点。4.3 富集图的画法与解读心得富集图的画法稍微复杂一点但更接近CMap的原理本质。如果排名条形图告诉你“哪些药靠前”富集图告诉你的是“为什么靠前”。对于候选药物A你把所有基因按照药物处理后表达变化从高到低排列然后把你的签名基因在其中的位置标出来。如果上调基因大量集中在最左边即药物处理后显著下调的基因区域同时下调基因集中在最右边那药物的作用方向和你的疾病签名完全相反这就是强负连接。我常用的视觉化办法是累积曲线把ranked list按照药物表达变化排序后逐个基因检查是否为签名基因画出累积分布曲线。再配合一个简单的手绘示意图放在博文里大家理解起来会轻松得多。实际出图时我习惯画一个先用fgsea跑GSEA再画标准富集图的方法因为GSEA的图例展示最成熟而且审稿人熟悉。如果你不想引入太重的工作流那就用ggplot2自己画累积分布线两条线错开越大连接越显著。4.4 热力图与分子网络作为补充的证据热力图可以用来展示多个候选药物在若干关键标志基因上的表达方向。举例来说你的疾病里IL6、TNF、STAT3都上调如果某个候选药物能把它们显著下调那这个药在炎症通路上就具备很大的逆转潜力。这种图可以直接把几个药物处理微阵列或RNA-seq里的表达值框出来。更进阶一点的做法是把候选药物对应的已知靶点拉出来构建一个简单的药物-靶点网络用Cytoscape去画。网络图放在文章中很有说服力但要注意的是靶点信息大多来自DrugBank公开数据标注清楚来源即可。可视化本身不做预测它只是把你查询结果中潜在的机制线索整理出来让读者一目了然。5. 完整实战一个炎症性疾病的药物重定位分析5.1 场景设定与数据来源为了让整个流程更直观我模拟一个非常典型的炎症性肠病IBD研究场景。假设你有IBD患者的肠黏膜转录组数据对照是正常组织。差异分析后得到一批显著差异基因利用这些基因构建CMap签名。这种场景在文献里大量存在实际操作也基本一致。在CMap的参考谱里我们要寻找的是能够逆转IBD黏膜炎症相关的转录特征的药物。5.2 分析步骤全流程具体流程分五步。第一步是从差异结果中筛选显著差异基因上下调各150个整理成两个范围明确的文本列表。第二步是打开CLUE的Query页面粘贴上调和下调基因列表选择L1000数据集作为参考库提交查询。第三步是等待页面返回结果通常几分钟到十几分钟不等取决于当时的服务器负载。第四步是导出结果表包含所有候选药物的score、p值和具体连接的pert_desc等细节。第五步是在R里画图并依据分数和显著性圈定重点候选药。需要注意的是CLUE的结果页默认展示的是Top结果但完整结果表一定要点导出按钮下载下来。导出的表格会有上百行看起来很像的化合物它们其实是同一种药物的不同细胞系或不同浓度的重复记录。在记录分数时我会手动保留每个化合物在全部条件下综合评分那一条记录避免一个药占多个席位导致排名虚高。5.3 结果解读示范在我的模拟数据中排名靠前的负连接药物里出现了几个有意思的类别。一个是热休克蛋白抑制剂如格尔德霉素类似物另一个是HDAC抑制剂还有一个是糖皮质激素类药物。这三类药物治疗炎症性疾病的合理性其实各有不同的层次。糖皮质激素自不必说是临床常规药它的出现相当于一种阳性对照——数据没有骗你。HDAC抑制剂近年来在炎症和免疫调节里确实有不少报道它可能是通过改变组蛋白乙酰化状态来调节炎症基因表达程序的。热休克蛋白抑制剂则提示蛋白质稳态在炎症通路中的潜在作用这种线索去查文献会发现不少可挖的东西。这就是一个典型的从CMap到机制推断的路径先看到负连接显著的化合物类别再去PubMed验证其治疗疾病的报道最终锁定最值得做实验验证的候选。5.4 验证环节简要说两句无论如何CMap的分析只是起点。验证环节最常见的有两步第一步是在体外细胞模型里做剂量梯度的药物处理用qPCR或Western blot确认签名基因的表达变化方向和CMap预测一致第二步是动物模型治疗实验看疾病表型是否缓解。对于从小分子药物筛选角度的课题往往还要做靶点结合的确认这就超出生信分析的边界了。但假如你只是想发一篇生信文章那至少要在独立数据集里做验证确认疾病签名在另一个数据集里依然能重现再用CMap跑一遍看看候选药物排名是否稳定。6. 常见问题与避坑实录6.1 为什么我的查询结果分数普遍很低这是后台私信里最常被问到的问题。多数情况下原因有两个签名基因质量不佳或者基因列表里掺杂了大量数据库无法映射的基因。如果你贴进去的基因ID有相当一部分是别名、旧符号、非编码RNA甚至Ensembl ID匹配率会低得可怜噪声就会淹没信号。解决方法是先做标记。CLUE在查询结果侧边栏会显示你输入的基因有多少被成功识别。如果识别率低于70%就得回头清理基因符号。我的习惯是提交之前先用org.Hs.eg.db查一遍标准基因符号再去掉线粒体基因和核糖体蛋白基因。核糖体蛋白基因、热休克蛋白基因这类在几乎所有扰动下都会变化的管家型应激基因应当按需过滤否则它们会带来大量非特异性连接。6.2 排名靠前的药物为什么反复出现LX-某某编号很多初学者看到结果里出现一堆以BRD开头的编号就傻眼不知道到底是什么药。这个其实很常见BRD编号是Broad Institute化合物库的代号这类化合物通常结构明确但临床开发阶段很早期甚至只有体外活性数据。它们虽然分数很好但离临床很远。做药物重定位时我建议大家优先关注FDA批准药物或至少进入临床试验阶段的化合物这也是经典CMap的核心优势——覆盖了大量已上市药物。CLUE的结果表里包含了每个化合物的别名、商品名以及靶点信息导出后用pert_iname字段去查DrugBank很快就能筛出可进一步实验的候选。6.3 正连接结果真的没有用吗我发现不少同学拿到正连接结果就毫不犹豫地丢掉其实这是浪费。正连接的含义是你的差异表达签名与药物处理效应方向一致。放到具体场景如果你研究的是肿瘤耐药机制正连接的药物可能恰恰具有诱导耐药的能力这类药物联合使用可能会加速复发临床上要警惕。又比如你想找一个能够模拟疾病状态的工具药正连接药物反而是理想的体外诱导剂。所以我建议保留正负两种结果分别对应“治疗潜力”和“疾病促进或模拟”两个方向这能让你的分析结论更有层次。表述成“我们不仅找到了有潜在逆转疾病特征的药物还识别出可能加重疾病的化合物提示患者用药时需避免这些因素”审稿人对这种表达通常是很买账的。6.4 别忘了做对照查询这是我在给朋友审稿时发现的高频问题很多人直接拿差异表达基因去查CMap得到了看起来漂亮的药物名单但缺少一个阴性对照。我建议每次正式查询前先随机生成一组等量基因作为阴性对照跑一遍看看会出现多少个显著候选药物。如果随机基因也能得到10个以上高分数药物那说明查询存在系统性偏差多半是基因列表里混入了平台偏好型基因。另一种对照思路是利用已知阳性药做反向验证。比如你研究的是类风湿关节炎那甲氨蝶呤或TNF抑制剂多少应该出现在正向或负向的候选列表中。如果连这种已知药物都排不进前10%就要反思你的疾病签名是否抓住了疾病的核心特征。6.5 引用与复现问题的提醒最后提一个功利但很实际的问题写论文时引用CMap工具要写对版本。如果你用的是新LINCS数据那要引用Subramanian等人2017年在Cell上发表的论文如果你用的是经典版CMap则要引用Lamb 2006年的Science论文。CLUE网站的访问路径如果你非要用的话也作为数据获取来源写上。不同审稿人对数据库的熟悉程度差异很大引用完整、版本清晰才能避免被打回补材料。复现性方面记得在方法部分写清楚你选择了哪些细胞系组合、哪个参考数据集版本、上下调基因阈值。这些参数你在查询页面其实都能看到但很多人导出结果后就不回去记参数了等几个月后审稿意见下来要求补充细节时又得重新查一遍。我的建议是做分析的当天就建一个文本文件把所有查询参数原样复制保存进去后期写方法部分的时候直接抄。7. 一些个人心得与后续可扩展的方向做CMap分析这几年我对它最大的感受是它是一个典型的“低门槛易上手高壁垒难精通”的工具。任何人花十分钟都能跑出一个结果但从结果到有生物学意义的解释中间需要付出的思考远比想象中多。我自己的一个工作习惯是不要把CMap当作一个孤立的黑盒工具而是把它嵌入到完整的计算流程里。比如拿到候选药物之后我会继续做药物的靶点网络分析看靶点是否在你疾病的相关通路里富集我还会用分子对接去验证候选药物与疾病核心蛋白的结合潜力虽然精度有限但能提供前置证据。如果课题条件允许可以做一个小型的细胞实验验证表达趋势用qPCR跑几个关键基因即可。这个内容的后续扩展空间也很大。比如现在流行的空间转录组数据也可以构造疾病区域内的差异签名去和新版CMap连接探索微环境中的药物响应差异。又比如结合单细胞数据先锁定疾病相关细胞类型再用该细胞类型的特征基因去查询往往比用整个组织的特征基因得到更精确的结果。这些方向以后有机会再一个个拆开写。它们本质上都是在利用同一个核心思想把“病”和“药”在分子层面用共同的语言——基因表达谱——翻译出来再测量它们之间的距离。CMap只是这种思想的一种标准化落地理解了这套思路你以后接触任何新的连接图谱类数据库都会轻松很多。最后再分享一个小技巧CLUE的结果导出表格里有一栏叫specificity表示这个化合物连接信号的细胞类型特异性。我一般会把这个值作为过滤条件——特异性越高的候选药物说明该连接不是泛细胞效应的产物后续验证时更容易在特定细胞模型中观察到表型。这个字段很多人不看但对实验设计很有参考价值。今天的实操内容就到这欢迎大家在实际使用中遇到新问题再来交流。