前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >使用DEseq2做转录组测序差异分析的时候顺便去除批次效应

使用DEseq2做转录组测序差异分析的时候顺便去除批次效应

作者头像
生信技能树
发布2022-07-26 10:00:23
1.4K0
发布2022-07-26 10:00:23
举报
文章被收录于专栏:生信技能树

昨天的讨论:TCGA等大样本量差异分析该使用DEseq2还是edgeR呢? 让大家印象深刻,也有不少留言问到如果转录组测序数据集有批次效应该怎么办。所以我打个补丁给大家,其实使用DEseq2做转录组测序差异分析的时候顺便去除批次效应。

下面复制粘贴就可以运行的代码

转录组测序的表达量矩阵大家应该是都不陌生了,基本上和芯片技术拿到的表达量矩阵后续分析大同小异,我们有系列教程, 公众号推文在:

但是转录组测序的表达量矩阵批次效应的处理,跟芯片有一点点不同,它其实都不需要改变表达量矩阵本身,仅仅是使用DEseq2做转录组测序差异分析的时候顺便去除批次效应即可。

我们仍然是以airway为例子

加载airway数据集并转换为表达矩阵,代码如下所示:

代码语言:javascript
复制
# 1.构建表达矩阵 ----------------------------------------------------------------
dir.create("./data")

# 魔幻操作,一键清空
rm(list = ls()) 
options(stringsAsFactors = F)
# BiocManager::install('airway')
# 加载airway数据集并转换为表达矩阵
library(airway,quietly = T)
data(airway)
class(airway)

rawcount <- assay(airway)
colnames(rawcount)

# 查看表达谱
rawcount[1:4,1:4]

# 去除前的基因表达矩阵情况
dim(rawcount)

# 获取分组信息
group_list <- colData(airway)$dex
group_list

# 过滤在至少在75%的样本中都有表达的基因
keep <- rowSums(rawcount>0) >= floor(0.75*ncol(rawcount))
table(keep)

filter_count <- rawcount[keep,]
filter_count[1:4,1:4]
dim(filter_count)
 

# 保存表达矩阵和分组结果
save(filter_count, 
     group_list,
     file = "./data/Step01-airwayData.Rdata") 

因为这个 airway数据集默认是没有批次效应的,如下所示:

代码语言:javascript
复制
rm(list = ls())
options(stringsAsFactors = F)

# 读取基因表达矩阵信息
lname <- load(file = "./data/Step01-airwayData.Rdata")
lname 

# 查看分组信息和表达矩阵数据
exprSet <- filter_count
dim(exprSet)
exprSet[1:6,1:6]
table(group_list)

# 加载包
library(DESeq2)
library(pheatmap)
# 每次都要检测数据 
exprSet[1:6,1:6]
table(group_list)
pheatmap(cor(exprSet))
batch=paste0('b',rep(1:2,each=4))
batch
dat=log2(edgeR::cpm(exprSet)+1)

ht_for_RNAcounts <- function(dat){
  dat[1:4,1:4] 
  colnames(dat)
  ac=data.frame(group=group_list,
                batch=batch)
  rownames(ac)=colnames(dat)
  pheatmap(cor(dat),annotation_col  =ac)
}
ht_for_RNAcounts(dat)

可以看到,这个时候的8个样品,是按照处理组和对照组分开的,泾渭分明的;

按照处理组和对照组分开的

人为引入批次

但是我们这个教程是为了讲解使用DEseq2做转录组测序差异分析的时候顺便去除批次效应,所以需要人为的引入批次,代码如下所示:

代码语言:javascript
复制
ct_with_batch = filter_count
x= sample(1:nrow(ct_with_batch))
y = which(batch=='b1')

ct_with_batch[x,y] = ct_with_batch[x,y]+100
dat=log2(edgeR::cpm(ct_with_batch)+1)
ht_for_RNAcounts(dat)

我们对b1批次的4个样品,随机抽取1000个基因干扰它的表达量,算是模拟了一个批次效应,如下所示:

可以很明显的看到了这个时候这个数据集最大的差异来源其实是我们人为添加的批次哦,是一个假的东西,但是足够举例了。

使用DESeq2的时候去除批次

其实代码超级简单:

代码语言:javascript
复制
exprSet=ct_with_batch
suppressMessages(library(DESeq2))  
(colData <- data.frame(row.names=colnames(exprSet), 
                       group_list=group_list,
                       batch= batch ) )
dds <- DESeqDataSetFromMatrix(countData = exprSet,
                              colData = colData,
                              design = ~ group_list+batch )
dds <- DESeq(dds)
resultsNames(dds)
res <- results(dds, name=  "group_list_untrt_vs_trt")
summary(res)
save(res,file = 'group_list_untrt_vs_trt_rm_batch_deg.Rdata')

区别就是 design = ~ group_list+batch ,这里面的有两个变量,一个变量代表了我们的处理组和对照组的信息,另外一个变量就是批量信息。

看看去除批次效应的效果

简单的根据阈值判断一下上下调基因吧:

代码语言:javascript
复制
load(file = 'group_list_untrt_vs_trt_rm_batch_deg.Rdata')
resOrdered <- res[order(res$padj),]
DEG =as.data.frame(resOrdered)
rm_batch_deg = na.omit(DEG)  
head(rm_batch_deg)
# 筛选上下调,设定阈值
fc_cutoff <- 1
fdr <- 0.05 
rm_batch_deg$regulated <- "normal" 
loc_up <- intersect(which(rm_batch_deg$log2FoldChange>log2(fc_cutoff)),
                    which(rm_batch_deg$padj<fdr))
loc_down <- intersect(which(rm_batch_deg$log2FoldChange< (-log2(fc_cutoff))),
                      which(rm_batch_deg$padj<fdr))
rm_batch_deg$regulated[loc_up] <- "up"
rm_batch_deg$regulated[loc_down] <- "down" 
table(rm_batch_deg$regulated)
rm_batch_deg$ENSEMBL = rownames(rm_batch_deg)

首先可以去跟正常表达量矩阵差异分析对比:

代码语言:javascript
复制
# 这个文件Step03-DESeq2_nrDEG.Rdata 是 正常的表达量矩阵的常规差异分析 
load(file = "./data/Step03-DESeq2_nrDEG.Rdata")
head(deg_anno) 
table(deg_anno$regulated) 

tmp= merge(rm_batch_deg,deg_anno,by='ENSEMBL')
library(gplots)
table(tmp$regulated.x,tmp$regulated.y)
balloonplot(table(tmp$regulated.x,tmp$regulated.y)) 

可以看到:

代码语言:javascript
复制
> table(tmp$regulated.x,tmp$regulated.y)
        
          down normal    up
  down       0     36  1066
  normal   242  11899   419
  up       832    188     0

对有批量效应的表达量矩阵,可以在使用DEseq2做转录组测序差异分析的时候顺便去除批次效应,得到的差异基因仍然是有效果的。

但是,如果对我们人为的引入了批次效应的表达量矩阵走常规差异,就是:

代码语言:javascript
复制
exprSet=ct_with_batch
# 加载包
library(DESeq2) 
# 第一步,构建DESeq2的DESeq对象
colData <- data.frame(row.names=colnames(exprSet),group_list=group_list)
dds <- DESeqDataSetFromMatrix(countData = exprSet,colData = colData,design = ~ group_list)

# 第二步,进行差异表达分析
dds2 <- DESeq(dds)

# 提取差异分析结果,trt组对untrt组的差异分析结果
tmp <- results(dds2,contrast=c("group_list","trt","untrt"))
DEG_DESeq2 <- as.data.frame(tmp[order(tmp$padj),])
head(DEG_DESeq2)

首先会导致差异基因数量超级少,如下所示:

代码语言:javascript
复制
down normal     up 
 74  21718    138 

但是它的上下调基因仍然是蛮可靠的,仅仅是我们的人为的引入了批次效应确实是干扰了很多上下调基因被抹杀掉了。

代码语言:javascript
复制
       down normal    up
  down      73      1     0
  normal  1070  14754  1388
  up         0      0   138
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-03-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 生信技能树 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 我们仍然是以airway为例子
  • 人为引入批次
  • 使用DESeq2的时候去除批次
  • 看看去除批次效应的效果
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档