开源scRNA Tools 2.|利用 BayesPrism 剔除微环境背景并识别肿瘤亚克隆特征

开源scRNA Tools 2.|利用 BayesPrism 剔除微环境背景并识别肿瘤亚克隆特征

文章目录

介绍

BayesPrism(Bayesian cell Proportion Reconstruction Inferred using Statistical Marginalization)是一款基于全贝叶斯推断的R包,专为解析**肿瘤微环境(TME)的复杂性而设计。该工具旨在通过统计边缘化方法,利用单细胞RNA-seq(scRNA-seq)数据作为先验参考,从大量RNA-seq(bulk RNA-seq)**样本中联合估计细胞类型的组成比例以及特定细胞类型的基因表达谱。

BayesPrism的核心包含两个模块:去卷积模块(Deconvolution module)和嵌入学习模块(Embedding learning module)。去卷积模块依据scRNA-seq提供的细胞类型特异性表达谱,推断bulk数据中的细胞组分及表达;而嵌入学习模块则使用期望最大化(EM)算法,在非恶性细胞的推断基础上,近似恶性细胞的基因表达程序。最新的V2.2版本支持稀疏矩阵(dgCMatrix)输入,并显著优化了内存效率和运行时间(采用S4对象封装),能够提供细胞类型分数的变异系数(CV)以量化后验分布的不确定性,是研究肿瘤异质性和整合多组学数据的强大工具。

  • Link:https://github.com/Danko-Lab/BayesPrism

适用条件

  1. 参考数据集的完备性:BayesPrism假设所有细胞类型的表达谱均已被观测到。因此,建议尽可能使用**完全枚举(complete enumeration)**所有细胞类型的scRNA-seq作为参考。如果遗漏了某种细胞类型,会导致其余细胞类型的比例估计出现膨胀。
  2. 细胞数量与质量:建议每个细胞状态(cell state)在参考集中至少包含20个以上的细胞。虽然该工具对测序深度变化具有鲁棒性,但高质量、具有代表性的scRNA-seq参考数据(特别是针对恶性细胞的异质性)能显著提升准确度。
  3. 避免高相似性干扰:在构建参考集时,应谨慎包含与肿瘤细胞转录谱高度相似的正常组织细胞(例如在胶质母细胞瘤分析中包含正常星形胶质细胞)。这种相似性可能导致恶性细胞被低估而正常细胞被高估,建议通过留一法(leave-one-out test)测试或利用生物学背景知识进行筛选。

输入数据与功能输出

数据/模块类型输入数据描述功能与输出结果
参考数据输入 (Reference)单细胞RNA-seq (scRNA-seq)
- 原始计数矩阵 (Raw count matrix),V2.2支持稀疏矩阵。
- 细胞类型注释 (cell.type.labels) 及细胞状态注释 (cell.state.labels)。
- 注意:无需预先标准化或对齐基因,包内会自动处理。
构建用于去卷积的Prism对象,包含细胞类型特异性的基因表达先验分布。
混合数据输入 (Mixture)大量RNA-seq (Bulk RNA-seq)
- 原始计数矩阵 (Raw count matrix)。
- 行名为基因,列名为样本。
- 注意:应排除核糖体、线粒体基因及易受批次效应影响的基因。
提供待解构的混合样本表达谱。
核心功能输出 (Output)整合上述两类数据,运行run.prism等函数。1. 细胞类型比例 (Cell Type Fraction):输出初始估计 ( θ 0 \theta_0 θ0) 和更新后的最终估计 ( θ f \theta_f θf)。
2. 特定细胞类型基因表达 (Cell Type-Specific Expression):从Bulk数据中推断出的各类细胞的基因表达谱。
3. 不确定性量化:输出细胞类型分数的变异系数 (CV)。
4. 肿瘤基因程序嵌入:恶性细胞的线性组合表达特征。

2个Demo

使用 BayesPrism 进行恶性细胞表达的嵌入学习

BayesPrism 包含一个可选的嵌入学习模块,用于识别去除肿瘤浸润的非恶性细胞后,在批量 RNA-seq 样本中常见的基因表达模式。

# 1. 加载包与数据 library(BayesPrism) library(NMF)# 需要 NMF 包来进行 rank 扫描 load("bp.res.rdata")# 加载之前的 BayesPrism 去卷积结果 (bp.res)# 2. 选择恶性程序的数量 K# 提取更新后的恶性细胞表达谱 (归一化) Z.tum.norm <- t([email protected]@psi_mal)# 使用 NMF 扫描 K 值 (此处示例为 2 到 12)# 注意:这步计算量较大,耗时较长 estim.Z.tum.norm <- nmf(Z.tum.norm, rank=2:12, seed=123456)# 可视化各项指标与共识图以辅助选择 K 值 plot(estim.Z.tum.norm)
consensusmap(estim.Z.tum.norm, labCol=NA, labRow=NA)
# 3. 运行嵌入式学习 (Embedding Learning)# 假设根据上一步选择了 K = 5 ebd.res <- learn.embedding.nmf( bp = bp.res,# 输入必须是在 tumor mode 下运行的 BayesPrism 结果 K =5,# 选定的 K 值 cycle =20,# EM 迭代次数 (通常约 50 次收敛,演示设为 20) compute.elbo = T # 计算 ELBO 以监控收敛情况)# 查看结果结构 str(ebd.res)# 绘制 ELBO 曲线检查收敛性 plot(ebd.res$elbo, xlab="EM cycle", ylab="-ELBO", type="l")
# 4. (可选) 继续增加迭代次数# 如果 ELBO 未收敛,可在上一步结果基础上继续运行 ebd.res.2<- learn.embedding( bp = bp.res, cycle =10,# 额外增加 10 次循环 EM.res = ebd.res,# 传入上一步的运行结果 compute.elbo = T )# 绘制合并后的 ELBO 曲线 plot(c(ebd.res$elbo, ebd.res.2$elbo[-1]), xlab="EM cycle", ylab="-ELBO", type="l")# 5. (可选) 使用自定义先验运行# 如果有特定的生物学先验知识 (eta_prior)# ebd.res.myEta <- learn.embedding(# bp = bp.res,# eta_prior = my.eta, # 用户提供的 K-by-G 矩阵 (raw count scale)# cycle = 50,# compute.elbo = T# )

使用 BayesPrism 进行Bulk RNA-seq 反卷积

BayesPrism 利用从匹配或相似组织类型中采集的样本的单细胞 RNA 测序 (scRNA-seq) 数据,对批量 RNA 测序(以及空间转录组学)进行细胞类型和基因表达反卷积。它将 scRNA-seq 数据视为先验信息,并进行估计 P ( θ , Z ∣ X , ϕ ) P(\theta, Z | X, \phi) P(θ,Z∣X,ϕ),即在参考 ϕ \phi ϕ 和每个观测到的批量样本 X X X 的条件下,联合估计细胞类型比例的后验分布 θ \theta θ 以及细胞类型特异性基因表达 Z Z Z。

  • 示例数据
  • Github:https://dreg.dnasequence.org/

登不了Github的小伙伴后台回复【20251230bayesprism】下载包

suppressWarnings(library(BayesPrism)) load("../tutorial.dat/tutorial.gbm.rdata") ls()# [1] "bk.dat" "cell.state.labels" "cell.type.labels" "sc.dat"# 细胞状态相关性热图 plot.cor.phi(input=sc.dat, input.labels=cell.state.labels, title="cell state correlation", cexRow=0.2, cexCol=0.2, margins=c(2,2))
# 细胞类型相关性热图 plot.cor.phi(input=sc.dat, input.labels=cell.type.labels, title="cell type correlation", cexRow=0.5, cexCol=0.5)
# scRNA异常基因分布图 sc.stat <- plot.scRNA.outlier(input=sc.dat, cell.type.labels=cell.type.labels, species="hs", return.raw=TRUE)
# Bulk RNA异常基因分布图 bk.stat <- plot.bulk.outlier(bulk.input=bk.dat, sc.input=sc.dat, cell.type.labels=cell.type.labels, species="hs", return.raw=TRUE)
sc.dat.filtered <- cleanup.genes(input=sc.dat, input.type="count.matrix", species="hs", gene.group=c("Rb","Mrp","other_Rb","chrM","MALAT1","chrX","chrY"), exp.cells=5)# Bulk与SC表达一致性散点图 plot.bulk.vs.sc(sc.input = sc.dat.filtered, bulk.input = bk.dat)
# 只保留蛋白质编码基因(可选) sc.dat.filtered.pc <- select.gene.type(sc.dat.filtered, gene.type ="protein_coding")# 对不同细胞类型中的细胞状态进行成对 t 检验 diff.exp.stat <- get.exp.stat(sc.dat=sc.dat[,colSums(sc.dat>0)>3], cell.type.labels=cell.type.labels, cell.state.labels=cell.state.labels, pseudo.count=0.1, cell.count.cutoff=50, n.cores=1)# 筛选特征基因 sc.dat.filtered.pc.sig <- select.marker(sc.dat=sc.dat.filtered.pc, stat=diff.exp.stat, pval.max=0.01, lfc.min=0.1) myPrism <- new.prism(reference=sc.dat.filtered.pc,# 或使用筛选过特征基因的 sc.dat.filtered.pc.sig mixture=bk.dat, input.type="count.matrix", cell.type.labels = cell.type.labels, cell.state.labels = cell.state.labels, key="tumor", outlier.cut=0.01, outlier.fraction=0.1)# 运行 BayesPrism bp.res <- run.prism(prism = myPrism, n.cores=50)# 获取最终更新后的后验均值 theta <- get.fraction(bp=bp.res, which.theta="final", state.or.type="type") head(theta)# 提取细胞类型分数的变异系数 (CV) 以评估不确定性 theta.cv <- [email protected][email protected] head(theta.cv)# 提取特定细胞类型的基因表达矩阵 Z(例如肿瘤细胞) Z.tumor <- get.exp(bp=bp.res, state.or.type="type", cell.name="tumor") head(t(Z.tumor[1:5,])) save(bp.res, file="bp.res.rdata")

  • 简易生信分析问题可免费解答,复杂问题付费咨询;欢迎投稿需要复现的文献图表,团队可整理和分享一份案例交流学习。
  • 期待学术合作者加入团队,磨合后有数据有课题有契机的可合作冲子刊和正刊,另外筹备SCI期刊编委会。
  • 承接单细胞空转真核转录组等多组学测序服务(寻因平台) ,欢迎各大医院或课题组咨询,关注6个月以上给予绝对低于市场价的粉丝价
  • 欢迎扩列交流学习聊职业规划等,健谈和爱交朋友,同时非常欢迎生信、AI多模态领域高手加入团队合作储备人才

Read more

C++ 继承入门:从基础概念到默认成员函数,吃透类复用的核心逻辑

C++ 继承入门:从基础概念到默认成员函数,吃透类复用的核心逻辑

🔥草莓熊Lotso:个人主页 ❄️个人专栏: 《C++知识分享》《Linux 入门到实践:零基础也能懂》 ✨生活是默默的坚持,毅力是永久的享受! 🎬 博主简介: 文章目录 * 前言: * 一. 继承的概念与定义:怎么让类 “复用” 代码? * 1.1 继承的核心概念 * 1.2 继承的定义格式 * 1.3 继承方式与成员访问权限 * 二. 基类与派生类的转换:子类对象能当父类用吗? * 三. 继承中的作用域:同名成员会冲突吗? * 3.1 变量隐藏:同名变量只认子类的 * 3.2 函数隐藏:同名函数只认子类的 * 四. 派生类的默认成员函数:构造、拷贝、析构怎么写? * 4.1 构造函数:先调用父类构造,

By Ne0inhk
C++入门看这一篇就够了——超详细讲解(120000多字详细讲解,涵盖C++大量知识)

C++入门看这一篇就够了——超详细讲解(120000多字详细讲解,涵盖C++大量知识)

目录 一、面向对象的思想 二、类的使用 1.类的构成 2.类的设计 三、对象的基本使用 四、类的构造函数 1.构造函数的作用 2.构造函数的特点 3.默认构造函数 3.1.合成的默认构造函数 3.2.手动定义的默认构造函数 四、自定义的重载构造函数 五、拷贝构造函数 1.手动定义的拷贝构造函数 2.合成的拷贝构造函数 3.什么时候调用拷贝构造函数 六、赋值构造函数 七、析构函数 八、this指针 九、类文件的分离 十、静态数据 1.静态数据成员 2.静态成员函数 十一、

By Ne0inhk
【C++:异常】C++ 异常处理完全指南:从理论到实践,深入理解栈展开与最佳实践

【C++:异常】C++ 异常处理完全指南:从理论到实践,深入理解栈展开与最佳实践

🎬 个人主页:艾莉丝努力练剑 ❄专栏传送门:《C语言》《数据结构与算法》《C/C++干货分享&学习过程记录》 《Linux操作系统编程详解》《笔试/面试常见算法:从基础到进阶》《Python干货分享》 ⭐️为天地立心,为生民立命,为往圣继绝学,为万世开太平 🎬 艾莉丝的简介: 🎬 艾莉丝的C++专栏简介: 文章目录 * C++学习阶段的三个参考文档 * 1 ~> 异常的概念 * 2 ~> 异常的使用层 * 2.1 异常的抛出和捕获 * 2.2 栈展开 * 2.2.1 理论 * 2.2.2 最佳实践 * 2.3 查找匹配的处理代码 * 2.3.

By Ne0inhk
季节-趋势分解(STL)方法详解

季节-趋势分解(STL)方法详解

季节-趋势分解(STL)方法详解 在分析时间序列数据时,我们经常需要理解数据中隐藏的规律。比如零售商想知道销售额的增长是真实的业务增长还是仅仅是季节性因素,气候学家需要从温度数据中分离出长期变暖趋势和正常的季节变化,这些都需要一种强大的分解方法。STL(Seasonal and Trend decomposition using Loess)正是为此而生的统计方法,它能够将复杂的时间序列数据优雅地分解为三个易于理解的组成部分:趋势、季节性和余项。 数学原理与核心思想 STL的核心思想非常直观:任何时间序列都可以表示为三个加法组成部分的和。用数学公式表达就是: Yν=Tν+Sν+RνY_\nu = T_\nu + S_\nu + R_\nuYν =Tν +Sν +Rν 其中YνY_\nuYν 代表在时间ν\nuν的观测值,TνT_\nuTν 是趋势分量,SνS_\nuSν 是季节分量,RνR_\nuRν 是余项分量。

By Ne0inhk