单细胞分析绕不过去的坎,三种方法帮你解决!总有一款适合你!
单细胞数据的差异分析
大家好,我是风风。欢迎来到风风的从零开始单细胞系列。我们接着我们未完成的系列内容,算一算还蛮多内容可以扩展。今天我们来看看单细胞数据表达差异的几种常见方法。
咦?单细胞也有表达差异分析吗?当然有!表达差异并不是bulk seq数据的专属,而且用的方法也大同小异。2019年BMC Bioinformatics曾发过一篇比较单细胞RNA测序数据差异基因表达分析工具的文章,题目为“Comparative analysis of differential gene expression analysis tools for single-cell RNA sequencing data”,文章比较了11种不同的分析方法的优劣,并将不同方法进行了总结归纳,不仅提供了每种方法的应用链接,连相应文献也在这篇文章的引文中找到,真乃一文走完所有的路,让别人无路可走啊!我摘录了几张比较重要的结果如下:
我把文章放在了资料下载区,感兴趣的话可以后台回复关键词后获取。
今天我们主要介绍三种常见单细胞数据差异分析方法:Wilcox Test、edgeRh和Monocle,并仿照这篇文章,使用ROC曲线对同一份数据用这三种方法的差异分析结果进行比较。
首先我们导入相应的数据进行分析:
rm(list = ls())
options(stringsAsFactors = FALSE)
set.seed(123456) # 设置随机种子,方便重复结果
安装R包
"devtools") install.packages(
"scRNA.seq.funcs") BiocManager::install(
"edgeR") BiocManager::install(
"MAST") BiocManager::install(
"monocle") BiocManager::install(
"ROCR") install.packages(
library(scRNA.seq.funcs)
library(edgeR)
# Loading required package: limma
library(monocle)
library(ROCR)
NA19101和NA19239的单细胞数据进行分析
DE <- read.table("ENSG2.txt")
notDE <- read.table("ENSG1.txt")
GroundTruth <- list(
DE = as.character(unlist(DE)),
notDE = as.character(unlist(notDE))
)
molecules <- read.table("matrix.txt", sep = "\t") # 加载矩阵
molecules[1:6,1:6]
# NA19098.r1.A01 NA19098.r1.A02 NA19098.r1.A03 NA19098.r1.A04
# ENSG00000237683 0 0 0 1
# ENSG00000187634 0 0 0 0
# ENSG00000188976 3 6 1 3
# ENSG00000187961 0 0 0 0
# ENSG00000187583 0 0 0 0
# ENSG00000187642 0 0 0 0
# NA19098.r1.A05 NA19098.r1.A06
# ENSG00000237683 0 0
# ENSG00000187634 0 0
# ENSG00000188976 4 2
# ENSG00000187961 0 0
# ENSG00000187583 0 0
# ENSG00000187642 0 0
anno <- read.table("annotation.txt", sep = "\t", header = TRUE) # 加载注释信息
head(anno)
# individual replicate well batch sample_id
# 1 NA19098 r1 A01 NA19098.r1 NA19098.r1.A01
# 2 NA19098 r1 A02 NA19098.r1 NA19098.r1.A02
# 3 NA19098 r1 A03 NA19098.r1 NA19098.r1.A03
# 4 NA19098 r1 A04 NA19098.r1 NA19098.r1.A04
# 5 NA19098 r1 A05 NA19098.r1 NA19098.r1.A05
# 6 NA19098 r1 A06 NA19098.r1 NA19098.r1.A06
keep <- anno[,1] == "NA19101" | anno[,1] == "NA19239"
data <- molecules[,keep]
group <- anno[keep,1]
batch <- anno[keep,4]
去除至少在6个细胞中没有表达的基因
gkeep <- rowSums(data > 0) > 5;
counts <- data[gkeep,]
标准化
lib_size = colSums(counts)
norm <- t(t(counts)/lib_size * median(lib_size))
接下来我们来比较各种单细胞差异分析的方法。
Wilcox检验,又称为Wilcox-rank-sum检验,这是一种大家非常熟悉的非参数检验方法,一般用于检验一个组的数值是否大于或者小于另一个组的数值。因此,这种方法通常被认为是检验两组之间表达量中位数的差异:
# 定义函数进行ROC分析
DE_Quality_AUC <- function(pVals){
pVals <- pVals[names(pVals) %in% GroundTruth$DE |
names(pVals) %in% GroundTruth$notDE]
truth <- rep(1, times = length(pVals));
truth[names(pVals) %in% GroundTruth$DE] = 0;
pred <- ROCR::prediction(pVals, truth)
perf <- ROCR::performance(pred, "tpr", "fpr")
ROCR::plot(perf)
aucObj <- ROCR::performance(pred, "auc")
return([email protected][[1]])
}
# ROC曲线可以用来评估阈值的显著性效果,帮助我们调整阈值,可以计算出ROC曲线下的面积也就是AUC值进行准确性统计
# 接下来进行Wilcox Test差异分析
pVals <- apply(
norm, 1, function(x){
wilcox.test(
x[group == "NA19101"],
x[group == "NA19239"]
)$p.value
}
)
# 多重检验矫正获取FDR值
pVals <- p.adjust(pVals, method = "fdr")
# 绘制ROC曲线
DE_Quality_AUC(pVals) # 0.8320326
# [1] 0.8320326
edgeR是基于基因表达的负二项式模型,并使用广义线性模型(GLM)框架,这得其他因素(如批次)可以纳入模型中,edgeR也是常见分析二代测序数据差异表达的方法:
dge <- DGEList(
counts = counts,
norm.factors = rep(1, length(counts[1,])),
group = group
)
group_edgeR <- factor(group) # 设置组别
design <- model.matrix(~ group_edgeR)# edgeR差异分析
dge <- estimateDisp(dge, design = design, trend.method = "none")
fit <- glmFit(dge, design) # 广义线性模型
res <- glmLRT(fit)
pVals <- res$table[,4] # 获取p值
names(pVals) <- rownames(res$table)
pVals <- p.adjust(pVals, method = "fdr") # 获取FDR值
DE_Quality_AUC(pVals) # 0.8466764
# [1] 0.8466764
Monocle是一种灵活的差异分析方法,可以选择使用几种不同的模型。对于计数数据,Monocle推荐使用负二项式模型(negbinomial size)。对于归一化数据,它建议将其进行对数转换,然后使用正态分布法(gaussianff)。与edgeR类似,这个方法使用GLM框架,所以理论上可以考虑到批次效应,但是实际上对于含有批次效应的数据一般不使用这种方法:
pd <- data.frame(group = group, batch = batch)
rownames(pd) <- colnames(counts)
pd <- new("AnnotatedDataFrame", data = pd)
Obj <- newCellDataSet(
as.matrix(counts),
phenoData = pd,
expressionFamily = negbinomial.size()
)
# Warning in newCellDataSet(as.matrix(counts), phenoData = pd, expressionFamily =
# negbinomial.size()): Warning: featureData must contain a column verbatim named
# 'gene_short_name' for certain functions
# Warning in newCellDataSet(as.matrix(counts), phenoData = pd, expressionFamily =
# negbinomial.size()): Warning: featureData must contain a column verbatim named
# 'gene_short_name' for certain functions
# Warning in newCellDataSet(as.matrix(counts), phenoData = pd, expressionFamily =
# negbinomial.size()): Warning: featureData must contain a column verbatim named
# 'gene_short_name' for certain functions
Obj
# CellDataSet (storageMode: environment)
# assayData: 16026 features, 576 samples
# element names: exprs
# protocolData: none
# phenoData
# sampleNames: NA19101.r1.A01 NA19101.r1.A02 ... NA19239.r3.H12 (576
# total)
# varLabels: group batch Size_Factor
# varMetadata: labelDescription
# featureData: none
# experimentData: use 'experimentData(object)'
# Annotation:
Obj <- estimateSizeFactors(Obj)
Obj <- estimateDispersions(Obj)
# Warning: `group_by_()` was deprecated in dplyr 0.7.0.
# Please use `group_by()` instead.
# See vignette('programming') for more help
# Warning: `select_()` was deprecated in dplyr 0.7.0.
# Please use `select()` instead.
# Warning in log(ifelse(y == 0, 1, y/mu)): 产生了NaNs
# Warning: step size truncated due to divergence
# Removing 169 outliers
res <- differentialGeneTest(Obj, fullModelFormulaStr = "~group")
head(res)
# status family pval qval
# ENSG00000237683 OK negbinomial.size 0.470353620 0.59881531
# ENSG00000187634 OK negbinomial.size 0.414632560 0.54771690
# ENSG00000188976 OK negbinomial.size 0.003590441 0.01114692
# ENSG00000187961 OK negbinomial.size 0.199242717 0.31316828
# ENSG00000187583 OK negbinomial.size 0.517081439 0.64213468
# ENSG00000187642 OK negbinomial.size 0.040460145 0.08679083
pVals <- res[,3]
names(pVals) <- rownames(res)
pVals <- p.adjust(pVals, method = "fdr")
DE_Quality_AUC(pVals) # 0.8252662
# [1] 0.8252662
好了,本期单细胞数据差异分析的方法到此结束,我们总共介绍了3种方法,并使用同一数据进行差异分析,再使用ROC曲线对分析结果进行比较。当然,对于不同的数据,比较的结果也可能存在一些差异,这些就需要大家根据自己的数据进行调整并且选择合适的方法啦!
后台回复“feng 51”获取代码和数据,我们下期见!
单细胞分析专栏传送门
碎碎念专栏传送门(完结)
风之美图系列传送门(完结)
—
END—
撰文丨风 风
排版丨四金兄
主编丨小雪球
欢迎大家关注解螺旋生信频道-挑圈联靠公号~
关键词
结果
方法
文章
R包
CNS级别
最新评论
推荐文章
作者最新文章
你可能感兴趣的文章
Copyright Disclaimer: The copyright of contents (including texts, images, videos and audios) posted above belong to the User who shared or the third-party website which the User shared from. If you found your copyright have been infringed, please send a DMCA takedown notice to [email protected]. For more detail of the source, please click on the button "Read Original Post" below. For other communications, please send to [email protected].
版权声明:以上内容为用户推荐收藏至CareerEngine平台,其内容(含文字、图片、视频、音频等)及知识版权均属用户或用户转发自的第三方网站,如涉嫌侵权,请通知[email protected]进行信息删除。如需查看信息来源,请点击“查看原文”。如需洽谈其它事宜,请联系[email protected]。
版权声明:以上内容为用户推荐收藏至CareerEngine平台,其内容(含文字、图片、视频、音频等)及知识版权均属用户或用户转发自的第三方网站,如涉嫌侵权,请通知[email protected]进行信息删除。如需查看信息来源,请点击“查看原文”。如需洽谈其它事宜,请联系[email protected]。