专栏名称: 生信师兄
本公众号旨在帮助广大的生信小白更好、更轻松的入门生信,专注生信干货分享。
目录
51好读  ›  专栏  ›  生信师兄

scRNA-seq差异分析真的应该比较单个细胞之间的差异吗?

生信师兄  · 公众号  ·  · 2025-02-02 09:08

正文

封面

熟悉师兄公众号的都应该清楚,师兄之前的推文主要集中在各种类型的科研绘图上!但是不少粉丝小伙伴们还是反应,只知道绘图,数据不会分析,还是不行的呀!没错,拿不到可靠的分析结果,只知道绘图,这当然是远远不够的!因此, 学习各种常用的生信数据分析则必然成为了每一个生信人必须要经历的事情。 因此,后续的推文中,师兄会尽可能地多更新一些有关数据分析的内容,可能包含的系列包括《R语言数据处理基本技巧》、《从零开始学单细胞转录组》、《从零开始学空间转录组》等;

本系列,师兄将 从单细胞转录组学开始 ,带领大家一起 从零开始学单细胞 !系列内容可以详见下方大纲!

说明: 由于本系列教程还是强调 面对完全零基础小白 ,所以很多内容师兄会介绍的非常细,对于部分已经入门的老手来说可能比较多余,所以 大家选择性阅读即可!

本系列主要内容目录及单细胞学习交流群,请看Part 1;

本期主要内容,请看Part 2;

合作服务器推荐及生信师兄粉丝专属优惠详情,请看Part 3;

如果您觉得本系列文章对你有帮助的话,欢迎 点赞、收藏、在看+转发 !您的支持是师兄持续更新的最大动力!

Part 1 系列介绍

1.1 内容大纲

单细胞转录组系列教程目录

1.2 生信师兄单细胞学习交流群

当然了,好的学习过程离不开详尽地交流讨论和重难点答疑!因此,在发布教程的同时,师兄也成立了 《生信师兄单细胞学习交流群》 用于本系列内容的学习交流。需要的小伙伴可以扫描下方二维码,添加师兄微信后备注 “单细胞学习交流群” 后付费加群!

1.2.1 群内资源

  • 本系列所有免费及付费内容的配套学习资源、代码资源及示例数据;
群内资源(以上图课程目录为准)

1.2.2 入群费用

  • 入群费用: ¥299元(每集赞1个抵扣1元,至多抵扣100元!此优惠永久有效!)

1.2.3 本系列不含视频教程

  • 目前,师兄还没有足够的时间进行视频课程的录制,所以 本系列教程不包含视频课程 !但是如果大家需要,师兄也一定会尽可能抽时间录制课程!

  • 如果后续推出视频课程 ,还是和《R语言科研绘图进阶版视频教程》一样, 加群的小伙伴届时可凭借入群截图,抵扣购课差价。 所以,早入群早享受吧!

1.2.4 声明

  • 是否加群,纯属自愿! 本系列的大部分内容会是免费阅读, 所以完全支持白嫖! 但是看完还请动动你的手指, 点个赞!点个在看!如果能转发那就太感谢了!
  • 加群可以 获取本系列所有付费部分内容,代码,示例数据,以及定期答疑的交流群
  • 如果考虑好加群,就 早加早享受,随着群内资源的增加,入群的费用也可能会随之增加
  • 优惠方式 点赞 + 在看,并转发这个系列任意一篇文章至朋友圈,每集赞1个抵扣1元,至多抵扣100元!此优惠永久有效哦!

Part2 主要内容

在进行完细胞类型注释之后,往往下一步要做的就是比较不同细胞类型,或者相同细胞类型在不同实验处理下的差异基因表达情况!那么这里就有一个非常值得考虑的问题 -- 到底是要在单细胞层面上做差异分析,还是在Cluster的层面上做差异分析? 其中,后者则是鼎鼎大名的 Pseudobulk方法 ,所谓Pseudobulk就是先将 同一个样本来源的细胞进行整合 ,形成一个 伪Bulk RNA-seq数据 ,然后使用 普通转录组的方法对其进行差异分析

单细胞差异分析方法

2021年发表在 Nature Communications 上的 Confronting false discoveries in single-cell differential expression 详细的比较了多种差异分析方法对单细胞数据的分析效果。

结果表明: 大多数文章用来计算差异分析的方法都是 Wilcoxon rank-sum test,这是因为Seurat标准差异分析流程使用的函数FindMarkers默认的差异分析方法就是Wilcoxon 。此外,文章对14种差异分析方法进行了测试,其中 6种性能最佳的方法都具有共同的特点:即这些方法在应用统计检验之前,都进行了Pseudobulk操作! 相比之下,单细胞水平计算差异基因方法表现不佳。这也进一步提示我们,在后续的单细胞分析过程中,应该尽可能的采用此类策略进行差异分析!

在这篇文章中,师兄将给大家介绍 传统的FindMarker函数寻找差异基因的方法,以及Seurat中如何使用Pseudobulk方法!

2.1 Seurat标准差异分析

2.1.1 两种细胞类型之间的差异分析

library(Seurat)
library(SeuratData)
library(ggplot2)

####################### 载入数据+数据预处理 ------------------
ifnb "ifnb")

# 归一化:
ifnb 
####################### 两种细胞类型之间的差异分析 ------------------
# 找CD16 Mono和CD1 Mono之间的差异基因:
Idents(ifnb) "seurat_annotations"  # 指定默认注释信息
monocyte.de.markers "CD16 Mono", ident.2 = "CD14 Mono")

# 查看结果
head(monocyte.de.markers)
#        p_val avg_log2FC pct.1 pct.2 p_val_adj
# VMO1       0   5.700274 0.778 0.084         0
# MS4A4A     0   3.349751 0.748 0.143         0
# FCGR3A     0   3.281942 0.982 0.418         0
# PLAC8      0   3.268470 0.636 0.124         0
# CXCL16     0   2.014758 0.938 0.475         0
# MS4A7      0   2.386436 0.978 0.558         0

结果解读:

  • p_val :未矫正的p值;
  • avg_log2FC :两组之间 平均表达的倍数变化 ,正值表示特征在第一组中的表达程度更高;
  • pct.1 :表达该基因的细胞占第一组所有细胞的百分比;
  • pct.2 :表达该基因的细胞占第二组所有细胞的百分比;
  • p_val_adj :Bonferroni校正p值;

2.1.2 某种细胞类型和其它所有类型整体的差异分析

####################### 某种细胞类型和其它所有类型整体的差异分析 ------------------
# 除了比较两种细胞类型,也可以将某种细胞类型和其它细胞类型整体进行比较,此时需要设置ident.2 = NULL
# only.pos = TRUE,表明只展示高表达结果:
monocyte.de.markers "CD16 Mono", ident.2 = NULL, only.pos = TRUE)

# 查看结果
head(monocyte.de.markers)
#        p_val avg_log2FC pct.1 pct.2 p_val_adj
# FCGR3A     0   4.532656 0.982 0.168         0
# MS4A7      0   3.806350 0.978 0.216         0
# CXCL16     0   3.274267 0.938 0.196         0
# VMO1       0   6.254651 0.778 0.044         0
# MS4A4A     0   4.747731 0.748 0.055         0
# LST1       0   2.927351 0.912 0.228         0

Tips: FindAllMarkers() 函数寻找的是每一个簇与所有其他簇的差异基因,通常用于寻找每个Cluster中的Marker基因。此外,可以采用不同的方法对数据进行分析,使用 test.use 参数选择具体差异分析方法,**默认采用的是 wilcox **方法,其他方法可以通过 ?FindMarkers 查看。

另外,差异分析默认基于 slot assay 中的 data 数据(归一化后的数据),不同方法所用矩阵可能不同,可以通过 slot 参数选择矩阵,例如 Deseq2 方法要求必须是 Counts 数据作为输入!

2.1.3 相同细胞类型不同处理的差异分析

####################### 相同细胞类型不同处理的差异分析 ------------------
# 先新建一个注释信息:将分组和注释整合:
ifnb$celltype.stim "_")
Idents(ifnb) "celltype.stim" # 指定默认注释信息

mono.de "CD14 Mono_STIM", ident.2 = "CD14 Mono_CTRL", verbose = FALSE)
head(mono.de)
#         p_val avg_log2FC pct.1 pct.2 p_val_adj
# IFIT1       0   7.319139 0.985 0.033         0
# CXCL10      0   8.036564 0.984 0.035         0
# RSAD2       0   6.741673 0.988 0.045         0
# TNFSF10     0   6.991279 0.989 0.047         0
# IFIT3       0   6.883785 0.992 0.056         0
# IFIT2       0   7.179929 0.961 0.039         0

2.2 基于Pseudobulk的差异分析

所谓Pseudobulk并不是特指某一种软件或者方法,而是一类方法的统称!常用的pseudobulking有很多个函数都可以实现,甚至可以手动写函数实现。本节我们介绍使用Seurat内置的AggregateExpression函数进行pseudobulk分析。

当然,Pseudobulk的方法非常多哈,师兄这里就不一一列举了,这里给大家推荐几篇推文,感兴趣的可以自行阅读:

  • https://bioconductor.org/packages/release/bioc/vignettes/glmGamPoi/inst/doc/pseudobulk.html
  • https://mp.weixin.qq.com/s/jR2OdJQPfBAfxSLSYPyqUw

2.2.1 整理数据的样本来源信息

############# 整理数据的样本来源信息 ------------
# ifnb数据集的细胞来源信息可以通过以下链接进行下载:
# https://raw.githubusercontent.com/yelabucsf/demuxlet_paper_code/master/fig3
ctrl "ye1.ctrl.8.10.sm.best.txt", head = T, stringsAsFactors = F)
stim "ye2.stim.8.10.sm.best.txt", head = T, stringsAsFactors = F)
info 
# 将BARCODE重新命名为和ifnb数据集相对应的形式:
info$BARCODE "\\-", replacement = "\\.", info$BARCODE)

# 仅保留高质量的细胞,即包含SNG的细胞:
info "SNG", x = info$BEST), ]

# 移除重复的BARCODE:
info T), ]

# 将样本信息添加到Seurat对象的metadata中:
rownames(info) info "BEST"), drop = F]
names(info) "donor_id")
# 这个函数会自动将info和ifnb根据行名进行map:
ifnb 
# 另外,还需要将Seurat对象中没有样本信息的细胞移除掉:
# 这样,ifnb里面所有细胞都有了对应的样本信息:
ifnb$donor_id[is.na(ifnb$donor_id)] "unknown"
ifnb "unknown")
table(ifnb$donor_id)
# SNG-101 SNG-1015 SNG-1016 SNG-1039  SNG-107 SNG-1244 SNG-1256 SNG-1488
# 1197     3116     1438      663      652     1998     2363     2241

2.2.2 执行pseudobulk操作

  • AggregateExpression 函数可以直接实现 将来自同一样本的每种细胞类型的所有细胞的基因计数进行相加。
############# 执行pseudobulk操作 ------------
# 注意:这里的分组需要指定清楚:
# 同一捐赠者,在同一处理下,同一细胞类型的整合:
# 因此,group.by需要指定3个分组:
pseudo_ifnb "RNA",
                                   return.seurat = T,
                                   group.by = c("stim""donor_id""seurat_annotations"))

# 可以看到,整合后13668个细胞被整合为了206个pseudobulk样本!
dim(ifnb)
# [1] 14053 13668
dim(pseudo_ifnb)
# [1] 14053   206

# 每个样本的信息包含了:处理、样本来源以及细胞类型!
tail(Cells(pseudo_ifnb))
# [1] "STIM_SNG-1488_NK"          "STIM_SNG-1488_DC"
# [3] "STIM_SNG-1488_B Activated" "STIM_SNG-1488_Mk"
# [5] "STIM_SNG-1488_pDC"         "STIM_SNG-1488_Eryth"

2.2.3 使用DESeq2进行差异分析

############# 使用DESeq2进行差异分析 ------------
# 将处理方式和细胞类型进行拼接,方便后续差异分析:
pseudo_ifnb$celltype.stim                                    pseudo_ifnb$stim, sep = "_")

# Idents函数设置细胞身份标签:
Idents(pseudo_ifnb) "celltype.stim"

# FindMarkers函数自带了DESeq2进行差异分析的方法:
bulk.mono.de                             ident.1 = "CD14 Mono_STIM",
                            ident.2 = "CD14 Mono_CTRL",
                            test.use = "DESeq2")
head(bulk.mono.de, n = 5)
#                  p_val avg_log2FC pct.1 pct.2     p_val_adj
# IL1RN    3.701542e-275   5.588693     1     1 5.201777e-271
# IFITM2   1.955627e-250   4.108615     1     1 2.748242e-246
# SSB      2.699554e-203   2.893183     1     1 3.793683e-199
# NT5C3A   2.239898e-198   4.426872     1     1 3.147729e-194
# RTCB     5.700554e-162   2.738430     1     1 8.010989e-158

Tips: 这里需要说明的是, FindMarkers 函数内置了许多种差异分析的方法,例如wilcox、MAST、DESeq2等等!大家可以根据需要选择合适的算法!

2.2.4 比较单细胞方法和pseudobulk方法的差异分析结果

############# 比较单细胞方法和pseudobulk方法的差异分析结果 ------------






请到「今天看啥」查看全文