第一次接触单细胞转录组多样本整合时,最让我纠结的就是质控顺序问题。就像刚学做菜时纠结该先放盐还是先放酱油一样,这个问题看似简单却直接影响最终结果。经过多次实战和踩坑,我总结出了一些经验。
质控的核心在于过滤低质量细胞,主要依据三个关键指标:线粒体基因占比、红细胞基因占比和核糖体基因占比。就像筛选运动员要看身高、体重和肺活量一样,我们需要为这些指标设置合理的阈值。实际操作中常见两种思路:
第一种是"先质控后整合"。这种方法就像先对每个班级进行选拔,再组建校队。优点是能针对每个样本的特性进行个性化过滤,缺点是不同样本的筛选标准可能不一致,就像用不同标准选拔队员,最终队伍可能偏向某些班级。
第二种是"先整合后质控"。这相当于把所有学生混在一起统一选拔。优点是标准一致,缺点是可能忽略样本间的生物学差异。就像用同一标准选拔不同年龄段的学生,结果可能不够准确。
我常用的折中方案是:先按实验处理分组进行初步整合,再在组内进行质控。比如处理组和对照组先分别整合,再各自质控。这样既保持了组内标准一致,又避免了跨组差异带来的干扰。实际操作中可以这样实现:
r复制# 示例代码:分组整合与质控
library(Seurat)
# 按处理组分组
ctrl <- CreateSeuratObject(counts = ctrl_data)
treat <- CreateSeuratObject(counts = treat_data)
# 组内质控
ctrl <- subset(ctrl, subset = mt.perc < 10 & rb.perc < 5)
treat <- subset(treat, subset = mt.perc < 10 & rb.perc < 5)
# 最终整合
merged <- merge(ctrl, treat)
高变基因(HVG)就像细胞的身份特征,但在整合和差异分析中扮演着不同角色。刚开始我也困惑:为什么两个步骤都要找HVG?它们是一回事吗?
在整合阶段,HVG的作用相当于建立共同坐标系。想象要把来自不同学校的学生成绩进行比较,首先需要统一考试科目(HVG),然后才能公平对比。技术实现上,我们通常选择4000个左右的高变基因:
r复制# 查找高变基因示例
obj <- FindVariableFeatures(obj, selection.method = "vst", nfeatures = 4000)
而在差异分析阶段,HVG更像是放大镜,帮助我们聚焦真正有生物学意义的差异。这就像在统一考试后,重点分析特定科目的成绩差异。
关键区别在于:
实际操作中我常遇到的问题是HVG数量选择。太少会导致信息丢失,太多会引入噪声。我的经验是:
批次效应就像照片上的阴影,会掩盖真实的生物学差异。处理过十几个项目后,我总结出批次效应去除的"三级应对策略"。
初级方案:当批次效应较小时,使用简单线性回归。就像调整照片的亮度对比度:
r复制obj <- ScaleData(obj, vars.to.regress = "batch")
中级方案:中度批次效应时,SCT或Harmony是更好选择。SCT尤其适合样本间差异大的情况:
r复制# SCT方法示例
obj.list <- SplitObject(obj, split.by = "batch")
obj.list <- lapply(obj.list, SCTransform)
features <- SelectIntegrationFeatures(obj.list)
obj <- IntegrateData(obj.list, features = features)
高级方案:严重批次效应时考虑CCA,但要警惕它可能过度矫正。就像过度美颜的照片,虽然去除了瑕疵,但也可能丢失真实特征。
选择方法时我会考虑:
最近一个项目中,我使用Harmony成功处理了来自三个不同实验室的样本:
r复制library(harmony)
obj <- RunHarmony(obj, "batch", plot_convergence = TRUE)
当细胞数超过8000时,双细胞风险显著上升。就像人群中总有几个人会挤在一起拍照,这些"合影"细胞会干扰分析结果。
我常用的双细胞检测方法是DoubletFinder,它就像细胞世界的"测谎仪":
r复制library(DoubletFinder)
sweep.res <- paramSweep_v3(obj)
sweep.stats <- summarizeSweep(sweep.res)
bcmvn <- find.pK(sweep.stats)
nExp <- round(ncol(obj) * 0.04) # 预计双细胞比例
obj <- doubletFinder_v3(obj, pN = 0.25, pK = 0.09, nExp = nExp, PCs = 1:10)
对于环境RNA污染,SoupX是我工具箱里的首选。它就像专业的清洁工,能有效去除转录组的"噪音":
r复制library(SoupX)
sc = SoupChannel(tod, toc)
sc = setClusters(sc, clusters)
sc = autoEstCont(sc)
out = adjustCounts(sc)
在实际操作中,我发现这些处理的最佳顺序是:
因为双细胞检测需要原始计数数据,而污染校正会影响质控指标的计算。这个顺序能确保各步骤互不干扰。