单细胞BisqueRNA和BayesPrism去卷积分析工具简单比较

news2024/11/10 13:02:32

曾老师发来了一个工具,BisqueRNA,这个工具也可以用于单细胞/bulk数据的反卷积~

因此本次就对这两个工具简单测评一下 ~

生信菜鸟团:https://mp.weixin.qq.com/s/3dZQxDdY6M1WwMMcus5Gkg

笔者也曾经写过一个推文简单的介绍过,有兴趣的朋友可以点进去瞧一瞧:

BayesPrism(贝叶斯棱镜法)可提取单细胞数据去卷积后将信息映射至bulkRNA数据对其进行细胞分群: https://mp.weixin.qq.com/s/Rj8PL6wJqwWhsmLG8tx89w

接下来介绍一下BisqueRNA,它的底层架构主要基于线性回归模型。

主要用两种使用方式

Reference-Based Deconvolution,如果使用者有单细胞和bulk配对的数据可以采用这种方式进行。

Marker-Based Deconvolution,也可以通过指定特定的细胞标记基因进行曲卷积。

研究者更加建议使用第一种,但第一种的方法有点苛刻,需要使用者有同一样本的两种不同测序数据。

BisqueRNA的主要特点:

  1. 单细胞 RNA-seq 数据作为参考,通过线性回归模型将bulk RNA-seq 数据去卷积为各个细胞类型的贡献。这种方法利用单细胞数据中各细胞类型的表达模式来推断混合样本中的细胞组成比例。

  2. 快速、直接使用单细胞数据作为参考,对各细胞类型的表达特征没有特别的假设;适用于基因表达数据较为均匀且细胞类型特征明显的情况。

BayesPrism的主要特点:

  1. 基于贝叶斯推断框架,将去卷积问题建模为一个概率问题,通过迭代的方法估计细胞类型的比例和表达特征。BayesPrism 在去卷积过程中,不仅估计细胞比例,还重新推断了各细胞类型的基因表达特征,同时考虑到不同细胞类型间的共享基因表达模式。

  2. 能够处理噪声数据和表达特征不确定性的情况,尤其擅长在异质性高且表达模式复杂的样本中准确去卷积。BayesPrism 强调对背景噪声的控制和对混合数据的全面描述。

Bisque分析步骤流程
1、导入
rm(list = ls())
library(Biobase)
library(BisqueRNA)
library(qs)
library(BiocParallel)
register(MulticoreParam(workers = 4, progressbar = TRUE)) 

#导入单细胞数据
scRNA = qread('sc_dataset.qs') 
#导入bulkRNA数据
load("Data.Rdata")
2、数据预处理

Bulk RNA-seq 数据从表达矩阵(列是样本,行是基因)转换为 ExpressionSe 这里就跟贝叶斯反卷积的数据格式不一样了~

bulk.matrix <- 2^exprSet-1 # 逆转回TPM数据
bulk.eset <- Biobase::ExpressionSet(assayData = bulk.matrix)

单细胞数据需要在ExpressionSet中添加额外的信息,特别是细胞类型标签和个体标签。个体标签用于指示每个细胞来自哪个个体。为了添加这些信息,Biobase要求将其存储为数据框格式。假设我们有细胞类型标签(cell.type.labels)和个体标签(individual.labels)的字符向量

# 提取200个细胞
sub_scRNA <- subset(scRNA,downsample=200)
sc.counts.matrix <-  as.matrix(sub_scRNA@assays$RNA@counts)

sample.ids <- colnames(sc.counts.matrix) # 提取单细胞的counts
individual.labels <-sub_scRNA@meta.data$orig.ident # 提取个体信息赋值到individual
cell.type.labels <- sub_scRNA@meta.data$celltype # 提取细胞类型赋值到cell.type

# individual.ids和cell.types s的顺序要跟sample.ids的一样!!
sc.pheno <- data.frame(check.names=F, check.rows=F,
                       stringsAsFactors=F,
                       row.names=sample.ids,
                       SubjectName=individual.labels,
                       cellType=cell.type.labels)
sc.meta <- data.frame(labelDescription=c("SubjectName", # individual.labels
                                         "cellType"), # cell.type.labels
                      row.names=c("SubjectName",
                                  "cellType"))
sc.pdata <- new("AnnotatedDataFrame",
                data=sc.pheno,
                varMetadata=sc.meta)
sc.eset <- Biobase::ExpressionSet(assayData=sc.counts.matrix,
                                  phenoData=sc.pdata)
3、运行BisqueRNA

默认情况下,BisqueRNA使用所有基因进行分解。但是也可以提供一个基因列表进行分解

假设单细胞数据和bulk数据有来自同一样本的use.overlap设置为True

system.time({
res <- BisqueRNA::ReferenceBasedDecomposition(bulk.eset, sc.eset, 
                                              markers=NULL, use.overlap=F)
})

 #   user  system elapsed 
 # 42.291  96.513  11.910

超级快速!!!

4、保存结果
ref.based.estimates <- res$bulk.props
write.csv(ref.based.estimates,"ref.based.estimates.csv")
BayesPrism分析步骤流程
1、导入
rm(list = ls())
library(BayesPrism)
library(qs)
library(BiocParallel)
register(MulticoreParam(workers = 4, progressbar = TRUE)) 
#导入单细胞数据
sub_scRNA = qread('sub_scRNA.qs')  # 这里就跟上面Bisque法是相同数据了
#导入bulkRNA数据
load("Data.Rdata")
2、TCGA数据预处理
#请注意我们要做BayesPrism分析
#请确保使用一致的基因注释(TCGA RNA-seq 使用 GENCODE v22)。
#建议使用未规范化和未转换( unnormalized and untransformed)的count data。当原始计数不可用时,线性归一化(例如 TPM、RPM、RPKM、FPKM)也是可以接受的,因为 BayesPrism 对reference和mixture之间的线性乘法差异具有鲁棒性(换个单词 即Robust)。理想情况下,如果使用规范化数据,最好提供参考数据和通过相同方法转换的批量数据。应避免log转换。

exp <- 2^exprSet - 1 # 逆转回TPM
exp_pre <- t(exp)
3、scRNA数据预处理
sc_dataset <- sub_scRNA
sc_dat <- as.data.frame(sc_dataset@assays$RNA@counts)
sc_dat_pre <- t(sc_dat)
table(sc_dataset$celltype)

# 对细胞类型进行质量控制
plot.cor.phi (input=sc_dat_pre, 
              input.labels=sc_dataset$celltype, 
              title="cell type correlation",
              #specify pdf.prefix if need to output to pdf
              #pdf.prefix="gbm.cor.ct",
              cexRow=0.5, cexCol=0.5,
)
4、过滤离群基因-单细胞和bulk
#查看单细胞数据的离群基因
#sc.stat 显示每个基因的归一化平均表达(x 轴)和最大特异性(y 轴)的对数,以及每个基因是否属于一个潜在的异常值类别。Other _ Rb 是由核糖体假基因组成的一组精选基因。
sc.stat <- plot.scRNA.outlier(
  input=sc_dat_pre, #make sure the colnames are gene symbol or ENSMEBL ID 
  cell.type.labels=sc_dataset$celltype,
  species="hs", #currently only human(hs) and mouse(mm) annotations are supported
  return.raw=TRUE #return the data used for plotting. 
  #pdf.prefix="gbm.sc.stat" specify pdf.prefix if need to output to pdf
)
head(sc.stat)  

#查看bulk细胞数据的离群基因
bk.stat <- plot.bulk.outlier(
  bulk.input=exp_pre,#make sure the colnames are gene symbol or ENSMEBL ID 
  sc.input=sc_dat_pre, #make sure the colnames are gene symbol or ENSMEBL ID 
  cell.type.labels=sc_dataset$celltype,
  species="hs", #currently only human(hs) and mouse(mm) annotations are supported
  return.raw=TRUE
  #pdf.prefix="gbm.bk.stat" specify pdf.prefix if need to output to pdf
)
head(bk.stat)

#过滤基因
sc.dat.filtered <- cleanup.genes (input=sc_dat_pre,
                                   input.type="count.matrix",
                                   species="hs", 
                                   gene.group=c( "Rb","Mrp","other_Rb",
                                                 "chrM","MALAT1","chrX","chrY") ,
                                   exp.cells=5)
plot.bulk.vs.sc (sc.input = sc.dat.filtered,
                 bulk.input = exp_pre
                 #pdf.prefix="gbm.bk.vs.sc" specify pdf.prefix if need to output to pdf
)
5、根据 “蛋白编码基因”确定子集
sc.dat.filtered.pc <-  select.gene.type(sc.dat.filtered,
                                        gene.type = "protein_coding")
#根据‘signature gene’确定子集
#或者,在细胞类型被定义为其中一些显示非常相似的转录或存在严重的批次效应的情况下,例如,reference 和mixture 来自不同的测定手段,选择signature gene是可行的。这是因为特征基因的选择可以丰富用于反卷积的基因信息,同时减少技术批量效应造成的噪声影响。
6、构建BayesPrism模型
myPrism <- new.prism(
   reference=sc.dat.filtered.pc, 
   mixture=exp_pre,
   input.type="count.matrix", 
   cell.type.labels = sc_dataset$celltype, 
   cell.state.labels =NULL, # 不同的细胞状态不能分配到同一细胞类型中
   key= Malignant cells,   #"Malignant cells",#key是 cell.type.label 中对应于恶性细胞类型的字符向量。如无恶性细胞,即设置为 NULL,此时,所有类型的细胞将被 treated equally。
   outlier.cut=0.01,
   outlier.fraction=0.1,
 )
7、运行BayesPrism
#后续即运行BayesPrism控制 Gibbs 采样和优化的参数可以使用 Gibbs.control 和 opt.control 指定。?run.prism获取details。这里建议使用默认参数
system.time({
bp.res <- run.prism(prism = myPrism, n.cores=20)
})
  #   user   system  elapsed 
  # 75.387  248.935 3588.547

#qsave(sc_dataset,"sc_dataset.qs")
qsave(bp.res,file = "bp.res.qs")

额,运行了差不多1小时...

8、提取细胞型分数 θ 的后验平均值/变异分数(CV)/Z分数
bp.res <- qread("bp.res.qs")
# 提取细胞型分数 θ 的后验平均值
theta <- get.fraction (bp=bp.res,
            which.theta="final",
            state.or.type="type")

head(theta)
write.csv(theta,"theta.csv")
统计分析环节
1、简单的做个相关性分析
rm(list = ls())
Bisque_res <- read.csv("ref.based.estimates.csv",header = T,row.names = 1)
BayesPrism_res <- read.csv("theta.csv",header = T,row.names = 1)
identical(rownames(Bisque_res),rownames(BayesPrism_res))
colnames(Bisque_res) <- paste0(colnames(Bisque_res), "_Bisque")
colnames(BayesPrism_res) <- paste0(colnames(BayesPrism_res), "_Bayes")
colnames(Bisque_res)
colnames(BayesPrism_res)
dat <- cbind(Bisque_res,BayesPrism_res)

# 绘图相关性分析
# 加载所需的包
library(ggstatsplot)
library(patchwork) # 用于合并图像
# 创建空列表用于存储图像
plot_list <- list()
# 获取细胞类型的名称,确保它们的名称能够被列索引
cells_Bisque <- grep("_Bisque$", colnames(dat), value = TRUE)
cells_Bayes <- gsub("_Bisque$", "_Bayes", cells_Bisque)
# 循环生成每个细胞类型的散点图
for (i in seq_along(cells_Bisque)) {
  bisque_col <- cells_Bisque[i]
  bayes_col <- cells_Bayes[i]

  # 确保列名在数据集中存在
  if (bisque_col %in% colnames(dat) && bayes_col %in% colnames(dat)) {
    # 从数据集中提取x和y的列
    x_data <- dat[[bisque_col]]
    y_data <- dat[[bayes_col]]
    
    # 生成散点图并添加到列表中
    p <- ggscatterstats(
      data = data.frame(x = x_data, y = y_data),  # 创建新数据框
      x = x,  
      y = y,
      xlab = bisque_col,
      ylab = bayes_col,
      bf.message = FALSE
    )
    # 将生成的图加入列表
    plot_list[[i]] <- p
  }
}

# 使用 patchwork 将所有图合并成一张图
combined_plot <- wrap_plots(plot_list, ncol = 3) # ncol 设置每行显示的图数

# 显示合并后的图
print(combined_plot)

# 保存合并后的图像
library(ggplot2)
ggsave(
  filename = "combined_plot.png", # 文件名,可以更改为你需要的名字和格式
  plot = combined_plot,           # 传入需要保存的图
  width = 12,                     # 图的宽度,根据需要调整
  height = 12,                     # 图的高度,根据需要调整
  units = "in",                   # 尺寸单位,可以是 "in"、"cm" 或 "mm"
  dpi = 300                       # 分辨率,适合打印的质量
)

两种不同工具得到的结果差异真的非常大!!相关性相对较好的是成纤维细胞和癌症细胞。

因此笔者在思考是不是因为模型设置的问题。

接下来在构建BayesPrism模型的时候把key设置为NULL。让函数对每一个细胞类型平等对待。

2、重新构建BayesPrism模型
myPrism <- new.prism(
   reference=sc.dat.filtered.pc, 
   mixture=exp_pre,
   input.type="count.matrix", 
   cell.type.labels = sc_dataset$celltype, 
   cell.state.labels =NULL, # 不同的细胞状态不能分配到同一细胞类型中
   key= NULL,   #"Malignant cells",#key是 cell.type.label 中对应于恶性细胞类型的字符向量。如无恶性细胞,即设置为 NULL,此时,所有类型的细胞将被 treated equally。
   outlier.cut=0.01,
   outlier.fraction=0.1,
 )

相关性还是不咋地,结果倒是跟第一次的十分相似! 因此这就跟key值设定没有很大关系啦,应该是跟两种算法的底层逻辑有关。

3、再画一个简单的柱状图
library(ggplot2)
library(reshape2)

# 将数据转换为长格式
dat_long <- melt(dat, variable.name = "Cell_Type", value.name = "Value")

# 提取细胞类型(去掉后面的_Bisque, _Bayes, _Bayes2)
dat_long$Cell_Group <- gsub("_Bisque$|_Bayes$|_Bayes2$", "", dat_long$Cell_Type)

# 按细胞类型排序
dat_long <- dat_long[order(dat_long$Cell_Group, dat_long$Cell_Type), ]

# 绘制柱状图,按细胞类型分组着色
ggplot(dat_long, aes(x = factor(Cell_Type, levels = unique(dat_long$Cell_Type)), y = Value, fill = Cell_Group)) +
  geom_bar(stat = "identity", position = "dodge") +
  labs(x = "Cell Type", y = "Value", title = "Cell Type Distribution by Group") +
  theme(axis.text.x = element_text(angle = 45, hjust = 1)) + # 旋转x轴标签
  scale_fill_manual(values = c("blue", "red", "green", "purple", "orange", "pink", "brown","grey")) # 根据需要调整颜色

直接在pubmed中搜索关键词 BisqueRNA 或者 BayesPrism,目前后者的文章略多一些。

至于该用哪个工具,大家就仁者见仁智者见智吧~

参考资料:

1、BisqueRNA: https://github.com/cran/BisqueRNA

2、BayesPrism:https://bayesprism.org/pages/tutorial_deconvolution

致谢:感谢曾老师以及生信技能树团队全体成员。

:若对内容有疑惑或者有发现明确错误的朋友,请联系后台(欢迎交流)。

- END -

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2148471.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C++的初阶模板和STL

C的初阶模板和STL 回顾之前的内存管理&#xff0c;我们还要补充一个概念&#xff1a;内存池 也就是定位new会用到的场景&#xff0c;内存池只会去开辟空间。 申请内存也就是去找堆&#xff0c;一个程序中会有很多地方要去找堆&#xff0c;这样子效率会很低下&#xff0c;为了…

必知的PDF转换软件:看2024大学生如何选择

你翻翻你文件的下载记录&#xff0c;是不是PDF文件占了大多数&#xff1f;很多是为了保证页面版式直接收到打印手填再扫描或者直接提交。但是如果能够直接在电脑上编辑之后直接转发或者打印是不是方便了很多&#xff1f;这次我就介绍几款可以进行PDF转换操作的工具&#xff0c;…

高效开发,从暗藏玄机的文件系统开始

4G-Cat.1模组的文件系统关乎数据传输速度、存储效率&#xff0c;以及数据安全性等等诸多因素&#xff0c;在应用开发中极为重要。 本期&#xff0c;我们来学习合宙Air201的实用示例——文件系统的使用 Air201文件系统的使用 合宙Air201资产定位模组——是一个集成超低功耗4G通…

AntFlow系列教程之流程拒绝

这是开源项目AntFlow的一个系统入门使用教程.AntFlow是一款开源免费的企业级低代码工作流引擎.仿照钉钉设计,极大降低流程设计、开发和维护成本。详细介绍请查看历史文章&#xff1a;AntFlow开源仿钉钉低代码工作流平台集成RuoYi版本来啦 流程拒绝和流程同意提交的参数是一样的…

Ubuntu20.04 搜索不到任何蓝牙设备

电脑信息 联想扬天YangTianT4900k 问题描述 打开蓝牙之后&#xff0c;一直转圈&#xff0c;搜索不到任何蓝牙设备 排查 dmesg | grep -i blue 有如下错误&#xff1a; Bluetooth: hci0: RTL: unknown IC info, lmp subver 8852, hci rev 000b, hci ver 000b lsusb 芯片型号如…

MySQL数据库的使用

MySQL数据库的启停 先用管理员身份进入系统终端&#xff0c;然后再在终端中输入命令 启动 net start mysql84&#xff08;你所安装的MySQL版本名称&#xff09; 停止 net stop mysql84 不知道所安装的MySQL是什么版本&#xff1f;&#x1f447; 首先打开cmd命令窗口&…

sqli-labs靶场搭建

下载了一个phpstudy进行搭靶场搭建 然后打开phpstudy安装好php,mysql等环境 正式sqli-labs靶场搭建 第一步&#xff1a;下载源码&#xff1a;https://codeload.github.com/Audi-1/sqli-labs/zip/master 解压后放进网站根目录&#xff0c;进到 sqli-labs的文件夹下&#xff0…

分享6个.NET开源的AI和LLM相关项目框架

前言 现如今AI应用的发展可谓是如火如荼的&#xff0c;它们在各个领域都展现出了巨大的潜力和影响力。今天大姚给大家分享6个.NET开源的AI和LLM相关的项目框架&#xff0c;希望能为大家提供一些参考。如果你有更好的推荐&#xff0c;欢迎RP投稿或文末留言。 https://github.c…

虚拟机之与物理机进行文本的复制粘贴

打开终端&#xff08;快捷键CtrlAltt&#xff09;。&#x1f5a5;️ 安装Open VM Tools&#xff0c;输入以下命令&#xff1a; sudo apt-get install open-vm-tools-desktop -y安装这个工具包可以增强虚拟机的功能&#xff0c;包括支持主机与虚拟机之间的复制粘贴&#xff0c;…

台球瞄准的投掷效应或者耦合效应

https://www.zhihu.com/question/27659022 怪不得理论上算的角度, 实际上打总是便宜, 原来这里面还有两个球之间的摩擦.也就是: 老师&#xff0c;这是您八年前的提问。我个人理解是&#xff1a;目标球会跟着主球往同一个方向走。打个比喻就是“目标球”会坐上“主球”的“火车”…

info 命令:查看命令手册

一、命令简介 在 Linux 系统中&#xff0c;可以使用 man​ 查看普通的帮助手册。还可以使用 info​ 命令阅读 Info 格式的文档。 ​info​ 文档的特点&#xff1a;大量使用超链接&#xff0c;通过方向键将光标移动到链接的文字&#xff0c;按下回车键&#xff0c;就可以切换到…

【齐家网-注册/登录安全分析报告】

前言 由于网站注册入口容易被黑客攻击&#xff0c;存在如下安全问题&#xff1a; 暴力破解密码&#xff0c;造成用户信息泄露短信盗刷的安全问题&#xff0c;影响业务及导致用户投诉带来经济损失&#xff0c;尤其是后付费客户&#xff0c;风险巨大&#xff0c;造成亏损无底洞…

利用教育和参与的力量来推动你的应用程序的成功

在竞争激烈的应用推广领域&#xff0c;脱颖而出需要的不仅仅是华丽的广告和充满活力的视觉效果。真正吸引和留住用户的秘诀在于两个经常被忽视但非常强大的策略&#xff1a;教育和参与。如果做得对&#xff0c;这些元素可以将你的应用程序从单纯的下载转变为用户生活中必备的工…

安泰电压放大器设计方法是什么样的

电压放大器是电子领域中常用的设备&#xff0c;用于将低电压信号放大成高电压信号。电压放大器在信号处理、通信系统、仪器测量、控制系统、医疗设备和研究和实验室等领域都有着广泛的应用。 电压放大器的设计方法主要包括选择合适的放大器拓扑结构、选择适当的放大器参数以及进…

基于 UniApp 平台的学生闲置物品售卖小程序设计与实现

&#x1f497;博主介绍&#x1f497;&#xff1a;✌在职Java研发工程师、专注于程序设计、源码分享、技术交流、专注于Java技术领域和毕业设计✌ 温馨提示&#xff1a;文末有 CSDN 平台官方提供的老师 Wechat / QQ 名片 :) Java精品实战案例《700套》 2025最新毕业设计选题推荐…

(已解决)vscode如何选择python解释器

文章目录 前言解决方案 前言 有的时候可能有不同版本的编译器&#xff0c;以适用不同年份的项目。所以&#xff0c;怎么在vscode中换python解释器呢&#xff1f; 解决方案 对着要运行的python文件进行右键&#xff0c;比如我是要运行main文件&#xff0c;点击那个命令选项版…

基于区块链的相亲交易系统源码解析

随着区块链技术的成熟与发展&#xff0c;其去中心化、不可篡改的特性逐渐被应用于各行各业。特别是在婚恋市场中&#xff0c;区块链技术的应用为相亲平台带来了新的可能性 。本文将探讨如何利用区块链技术构建一个透明、高效的相亲交易系统&#xff0c;并提供部分源码示例。 区…

OpenCV运动分析和目标跟踪(4)创建汉宁窗函数createHanningWindow()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 此函数计算二维的汉宁窗系数。 createHanningWindow是OpenCV中的一个函数&#xff0c;用于创建汉宁窗&#xff08;Hann window&#xff09;。汉宁…

Prompt最佳实践|指定输出的长度

在OpenAI的官方文档中已经提供了[Prompt Enginerring]的最佳实践&#xff0c;目的就是帮助用户更好的使用ChatGPT 编写优秀的提示词我一共总结了9个分类&#xff0c;本文讲解第6个分类&#xff1a;指定输出长度 提供更多的细节要求模型扮演角色使用分隔符指定任务步骤提供样例…

翻页时钟 2.0-自动置顶显示,点击小时切换显示标题栏不显示标题栏-供大家学习研究参考

更新内容 自动置顶显示点击小时切换显示标题栏&#xff0c;&#xff08;显示标题栏后可移动时钟位置&#xff0c;鼠标拖动边框调整时钟大小&#xff09;不显示标题栏时&#xff0c;透明部分光标可穿透修正一个显示bu 下载地址&#xff1a; https://download.csdn.net/download…