同一批免疫细胞,CellTypist 逐细胞预测能找到十几枚树突状细胞,开启多数投票之后却一个都没有了。图上的标签看起来更整齐,实验人员反而关心那十几枚究竟是什么。要判断这次改变,至少要保留三列信息,每枚细胞原来叫作什么、投在哪个小簇、投票后改成什么。还需要再看一层原始表达证据,弄清被改名的少数细胞究竟是零散误判,还是具有相同特征的一群。
先确认模型能见到什么
通用模型来自特定训练材料,有自己的物种、组织范围和标签层级。一份只涵盖免疫系统的模型即使可以给上皮细胞输出一个最佳匹配,那个标签也难以解释为可靠的上皮亚型。开始前查看模型自带的细胞类型列表和训练背景,列出你预期出现而模型完全没有的类型。若项目包含肿瘤细胞、基质细胞和免疫细胞,可先区分大谱系,再把适合的免疫子集交给相应模型,保留其余部分的独立注释依据。
接着查矩阵。对传入的 AnnData,项目文档要求合适的按细胞总量归一化并取自然对数加一的表达矩阵,归一化目标为一万。它会查看主矩阵,在不合适时还可能检查原始快照。这里的名字并不保证内容,曾经缩放成有负数的标准化表达不能因为放在主矩阵中就符合要求。也要尽量提供完整基因集合,提前只保留少量高变基因会使训练模型中的一些标记失去观测。用稳定的来源记录追溯归一化步骤,再核对输入的基因符号与模型的交集。CellTypist 作者的输入和模型说明
逐细胞预测和簇内投票是两次不同的决策
最佳匹配模式会从候选类别中取分数最高的一类。某一细胞的最高分即使并不突出,也依然有第一名。另一种概率匹配模式可按阈值给出零个、一个或多个候选标签。在最佳匹配模式下调整这个多标签阈值并不会达到筛去弱预测的目的。多数投票则在逐细胞结果之后进行,它将属于同一细分簇的标签放在一起,按占比确定该簇的命名。选择怎样的细分簇,直接影响有无机会保住稀有类型。预测模式、投票和最低占比参数
假设一个教学小簇有十二枚细胞。单细胞层面八枚叫甲、四枚叫乙,甲占三分之二。如果没有更高的占比要求,这个簇可统一叫甲,于是原先四枚乙在投票标签里都变成甲。若要求胜者至少占四分之三,这个簇达不到要求,将被标为异质。第三种情形是先用独立标记和邻居关系发现乙在内部本来形成连贯的小群,再将这个小群作为有依据的细分区域。新的投票结果可能有助于保留乙,但也要防止为了得到想看的标签任意切分。
| 同一批十二枚细胞 | 占比或分组 | 怎样读结果 |
|---|---|---|
| 直接按原簇投票 | 甲 8 / 12,乙 4 / 12 | 甲占多数,四枚乙可被改名 |
| 胜者至少占 75% | 8 / 12 小于 75% | 整簇标成异质,需要继续检查 |
| 在有标记支持的子群里复核 | 分别看原预测和真实标记 | 优先判断四枚乙是否构成一致的小群 |

导出改名清单,追到具体条形码
下面假设对象里已经有核实过的细分标签,所选模型适用于这批免疫细胞。保留逐细胞标签,同时单独列出投票结果与原标签冲突的条形码,再将其与分子数、供体、标记表达连接。一个样本内重复用同一个条形码命名并不罕见,跨样本拼接前应把文库标识纳入细胞名。
import celltypist
res = celltypist.annotate(adata, model="Immune_All_Low.pkl",
majority_voting=True, over_clustering="subcluster")
labels = res.predicted_labels.copy()
changed = labels.loc[labels["predicted_labels"] != labels["majority_voting"]]
print(changed.groupby(["predicted_labels", "majority_voting"],
observed=True).size())
回到上面的四枚乙,先看它们是否都检出同一组谱系标记、是否总分子数足以作判断,再查看四枚来自一个供体还是多次独立取材。假如四枚只在低质量区域零星出现,每枚支持乙的基因又完全不同,投票纠正零散误判是可解释的。若四枚集中于有清楚定位的邻域,在不同供体都能复现同一组正标记,并且缺乏甲的关键特征,把它们一律并入甲会抹去值得验证的群体。此时可以保留到大类,把细分类注明待核实,再用另一份合适的参考或蛋白标记作交叉检查。
还可以按细胞标识拿回所有类别的决策分数,对比改名前排在前两位的模型标签。若四枚细胞对乙的支持都很突出,却只因所在细分簇范围太大而被改名,下一次应优先复核邻居图与细分簇。如果连原始分数都很接近,则先核对模型缺失类别和真正有区分力的标记。
实跑经验|逐细胞全判对,投票后为什么改错十三枚
我们安装 CellTypist 1.7.1,在二十四个模拟基因、一百二十枚训练细胞上训练一个两类模型。查询集另行抽样,共六十枚细胞,给每种类型六个明显标记。我们用两个各三十枚的人工细分群做诊断,第一个含二十一甲、九乙,第二个含四甲、二十六乙。逐细胞分类六十枚全部与设定相符。允许简单多数投票后,第一群全写甲,第二群全写乙,共十三枚被改名,保留正确标签四十七枚。将最小占比设为零点八,第一群的七成多数未过线,三十枚都标作 Heterogeneous,第二群仍全标乙。这时应分别报告未决数和保留的具体标签,避免将未决硬算成第三种细胞。
又从同一查询集取前五十枚,提供相同细分列、开启投票。这个版本的高层预测函数在输入数目不超过五十时跳过投票,返回表只有逐细胞标签,日志明确给出了原因。因此刚拿十几枚细胞做小测试时,应先打印返回列,而不能指望总有投票结果可供对照。训练阶段也遇到过版本差异,较新分类库不接受此实现使用的 multi_class 参数,我们用 scikit-learn 1.5.2 完成训练。该实跑是用独立生成的数据检验投票机制,没有据此评估人类免疫参考模型的注释性能。作者高层预测接口的实现
怎样估计对结果究竟有多大影响
按供体做两张组成表,一张使用逐细胞最佳匹配,一张使用投票后的标签,另列有多少条形码从哪一类流向哪一类。大类总量可能几乎不变,而某一个稀有类型从二十枚减少到零,这两种现象可以同时发生。如果报告治疗前后稀有群比例,还要在每位供体内单独计算,而不是将各组细胞简单汇总。一个细胞数特别多的供体足以控制合并趋势。选择注释方案时,应以标记和独立重复提供的证据为准,不宜按治疗差异哪次更显著来挑结果。
最后特别看一眼同一物种不同组织之间的状态差别。一个在外周血里稳定的标记,进入组织后可能受活化改变。模型把肿瘤样本里的某个群体分给两个相关标签时,可以先复核共同谱系身份,再用组织特异标记补充细分。记录模型名称和版本、基因覆盖、投票所用细分列与占比要求,这样下次加入新样本出现命名变化时,能找到具体是哪个条件发生了改变。
若一项结论涉及少数关键细胞,随结果附上它们的条形码、原始标签、投票标签和标记复核表,实验同事可以明确挑哪一群做验证。团队需要为不同组织重复比较模型并保留原始对象时,可了解云生信的生物信息分析服务器。
