☰
单细胞转录组跨物种分析指南:从同源基因映射到Seurat整合实践
2026/10/6 9:08:04 网站建设 项目流程

1. 跨物种分析到底在解决什么问题

1.1 从单细胞数据到跨物种比较的跳跃

做到Socrates2这个流程的第12步,意味着你前面已经跑完了从原始测序数据比对、定量、质控、标准化、降维聚类、细胞类型注释到差异分析这一整套常规流程。说实话,能一路走到这一步的人,手头的数据已经不再是"跑个流程出个图"的水平了,而是真的在研究生物学问题。那么"跨物种分析"(Cross-species analysis)这一步,到底是在解决什么问题?

先打个比方。我们做单细胞转录组,拿到的是某一物种、某一组织在某一时刻的细胞表达快照。如果只看一个物种,就像在一个城市里拿着地图逛了一圈,你能看清街道和地标,但看不出这座城市在历史演变过程中哪些是核心主干道,哪些是后来才修的新路。而跨物种分析,相当于把不同城市的交通图叠在一起做比较——主线总是相似的,但每座城市都有自己的改造痕迹。对于生物学研究来说,"主线"就是进化上保守的细胞类型、基因表达程序、调控网络,而"改造痕迹"就是物种特异性的功能分化。

具体到实际应用场景,我遇到过最典型的是这三类需求:第一类是基础科研中做进化生物学研究,想看看不同物种之间细胞类型是否保守、同源基因的表达模式是否相似;第二类是转化医学研究,用小鼠、大鼠、斑马鱼等模式生物做药物筛选或疾病建模,最后需要把动物模型的结果映射回人类数据,看看发现的差异基因或者标志物在人体里是否重现;第三类是资源平台型的工作,比如人类细胞图谱(HCA)、小鼠细胞图谱、斑马鱼图谱等大型项目之间需要整合,建立跨物种的参考图谱。

这一章我们就围绕这些需求,把Socrates2这个流程中"跨物种分析"的具体做法、参数逻辑和避坑经验掰开揉碎讲清楚。这套内容既适用于Seurat为主的分析流程,也适用于以Harmony、scVI为核心整合工具的流程,核心思路是一致的:找到物种间可比的东西,再把它们放在同一个维度下比较。

1.2 跨物种分析要回答的具体问题

在动手分析之前,先想清楚你要回答的问题是什么。跨物种分析不是一个"一键出图"的黑盒子,不同目标对应完全不同的分析路径,选错了后面很难补。

如果你想知道的是"两个物种的同一种组织里,细胞类型组成是否保守",那你需要做的是聚类级别的对应,比如人类肝脏和小鼠肝脏分别聚类注释后,比较各细胞类型的比例、Marker基因表达是否一致,这不一定需要做高难度的数据整合。但如果你想做的是"将小鼠的细胞类型注释迁移到人类数据上",或者"发现两个物种共有但此前未注释过的细胞状态",那就必须做真正的数据整合,需要把两个物种的数据放到同一个降维空间里,让相似的细胞类型互相"靠近"。这个需求下,同源基因映射的质量和整合算法的选择就非常关键了。

还有一种更高阶的问题:虽然细胞类型看起来一致,但关键基因的调控网络可能已经发生了物种特异性的重塑。这就需要在整合的基础上做差异分析、转录因子活性推断甚至轨迹分析,比较同源细胞类型在哪个分化节点上出现了表达程序的分歧。这类分析做起来最耗时,但往往也是最有生物学价值的。

在我的实际项目里,大部分人是抱着"我注释完了小鼠的细胞,想知道在人的数据里对应哪些细胞"这种需求来的。这个需求很适合用标签迁移(label transfer)的方式解决,效率高、可解释性强。但也有不少人是手里的数据里同时包含人和小鼠样本(比如肿瘤异种移植模型的转录组测出来之后混入了宿主细胞),这时跨物种分析就成了数据质控和细胞身份判断的必要手段——人源细胞和小鼠细胞混在一个样本里,如果不去区分,后面所有的差异分析都会失真。

搞清楚目标再选工具、定流程,这是跨物种分析的第一步,也是最重要的一步。下面我们就进入具体的技术环节。

2. 分析前的基础:数据准备与同源基因映射

2.1 物种间的"共同语言"从哪来

跨物种分析的第一个硬核问题,就是要让不同物种的转录组数据"说同一种语言"。单细胞转录组的定量对象是基因,但不同物种的基因命名规则差异极大:人类基因名是全大写的,比如CD3D、TP53;小鼠是首字母大写,其余小写,即Cd3d、Trp53;斑马鱼又是一套规则,像cd3d、tp53这样的全小写命名;果蝇的命名更是随意,复杂基因名甚至还有分号参与。

如果你直接把两个物种的原始表达矩阵合并,结果就是一张大部分行名对不上的稀疏矩阵,聚类出来的结果完全是混乱的。所以在整合之前,必须先把两套基因名统一到同一套"共同语言"上。这个"共同语言"就是同源基因(homologous genes),具体来说我们用的最多的是直系同源基因(orthologs),即起源于共同祖先、在不同物种中执行相同功能的基因。

获取同源基因对应关系,常用的途径有几个。Ensembl BioMart是最老牌也最全的数据库之一,支持上百个物种的比对,能导出直系同源基因对应表。HomoloGene虽然已经停止更新,但历史数据仍然稳定可用。还有一个很推荐的资源是OrthoMCL,它基于蛋白序列相似性聚类划分直系同源家族,对于非模式物种来说更可靠。此外,针对模式生物,生物医学界已经整理了不少半手工校对过的同源基因表,比如MGI(Mouse Genome Informatics)提供的人-小鼠同源基因表,质量比自动比对高不少。

在实际操作中,如果只做人和小鼠之间的对应,很多情况下可以直接用基因名的大小写转换近似搞定,因为这两套命名系统之间大约有八到九成的符号是同源对应的。但千万注意一点:大小写转换不等于同源映射。同名的未必同源,同源的也未必同名。人会骗你,数据不会。所以即使只是处理人鼠数据,我也强烈建议至少用MGI的官方同源表过一次,筛掉那些"碰巧同名但其实是两个基因"的情况。这类问题在免疫基因、嗅觉受体基因家族里尤其严重,这些基因的命名历史复杂,不同物种的相同名字可能指向完全不同的基因。

2.2 实际操作中的基因映射细节

拿到同源对应表之后,映射步骤看起来就三步:读表、匹配、过滤。但如果你真做过一次,就知道这三步里藏着不少坑。

举个例子。从BioMart导出的同源表,默认字段往往包含ETA描述、基因稳定ID、染色体位置、同源类型等一大堆信息。这里面比较关键的是HomoloGene ID或Ensembl Gene ID,因为基因symbol在两套数据库中偶尔会重复。我在处理之前做过的一个项目(人和斑马鱼的数据整合)时,发现BioMart返回的同源基因对应表里有几处基因symbol的一对多映射——一个人类基因同时对应了多个斑马鱼基因,或者反过来。出现一对多映射后,我没有直接抛掉,而是保留下来手动作了一个判断:对于这些基因,先检查表达量是否太低,再检查是否是已知的多拷贝基因家族成员,然后酌情保留表达量高、与目标性状关联紧密的拷贝。

映射之后还有一步过滤:只用两个物种中都检测到的同源基因来做整合。这一步的逻辑很简单——如果人类数据里有某个基因在斑马鱼数据里完全没有,那它在整合时只会引入噪声,无法提供跨物种的锚点信息。不过你的数据里头原本低表达的基因也不要在这时候就因为"检测率低"删掉,因为有些关键的转录因子或表面标记物本身表达水平就不高,在跨物种比较中价值非常高的正是这一部分物种间表达模式相似的基因。

具体的代码层面,如果你用Seurat,常见做法是:先对每个物种的Seurat对象做标准化,然后取同源基因的交集子集,再用这个交集基因重新创建整合输入对象。这个过程里我习惯保留一个映射关系表,随时可以回溯某个基因在两个物种中分别对应什么名字,后面做文献对照或者去看Marker基因表达时非常方便。

# 人鼠数据整合前基因名统一(示例代码) # 假设已经下载了mgi_homologene.txt,包含列:human_symbol, mouse_symbol homolog <- read.table("mgi_homologene.txt", header=TRUE, sep="\t", stringsAsFactors=FALSE) # 分别取表达矩阵中的基因名 h_genes <- rownames(GetAssayData(human_obj, slot="counts")) m_genes <- rownames(GetAssayData(mouse_obj, slot="counts")) # 只保留同源表中有的基因 h_keep <- intersect(h_genes, homolog$human_symbol) m_keep <- intersect(m_genes, homolog$mouse_symbol) # 统一到人类基因名 human_obj <- subset(human_obj, features = h_keep) mouse_obj <- subset(mouse_obj, features = homolog$human_symbol[match(m_keep, homolog$mouse_symbol)]) # 确保两个对象的行名完全一致 common_genes <- intersect(rownames(human_obj), rownames(mouse_obj)) human_obj <- subset(human_obj, features = common_genes) mouse_obj <- subset(mouse_obj, features = common_genes)

注意这个示例里我还没处理重复基因名的问题——这一步绝对不能省。建议先用table()检查映射后的行名是否有重复,有重复就按前文说的方法处理掉。

2.3 工具选型:Seurat整合、Harmony还是scVI

同源基因映射完成后,下一个决策点是选择整合工具。目前主流方案是三大类:Seurat的CCA/anchor整合流程、Harmony的趋同迭代整合、scVI为代表的深度生成模型整合。各自适用的场景差别挺大。

Seurat的anchor整合流程(FindIntegrationAnchors + IntegrateData)是单细胞跨物种整合里最常用的,因为它有一个非常重要的特性——锚点是基于跨数据集的高变基因和相似的邻域结构来识别的,能在一定程度上容忍物种间的表达偏移。这个特性在处理人和小鼠这种有一定进化距离的物种对时特别有用。你不需要做额外批次校正,只需要提供足够的锚点对数。而Harmony的思路是把数据投影到低维空间后再做聚类并迭代校正批次效应,它的强项在于计算速度和高度可扩展性,适合上万样本量级别的整合。但在跨物种场景中,Harmony对基因空间映射的要求更高,同源基因对应如果不准,整合质量就会打折扣。scVI用变分自编码器来学习一个去除了批次效应的隐空间,理论上最强,还能做数据补全和模拟,但它对计算资源要求高,对新手不友好,而且调参不当容易把真实的生物差异当成批次效应抹掉。

就我个人的使用体验来说,跨物种分析首选Seurat的anchor流程。理由有三个:一是锚点机制对同源基因质量有一定的鲁棒性;二是下游可视化和注释工具链完整,一套流程下来衔接顺畅;三是社区用的最多,出了问题在网上很容易找到类似的案例。Harmony和scVI更适合样本量极大、且物种间对应关系比较明确的场景,比如需要整合多个物种的图谱资源。

所以这篇文章后面就以Seurat流程为主线来演示,最后在常见问题部分会单独讲如果用了Harmony或scVI,怎么对照排查整合质量问题。

3. 核心实操:一步步完成跨物种数据整合

3.1 预处理和参数设置的门道

把同源基因处理好之后,接下来就要构建整合用的Seurat对象。这里有一个容易忽略的重点:整合之前,两个物种数据的QC标准必须统一。如果你一方面给人类数据设置的线粒体基因比例阈值是10%,给小鼠设置的却是20%,那整合之后的高质量细胞和低质量细胞会形成人为的"物种特异性"差异,很难区分是生物学信号还是质控差异。

推荐的做法是:两个物种分别做质控、标准化、找高变基因,用一致的阈值和参数,然后各自跑PCA。在找高变基因这一步,可以纠结一下是否只用共同的同源基因来找。如果只用同源基因,整合速度更快、锚点更容易找;但如果某物种有大量物种特异性的基因参与了重要的细胞功能(比如免疫相关的MHC基因),只用同源基因可能会丢掉这些信号。稳妥的做法是:在归一化时各自保留全部基因,但寻找锚点时只使用同源基因的交集,这样既能保留每个物种的全局表达背景,又能在整合时保证可比性。

参数方面,FindIntegrationAnchors里有三个参数要特别留意:dims,k.filter和k.score。dims表示用于锚点识别的PCA维度数量,一般设置在10到30之间,跨物种比较建议适当降低,比如15左右,因为高维里的信息很多是物种特异性噪声,把dims设太高反而会引入干扰。k.filter用来过滤在多个数据集中锚点数过少的细胞,降低假锚点的比例,默认200,如果是远缘物种比较可以适当调低到100。k.score是锚点评分的邻居数量,默认30。这些参数不是越大越好,核心标准是看一眼整合后UMAP里物种之间是分层分布还是混合分布,再结合后面的生物学可解释性来微调。

# 假设human_obj和mouse_obj已经完成标准化和PCA # 合并为一个list交给FindIntegrationAnchors int_list <- list(human = human_obj, mouse = mouse_obj) # 关键参数设置 anchors <- FindIntegrationAnchors( object.list = int_list, dims = 1:15, k.filter = 100, k.score = 30, normalization.method = "LogNormalize", anchor.features = common_genes # 只使用同源基因 ) # 执行数据整合,整合后的对象可以直接用于下游分析 integrated <- IntegrateData(anchorset = anchors, dims = 1:15)

整合之后,默认的整合表达矩阵就是"去除了物种间差异"的版本,可以用来做聚类、UMAP、轨迹分析等。但一定记住,整合矩阵不等于原始表达矩阵,后续所有基于整合矩阵做差异分析的结果,做生物学解读时要谨慎——你在整合矩阵里看到的差异,是整合算法已经"抹平"了一部分之后的差异,用来找跨物种保守Marker是可以的,但用来找物种特异性差异基因就不是最佳选择,后者应该回到每个物种自己的原始表达矩阵上去做。

3.2 标签迁移:把一种物种的注释搬到另一个物种

整合完成之后,最常见的下游应用就是标签迁移(label transfer)。假设你手头已经有一个高质量的小鼠图谱,细胞类型注释做得很扎实,现在拿到一份人类样本的数据,想快速知道这些人类细胞大致对应哪些小鼠细胞类型,那标签迁移是最快的路径。

Seurat里的标签迁移基于同一个锚点框架,不需要重新聚类。它把参考数据的细胞类型标签通过锚点传播到查询数据上,同时给出一个预测得分。这个预测得分非常重要,它是判断迁移结果可靠性的核心指标。我在实际项目里发现,得分在0.75以上的细胞,迁移结果通常比较可信;0.5到0.75之间的细胞,参考意义有限;低于0.5的细胞,说明在参考数据里找不到相似的同源细胞状态,这样的细胞往往就是物种特异性细胞类型或新发现的细胞状态,值得重点关注。

做标签迁移的时候,还有两个细节值得注意。第一,查询数据的预处理(NormalizeData、FindVariableFeatures)一定要跟参考数据的预处理参数保持一致,不然输入的基因空间不对齐,锚点质量会很差。第二,迁移用的基因特征也要限定在同源基因范围内,这一点和整合时是一致的,否则到参考数据里一看基因名根本对不上。

# 假设mouse_obj是一个带注释的参考对象 # human_obj是我们想要注释的查询对象 transfer_anchors <- FindTransferAnchors( reference = mouse_obj, query = human_obj, dims = 1:30, features = common_genes ) predictions <- TransferData( anchorset = transfer_anchors, refdata = mouse_obj$cell_type, dims = 1:30 ) human_obj$predicted_cell_type <- predictions$predicted.id human_obj$predicted_score <- predictions$prediction.score.max

跑完标签迁移后,一定要做一个手动验证:把你预测出来的人类细胞类型对应的Marker基因,回到人类原始表达矩阵里检查它们的表达情况。这一步虽然花时间,但能防住一批因为锚点质量差导致的"看似合理实则误导"的注释错误。我在项目里就遇到过一次糟糕的情况:小鼠的T细胞亚群标签全部正确迁移过来了,但到了核查Marker时,发现人类数据里标注为Treg的细胞几乎不表达FOXP3,后来排除了FOXP3这个基因在同源映射时的错误——同源表把小鼠的Foxp3映射到了一个人类假基因上,导致表达矩阵里根本没有真实的FOXP3信息。数据不会说话,但不检查就不知道它骗了你什么。

3.3 整合后的细胞类型对应与保守性评估

整合完、迁移完,拿到一张跨物种的"统一地图"之后,接下来要做的是系统地评估细胞类型对应关系。这一步的正确打开方式不是只看UMAP图,而是要做一个量化比较,否则你只能说"看起来人类T细胞和小鼠T细胞在一起",但你没法给读者或审稿人一个可复现的证据。

我通常的做法是:在整合后的对象上聚类,然后对每个聚类簇(cluster)做一个跨物种细胞类型构成矩阵。这个矩阵的行是整合后的聚类簇,列是两个物种各自的注释标签,格子里的数值是对应细胞的占比。用这个矩阵可以方便地看出哪些聚类簇是物种共享的(即两个物种的细胞在同一个聚类簇里高度富集),哪些聚类簇是物种特异的(即几乎只包含一个物种的细胞)。共享程度可以用调整后的兰德指数(ARI)或简单的富集分数来衡量。

对保守性评估来说,还可以结合每个细胞类型的特异Marker基因在两个物种中的表达情况做一个打分。比如人类T细胞有一批标记基因(CD3D、IL7R等),在小鼠对应的T细胞里也应该有同源基因的表达信号。如果你发现某个细胞类型的人鼠Marker表达模式出现了明显的"拆家"现象——人类的表达谱跟注释对得上,小鼠的却对不上——那就需要回头检查是注释错了,还是这一细胞类型真的发生了物种特异性的表达重塑。

这一步做扎实了,后面的差异分析、轨迹推断乃至论文写作,都会非常顺利。很多人在这一步只看一个UMAP图就匆匆收场,等到写文章需要额外分析时又要回头重跑,白白浪费一周时间。我的建议是,跨物种分析做完之后,把上面这个构成矩阵和Marker验证的结果保存下来,这两张图就是你论文里的证据图。

4. 验证和深入解读:整合质量与生物学发现

4.1 整合失败的三种典型呈现方式

跨物种整合最让人头大的事情就是整合结果"看起来别扭",但一时说不清哪里出了问题。我总结下来,整合失败基本能分成三种典型呈现:一是整合后两个物种的细胞仍然在UMAP里形成两个明显的"团块",几乎不混合,这说明锚点质量差或者同源基因映射错得离谱;二是整合后细胞混在一起了,但混出来的聚类簇根本没有生物学意义,Marker基因在聚类簇内部表达极端不一致,说白了是"假混合",整合算法把物种之间的相关性噪声当成了共享信号;三是局部整合成功但整体失败,比如免疫细胞完全混好了,但上皮细胞、基质细胞这些非免疫细胞依然分离明显。

第一种情况通常出在数据预处理或同源基因映射阶段。建议回到基因映射表,随机抽查十个基因,人工确认它们确实是直系同源关系,而不是碰巧同名。第二种情况出在参数选择上,多半是dims设得过高,或者高变基因数量限制太死,把真正有用的信号滤掉了。第三种情况则往往是数据本身存在中度以上的物种差异,一些组织细胞亚型在物种间的保守性本来就弱(比如肝脏的Kupffer细胞和人类肝脏巨噬细胞就差得很远),这种情况不一定要强行整合,分而治之可能更合适。

如果你用的是Harmony,整合质量排查思路类似,不过更要注意Harmony产生的校正后表达矩阵是不完整的,它只返回低维嵌入结果,因此想要检查Marker基因的"整合后表达"是做不到的,必须在原始矩阵上检查。这算是一个使用限制,权衡时要考虑进去。

4.2 从保守到演化:如何解读跨物种比较结果

整合完成并且确认质量没问题之后,下面就可以开始做真正的生物学解读了。注意,这一步才是我认为的"跨物种分析的高光时刻"。因为这时候你已经有了一个"统一细胞图谱",可以回答不少进化上和疾病上的问题。

解读的第一个层次是:哪些细胞类型在物种间是保守的?保守意味着它们的分化轨迹、关键调控基因、细胞状态切换机制大概率是演化上古老、功能上核心的。这类细胞往往是研究人类疾病的优先切入点——如果一个小鼠模型中发现的表达变化也能在人类的对应细胞类型里观察到,那么这个模型的有效性就有了可信的进化保守性基础。

第二个层次是:哪些细胞类型是物种特异的?物种特异的细胞状态可能对应的是这一物种特有的生理功能,也可能是环境适应信号导致的细胞状态重塑。比如某些人类特有的免疫细胞亚群,在整个整合之后仍单独聚成一簇,且没有对应的小鼠细胞状态,这种发现往往是文章里最有故事性的部分。

第三个层次是:同一细胞类型在不同物种里,分化轨迹是否一致?拿单核吞噬细胞系统举例,它们在人和小鼠里都包含单核细胞、巨噬细胞、树突状细胞等,但在某些分化节点上,两个物种的细胞走过的轨迹可能完全不同。通过跨物种的拟时间分析(pseudotime analysis),你可以找到"在哪个节点上两个物种开始分岔"。这种节点基因的富集分析往往能揭示物种特有的调控网络差异。做这一层解读时,数据量不足会导致轨迹不稳定,建议至少保证每个物种每个细胞类型有数百个细胞再跑轨迹,否则出来的分岔点可能是噪声。

4.3 差异分析的正确打开方式

整合完之后,很多人会忍不住直接去算两个物种对应细胞类型之间的差异表达基因,列出上百个"跨物种差异基因"就收工。这么做的结果通常很惨,因为普通差异分析完全无法区分"批次效应导致的差异"和"真实的物种生物学差异"。即使你做了整合,整合矩阵中的基因表达是经过校正的,用差异分析得到的p值也不可靠。

更稳妥的方案是:在整合后的聚类簇里做"物种内重复"的差异分析。具体做法是,把同一个细胞类型内的细胞按样本进行分组,每个物种至少三个生物学重复样本,然后用Seurat的FindMarkers或者DESeq2在"人类样本"和"小鼠样本"之间跑差异分析。因为每个组里都有多个生物学重复,统计模型能够把批次噪声和生物学差异分离开来。如果没有多个重复样本,那就退而求其次,使用秩和检验或DESeq2的简单模型,但结果必须标注为探索性结论。

还有一条经验是,跨物种差异分析的"差异基因"不等于"物种特异基因"。想得到真正物种特异的基因,必须在两个物种中分别检测"与其他细胞类型相比,这一细胞类型中的特异表达基因",取交集或差集后再做跨物种比较。这个思路能避免把物种间普遍存在的表达水平差异误认为细胞类型特异的跨物种差异。

5. 常见问题与排查经验实录

5.1 整合后UMAP分群混乱怎么办

问:跑完IntegrateData之后画UMAP,发现两物种的细胞还是分层分布,图上看不到"混合",怎么办?

我的排查顺序是这样的:第一步,看锚点质量。直接把FindIntegrationAnchors产生的锚点信息调出来,画一下锚点对数的直方图。如果锚点对数量太少(比如不到一千),或者评分分布极不均匀,说明同源基因或特征选择出了问题。第二步,看同源基因映射。随机取几个Marker基因,回到两个物种的表达矩阵里检查表达值分布,确认不是技术上把不同基因错认成同源了。第三步,调整dims。把FindIntegrationAnchors里的dims从默认的30降到10,很多远缘物种的数据在低维空间里共享信息更可靠。第四步,如果还是不行,考虑换整合策略——比如改用Harmony在较保守的基因空间上做整合。

5.2 标签迁移评分低是因为什么

标签迁移结束后,看一下预测评分分布,如果你发现一大半细胞的评分在0.5以下,不要急着说"物种差异太大没法迁移",更常见的原因是参考数据跟查询数据的细胞类型组成差异太大。打个比方,你的参考图谱里全是免疫细胞,查询数据却是上皮为主的样本,那免疫以外的细胞自然没有锚点支撑。

另一个常见原因是查询数据的基因覆盖度比参考数据低。有些单细胞测序建库方法(比如某些3'-端测序)对基因的检出率不高,导致很多同源基因表达值为0,锚点质量自然好不了。这种时候先检查一下两个数据的检出基因数量是否匹配,再考虑把查询数据的表达矩阵做一次深度归一化,或者换用更保守的label transfer方法,比如直接用SingleR跑一下参考数据的Marker基因打分。

5.3 映射后基因名匹配率太低

基因名匹配率低的情况通常出现在人类跟斑马鱼、果蝇这类进化距离远的物种之间。我处理一个人类和斑马鱼数据整合的项目时,一开始用Ensembl BioMart自动映射的直系同源表,匹配率只有六成左右。后来换用蛋白序列比对(OrthoMCL)的结果,再把双方都不表达的基因过滤掉,匹配率也就七成多。距离远的物种,愿意花时间去手工校准几个关键的细胞类型Marker基因,比盲目追求全基因组匹配有用得多。

具体校准思路是:挑出线粒体基因、管家基因、免疫Marker基因、细胞周期基因这几类,逐一确认映射关系,因为这些基因要么在功能上极其关键,要么表达量很高对整合影响大。哪怕只保证这几个大类映射准确,整合结果的可靠性就能显著提高。

5.4 整合后的细胞群体偏向前一种物种怎么办

这是另一个非常常见的现象:整合后,聚类簇明显偏向某一物种,另一个物种的细胞数量在其中少得可怜,甚至一个物种的细胞几乎全被"吸"到了同一簇。原因通常是数据量悬殊。如果两个物种的细胞总量差距超过3倍,锚点识别的过程倾向于偏向数据量大的一方,整合后聚类就会失衡。

处理方法有两个思路:一是对细胞量大的物种做下采样,让两个物种的输入细胞量接近;二是在FindIntegrationAnchors阶段适当调整k.filter和k.score,主动增加对小物种数据的锚点权重。我尝试过的项目里,前者更有效,虽然会损失一些大数据量物种的信息,但整合结果的平衡性显著改善。

5.5 一个被低估的步骤:整合前检查基因覆盖度

最后分享一个很容易被忽略,但能省下大量调试时间的经验:在整合前,用10分钟快速检查两个数据集的基因覆盖度分布和线粒体基因比例分布。如果两个数据来自不同的测序平台或建库方法,基因覆盖度差异会直接影响锚点识别。我遇到过一件事情,人类数据来自Smart-seq2全转录组测序,小鼠数据来自10x Genomics 3'端测序,两者检出基因数差了一倍,直接整合的锚点质量惨不忍睹。后来我把人类数据中的同源基因表达矩阵做了一次基于基因长度的归一化(类似TPM归一化),再用这个归一化后的矩阵参与锚点寻找,整合效果立刻有了质的提升。跨物种整合的底层逻辑是"两个数据必须在同一个尺度和维度上具有可比性",所有不能保证这一前提的操作,都是埋雷。

6. 写在最后:跨物种分析的经验沉淀

一路写下来,我在Socrates2流程第12步上花的时间其实比前面11步加起来还多。倒不是代码多复杂,而是每一步都不断在提醒我:单细胞分析走到跨物种比较这个层面,生物学的判断力已经比代码能力更稀缺。整合算法提供的是可能性空间,最终结论仍然需要回到Marker验证、回到功能富集、回到你手头已经积累的领域知识里去寻找解释。

对于正在走这条流程的朋友,我有三条建议。第一,不要在整合步骤上省时间,前期同源基因映射做得越扎实,后期就越少踩坑。第二,整合后的结果一定要做质量评估,锚点分布、评分分布、Marker表达验证这几步不能跳。第三,保存好每一阶段的中间产物——同源基因对应表、锚点对象、整合前后的对象、迁移预测结果——因为在你分析下一步或者回稿修改时,这些文件能让你少跑无数遍。

如果你做跨物种分析的项目比较多,最后一定会形成一个自己的"跨物种分析记忆库":不同物种之间的同源基因映射表、哪些基因家族容易产生假同源对应、哪种组织和细胞类型的跨物种保守性较差、哪种参数组合对哪个物种对效果更好。这些经验很难从教科书上学到,但它们才是跨物种分析里最有价值的资产。希望对大家有帮助。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询