software

用 scVI 整合多个样本,怎样判断批次消失的同时还留住了生物差异?

作者:发布于 2026-11-14约 7 分钟阅读
十个近邻,几个该来自另一批。教学算例|先查同一细胞类型的来源比例,再解释局部混合。90∶10,九甲一乙,同类细胞本来就失衡,这个邻域符合总体比例。50∶50,十甲零乙,在多个细胞、多个供体中核查是否仍按批次隔离。只有乙,同类仅在乙批出现,回看独立样本与表达标记,保留状态差异。

两个批次的单细胞数据,整合前在图上隔得很远,整合后两种颜色终于交织起来。这个变化值得看,但很难只凭这张图判断做得好不好。如果第二批样本恰好多了一类细胞,理想结果应该保留这类额外状态。若处理组全部来自第二批,真正的处理效应也可能与批次一同消失。用 scvi-tools 的 scVI 模型整合时,我会先写下哪些群体有理由相似、哪些差异有理由存在,再去看输出的低维表示有没有支持这些预期。

先画一张样本设计表,再登记计数层

列出每位供体属于什么条件、在哪个建库批次,以及是否有同一供体跨批处理的材料。假定有甲乙两个批次,对照和处理在两批中都出现,那么可以分别在同一条件、同一细胞类型内观察批次偏移。如果甲全部是对照、乙全部是处理,单凭这组数据很难区分两种来源。把处理标签改名为批次标签仍然没有创造缺失的对照。最有价值的附加材料常是一份跨批重复或能在两批共同找到的参考样本。

标准 scVI 的表达观测模型以计数为基础。建立对象时,先证实你传入的层确实保存未对数化的分子计数。如果主矩阵已做总量归一化、取对数或标准化,就从可信的计数层登记,不能仅仅因为文件里有一个叫 counts 的名称就认定它合适。比较两个对象时,还要用一致的基因编号对齐特征。对缺失于某一版注释的基因直接补零,会把未测量误写成没有表达。scVI 模型及输入说明

同时保留原来的空间和模型学到的空间

下面假定对象的计数层和批次列已经确认。基础示例把模型学习到的坐标写进单独的低维表示,再用这组坐标建立新的邻居图。注意分别给邻居图和坐标起名字,否则对照整合前后时,完全可能无意中两次使用同一张图。数据中的具体批次列名需要替换成你设计表中核实过的字段。

import scanpy as sc
import scvi

scvi.model.SCVI.setup_anndata(adata, layer="counts", batch_key="batch")
model = scvi.model.SCVI(adata)
model.train()
adata.obsm["X_scVI"] = model.get_latent_representation()
sc.pp.neighbors(adata, use_rep="X_scVI", key_added="scvi_neighbors")

低维坐标适合建立邻居关系、聚类和探索图谱。某个坐标的正负值没有“某个基因表达多少分子”的单位。要核实某个淋巴细胞标记是否在原始样本中检出,应回到对应的基因表达层。若使用模型估计的标准化表达,则要注明取值的方法和条件,两种图回答的侧重点不同。作者的肺部图谱整合教程把低维表示取出后另建邻居图,可以对照查看每一步落在哪个对象里。scvi-tools 图谱整合示例

做一次有分母的邻居检查

假设某类细胞在甲批有九十个、乙批有十个。对甲批一个细胞检查十个近邻,九甲一乙与这一类细胞的来源比例相当。若机械要求五甲五乙,会把本来就不均衡的采样说成“仍有批次”。换一类细胞,两批各有五十个,如果绝大多数细胞的十个近邻全来自自身批次,就值得追查。下面的数值是教学算例,十个邻居不是推荐给所有项目的固定设置。

同一种细胞的来源 某个细胞周围的十个邻居 可以进一步问什么
甲九十、乙十 九甲、一乙 不同供体的多个细胞是否也符合这个来源比例
甲五十、乙五十 十甲、零乙 同条件下是否仍按批次隔离,或有真实亚型差别
只有乙批观测到 全部来自乙 能否用独立材料确定这个状态是否只在乙出现
十个近邻,几个该来自另一批。教学算例|先查同一细胞类型的来源比例,再解释局部混合。90∶10,九甲一乙,同类细胞本来就失衡,这个邻域符合总体比例。50∶50,十甲零乙,在多个细胞、多个供体中核查是否仍按批次隔离。只有乙,同类仅在乙批出现,回看独立样本与表达标记,保留状态差异。
教学算例|先查同一细胞类型的来源比例,再解释局部混合。

实际检查时,先在已有标记支持的较粗类型内进行,选多个供体而非只挑图上最好看的一团。给每个细胞记下近邻中外批细胞比例,再按供体汇总其中位数和分布范围。若结论随着邻居个数略微改变就完全翻转,说明证据依赖局部尺度,不宜据此宣称所有批次效应已解决。对于在一个批次缺失的类型,也应单独标记,避免把它强行推向另一批最接近但标记明显不同的群。

还可以给前面的近邻比较估一个参照范围。在同一已知类型、同一处理条件内固定邻居图,保持甲乙的细胞总数,随机打乱细胞的批次标签,多次计算跨批邻居比例。如果观察值远低于大多数打乱结果,说明同类细胞在这个图中保留了来源结构。接着按供体拆开,看看这个差距是否集中在单一供体。这个打乱实验只描述图上标签聚集程度,不能把同一供体的许多细胞视为独立的生物学重复来报告显著性。若条件和批次完全重合,打乱还会破坏真实的采样设计,此时应回到跨批重复来评估。

实跑经验|用同一批细胞验收保存和重载

我们在 CPU 上安装 scvi-tools 1.5.2 和 PyTorch 2.15.0 的 CPU 版,用软件自带的模拟器生成两个批次,每批七十个细胞,共八十个基因。先复制原始计数,再显式登记计数层与批次,固定随机种子为三十七。模型隐藏层宽度三十二、潜在维度四,训练五轮。实际训练集有一百一十二个细胞,验证集有二十八个。最后提取潜在坐标得到一百四十行、四列,每个值都有限。这个规模适合验证输入登记和导出,在真实研究中还要检查验证损失是否稳定以及独立样本是否保留生物信号。

每个细胞取十个近邻并剔除自己,共一千四百条有向邻居关系,其中七百三十五条跨批次,占百分之五十二点五。两批的细胞数恰好相同,这个比例可以帮助检查代码的分母。不能单凭它给真实实验的整合程度定一个及格线。我们还把训练好的模型保存后重新载入,在原来顺序的细胞上重取坐标,两份数组的最大绝对差为零。首次重载时把设备名称作为设备数传入,程序报错。这个版本的 CPU 路径把后端设为 cpu,设备数用整数一,修正后同一个模型即可恢复。项目里保留一小批固定条形码用于重载验收,能分清是模型换了,还是读取时的细胞或基因顺序换了。

反过来寻找模型不该抹掉的信号

从实验记录里挑一组预期确实存在的差别。例如某种处理可能主要改变一类免疫细胞的活化状态,你可以在各供体内部看几条有依据的标记是否一起变化,再检查模型空间中这些细胞周围的人是谁。若原始计数和多个供体都支持两个亚群的区别,而整合后它们无法区分,应先核实是否把条件本身作为需要消除的批次,再看参考样本是否充分。即使变化符合预期,也要提防测序深度或细胞应激造成表面一致的差别,最好结合独立的蛋白或实验信息。

最后做一个留出供体的复核。选择最有生物学依据的一类细胞,暂时只用剩余供体建立你想采用的标签判据,再看留出的供体能否被同一组标记解释。这个检查可以揭示某个供体特有的表达程序被误当作全体细胞特征,但不能在没有病例重复时替你估计组间效应。若最后要报告处理与对照的差异表达,分析单位仍须对应独立供体。图上几千个相邻的点不能充当几千份独立取材。

团队归档时,我会把三份结果放在一起,整合前的表达与坐标、整合后的邻居图、按供体给出的正反两类复核证据。这样换一组参数后能说明究竟改善了哪项指标,又付出了什么代价。若要在同一图谱上反复比较多个模型或补入新批次,保存训练环境与模型参数也很有价值。需要自用环境时,可了解云生信的生物信息分析服务器。

把知识用于当前任务

下一步可以直接开始分析

按研究目标查找在线工具、课程、计算资源或完整分析服务。

按目标找方案仍有疑问,联系客服 ↗