RNA-seq学习:No.4下游分析之DEseq2包差异分析

基于上游分析获得表达矩阵后,就可以进行差异分析了,最基础的莫过于利用DEseq2包寻找差异基因。学习自b站视频生信技能树转录组视频~

0、数据准备及前处理

  • 由于目前在家不方便获得数据,因此参照教学视频使用airway包的现成数据。
    如链接中官方介绍,airway包背景是使用地塞米松处理的四个人气道(支气管?)平滑肌细胞(即共8个数据)进行rna-seq实验,分析得到的基因表达矩阵。
if (!requireNamespace("BiocManager", quietly = TRUE))
  install.packages("BiocManager")
BiocManager::install("airway")
library(airway)
data(airway)
airway
class(airway)
  • 如上返回结果,airway为RangedSummarizedExperiment类型的对象,是将数据归档R包的一个好方法,使用时主要会涉及到两个函数操作
    assay(data)表示取观测为基因名,变量为样本信息的表达矩阵;
    colData(data) 则是取记录详细的样本信息;
exp=assay(airway)   #取原始表达矩阵数据
tmp=colData(airway)
tmp=as.data.frame(airway)
#由于后续分析需要分组信息,因此这里我们取下第三列信息
group=colData(airway)[,3]   
class(group)
exp--表达矩阵

tmp--样本信息

值得注意的是colData(airway)得到的结果并非直接为真正的表格,还需要用as.data.frame()函数转换下,后面分析还会遇到类似的问题。

index1=c(rowSums(exp)>0)
class(index1)
exp2=exp[index1,]
  • 此处操作的目的在于将没有read比对上的基因行删去,简洁数据~

1、DEseq2包差异分析

(1)设置单列分组样本信息表

group
sample=c(colnames(exp2))  #取样本名信息
f=as.data.frame(group)
rownames(f)=c(sample)  #设置行名为样本名信息
colnames(f)='condition' #列名
样本分组信息表

(2)DESeq2分析

library("DESeq2")
dds=DESeqDataSetFromMatrix(countData = exp2,
                            colData = f,
                            design = ~ condition)
dep=DESeq(dds)
res=results(dep,contrast=c("condition","trt","untrt"))

这里要注意一下,所谓差异分析,即比较实验组与对照组相比,基因表达变化情况。通过contrast=参数分别设置样本分组信息表的列名,实验组名(numerator,分子),对照组名(denominator,分母);即研究分子/分母的结果

DEG1=as.data.frame(res)
write.csv(x=DEG1,file="res.csv") 
  • 返回的六列值中重点关注 log2FoldChange,pvalue,padj三列内容。

log2FoldChange中的FoldChange即倍数变化的意思。某一基因表达 实验组/对照组,可分为两种结果:大于1,即上调;小于1,即下调。利用log函数将其分别转化成正数、负数,更便于理解。(通常为了防止取log2时产生NA,我们会给表达值加1(或者一个极小的数),也就是log2(B+1) - log2(A+1));
pvalue是假设检验的p值,值越小(一般标准0.05)即说明log2FoldChange数据的可靠性越强;padj为adjusted p-value值,也称Q-value、FDR(false discovery rate)为效验过后的p-value值,更有信服力。

DEG1
resOrdered=res[order(res$pvalue),] #order函数是给出从小到大排序后的位置(默认升序)
sum(res$padj<0.1, na.rm=TRUE) # na.rm 为remove na值,否则会影响统计量
sum(res$pvalue<0.05, na.rm=TRUE)  
sum(!is.na(res$pvalue))  
resSig=subset(resOrdered, padj<0.1)  
DEG2=as.data.frame(resSig)
write.csv(x=resSig, file = "results.csv") 
DEG2

2、绘制热图

  • 根据基因表达矩阵比对上的read数目绘制
  • 这里选取最有意义的50个基因比对read数目为例
library(pheatmap)
choose_gene=head(rownames(DEG2),50)    
#根据DEG2结果,提取目标基因名
choose_matrix=exp2[choose_gene,]
choose_matrix=t(scale(t(choose_matrix)))

一般绘制热图,都需要对数据进行归一化处理。这里用到了t()转置函数的原因是因为基因表达矩阵表中观测为基因,变量为样本。而scale()归一化函数是针对每一列单独处理的。因为每一个基因的本身情况各不相同,而且我们的目的是基于实验组与对照组的比较来研究基因表达变化,所以需要转置下表达矩阵(观测为样本,变量为基因),然后再进行对每一列的归一化处理;最后再进行一次转置,即得到下图结果。

choose_matrix
pheatmap(choose_matrix,filename = 'DEG_top50_heatmap.png')
DEG_top50_heatmap.png

3、绘制火山图

  • 本质上就是根据DEG数据里基因的log2FoldChange与pvalue绘制点图
  • 把点分成三类:上调基因、下调基因与无显著改变基因。
DEG1=na.omit(DEG1)

(1) 设定分类判断阈值并增加分类列

logFC_cutoff=with(DEG1,mean(abs(log2FoldChange))+2*sd(abs(log2FoldChange)))
logFC_cutoff
2^logFC_cutoff   
# 返回结果为 3.67
DEG1$change=as.factor(ifelse(DEG1$pvalue<0.05 &  abs(DEG1$log2FoldChange)>logFC_cutoff,
                             ifelse(DEG1$log2FoldChange>logFC_cutoff,'UP','DOWN'),'NOT'))

(2)编写图中的注释信息

this_tile=paste('Cutoff for logFC is ',round(logFC_cutoff,3),
                '\nThe number of up gene is ',nrow(DEG1[DEG1$change=='UP',]),
                '\nThe number of down gene is ',nrow(DEG1[DEG1$change=='DOWN',]))
  • 其中 \n表示换行符

(3)利用ggplot2绘制火山图

library(ggplot2)
g=ggplot(data=DEG1,
         aes(x=log2FoldChange,y=-log10(pvalue),   #这里将pvalue取负对数
             color=change)) +
  geom_point(alpha=0.4,size=1.75) +     #绘制点图
  theme_set(theme_set(theme_bw(base_size=20))) +
  xlab("log2 fold change")+ylab("-log10 pvalue") +    #轴标签
  ggtitle(this_tile)+theme(plot.title=element_text(size=15,hjust=0.5)) +
  scale_color_manual(values=c('blue','black','red'))   #设定颜色
ggsave(g,filename='volcano.png')
# 如下图,一般会重点关注两边的,偏上方的基因点
volcano.png

以上是基于基因表达矩阵进行差异分析以及绘制热图、火山图的大致流程。这应该下有分析简单的开始,后期还有富集分析等,再慢慢学习吧~

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,968评论 6 482
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,601评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 153,220评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,416评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,425评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,144评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,432评论 3 401
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,088评论 0 261
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,586评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,028评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,137评论 1 334
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,783评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,343评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,333评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,559评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,595评论 2 355
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,901评论 2 345

推荐阅读更多精彩内容