如何修改SingleCellExperiment对象的size factors并解决velociraptor报错?
size factors should be positive报错 报错根源
这个错误是因为你的SingleCellExperiment(SCE)对象中存在size factors为0或负数的细胞,velociraptor的scvelo()函数要求所有细胞的size factors必须为正值。你此前用colSums(logcounts(sce)) >0的过滤逻辑并不准确——logcounts与size factors是独立存储的,无法通过logcounts过滤掉size factors异常的细胞。
解决步骤
检查当前size factors状态
先运行以下代码确认问题:# 查看前几个size factors的值 head(sizeFactors(sce)) # 统计非正值size factors的细胞数量 table(sizeFactors(sce) <= 0)过滤异常细胞
直接过滤掉size factors≤0的细胞:sce <- sce[, sizeFactors(sce) > 0]如果你的SCE对象尚未设置size factors(
sizeFactors(sce)返回NULL),则先过滤掉无任何表达量的细胞,再重新计算size factors:# 过滤总counts为0的细胞 sce <- sce[, colSums(counts(sce)) > 0]重新计算size factors(可选)
若原size factors本身存在异常,建议用scater包重新计算稳健的size factors:library(scater) # 基于pooling策略计算(适合UMI数据) sce <- computeSumFactors(sce) # 或者直接用细胞总计数作为size factors sce <- computeLibraryFactors(sce)完成上述步骤后,重新运行
velo.out <- scvelo(sce, subset.row=top.hvgs, assay.X="spliced")即可。
SingleCellExperiment的size factors存储在对象的sizeFactors槽位中,修改方式主要有以下几种:
直接赋值
准备一个与细胞数量长度一致的正数值向量,直接覆盖原有值:# 示例:用细胞总UMI数作为新的size factors new_size_factors <- colSums(counts(sce)) # 确保所有值为正(避免极端情况) new_size_factors <- pmax(new_size_factors, 1e-6) sizeFactors(sce) <- new_size_factors用scater包重新计算
computeSumFactors():基于pooling策略的稳健计算方法,适合UMI类型的单细胞数据,可按细胞簇分组提升准确性:library(scater) sce <- computeSumFactors(sce, clusters = colLabels(sce))computeLibraryFactors():以每个细胞的总计数作为size factors,计算逻辑简单直接:sce <- computeLibraryFactors(sce)
从其他分析对象导入
如果你的SCE是从Seurat对象转换而来,可将Seurat中的size factors导入:# 假设seurat_obj是你的Seurat对象 sizeFactors(sce) <- seurat_obj$RNA@misc$size.factors
内容的提问来源于stack exchange,提问作者emily

