2.1转录组 | 差异表达分析(DESeq)

1.导入数据

利用htseq计数得到的表达矩阵,下载到Windows中(再拷贝一个 .Rproj到下面文件夹中,直接双击R Project进入到当前路径下的R中进行后续操作)


做R分析的文件夹
rm(list = ls())
options(stringsAsFactors = T)
library(DESeq2)
#载入数据,只有1个对照,2个实验组(重复)
control <- read.table("SRR3589956_matrix.count",
                      sep="\t", col.names = c("gene_id","control"))
rep1 <- read.table("SRR3589957_matrix.count",
                   sep="\t", col.names = c("gene_id","rep1"))
rep2 <- read.table("SRR3589958_matrix.count",
                   sep="\t",col.names = c("gene_id","rep2"))
#将3个数据根据gene_id合并到一起
raw_count <- merge(merge(control, rep1, by="gene_id"), rep2, by="gene_id")
raw_count
raw_count
#删除raw_count的前5行
raw_count_filt <- raw_count[-1:-5,]
#gsub匹配raw_count_filt的gene_id行,生成ENSEMBL(ENSEMBL是一个字符串格式的向量)
ENSEMBL <- gsub("(.*?)\\.\\d*?_\\d", "\\1", raw_count_filt$gene_id)
#将raw_count_filt的行名替换为ENSEMBL(猜想应该是想要去掉raw_count_filt行名(即其gene_id)的小数点后面的数字)
row.names(raw_count_filt) <- ENSEMBL
#解决control没有重复的问题,自己创造一个control2#注意:创造数据不是无根据捏造。要考虑到高通量测序的read是默认符合泊松分布的,于是可以这样做:(1)计算KD重复组的均值差,作为泊松分布的均值;(2)使用概率函数rpois()随机产生一个数值,前一步的均值作为lambda;(3)对一些read count 低于均值的直接加上对应KD重复组之间的差值delta_mean <- abs(mean(raw_count_filt$rep1) - mean(raw_count_filt$rep2))sampleNum <- length(raw_count_filt$control)sampleMean <- mean(raw_count_filt$control)control2 <- integer(sampleNum)for (i in 1:sampleNum){  if(raw_count_filt$control[i] < sampleMean){    control2[i] <- raw_count_filt$control[i] + abs(raw_count_filt$rep1[i] - raw_count_filt$rep2[i])  }  else{    control2[i] <- raw_count_filt$control[i] + rpois(1,delta_mean)  }}#将创造好的control2添加到矩阵中去raw_count_filt$control2 <- control2
2.使用DESeq2进行差异基因分析

DESeq2要求的数据是raw count, 没必要进行FPKM/TPM/RPFKM/TMM标准化

#构建DESeq2所需的DESeqDataSet对象library(DESeq2)countData <- raw_count_filt[,2:5]    #countData为基因表达矩阵condition <- factor(c("control","KD","KD","control"))     #condition为处理条件dds <- DESeqDataSetFromMatrix(countData, DataFrame(condition), design= ~ condition )
#过滤low_count的数据
nrow(dds)
dds <- dds[ rowSums(counts(dds)) > 1, ]
nrow(dds)  #看下图,过滤了将近一半的数据
过滤前后基因的数量
#使用DESeq进行差异表达分析
dds <- DESeq(dds)        #出现如下红色字符,表示运行成功
出现图上红色字段,表示运行成功
#查看结果
res <- results(dds)
mcols(res, use.names = TRUE)
summary(res)
res每一列表达的含义

基因差异表达的结果

可以看到上调和下调的基因占比,low_count的比率比较高,所以大部分基因表达量不高,主要集中在0附近(log2(1)=0,也就是变化1倍)。

3.画MA图

M代表: log fold change,能衡量基因表达量变化,上调或下调。
A代表:每个基因的count的均值。

#做一个没有经过 statistical moderation平缓log2 fold changes的MA图
library(ggplot2)
#画个MA图
plotMA(res, ylim = c(-5,5))
#标注出MA图中p值最小的基因
topGene <- rownames(res)[which.min(res$padj)]
with(res[topGene, ], {
  points(baseMean, log2FoldChange, col="dodgerblue", cex=2, lwd=2)
  text(baseMean, log2FoldChange, topGene, pos=2, col="dodgerblue")
})
MA图,蓝色圆圈标注的为p值最小的基因
#如果经过lfcShrink 收缩log2 fold change, 结果会好看很多
res.shrink <- lfcShrink(dds, contrast = c("condition","KD","control"), res=res)
plotMA(res.shrink, ylim = c(-5,5))
topGene <- rownames(res)[which.min(res$padj)]
with(res[topGene, ], {
  points(baseMean, log2FoldChange, col="dodgerblue", cex=2, lwd=2)
  text(baseMean, log2FoldChange, topGene, pos=2, col="dodgerblue")
})
MA图,蓝色圆圈标注的为p值最小的基因
4.提取差异基因分析的结果
##提取差异基因分析的结果
table(res$padj<0.05)     #计算p值小于0.05的基因的个数
res_deseq <- res[order(res$padj),]   #根据res的padj值进行排序,并赋值给res_deseq
diff_gene_deseq2 <- subset(res_deseq, padj<0.05 & (log2FoldChange > 1 | log2FoldChange < -1))    #将res_deseq过滤:要求是p值小于0.05且log2FoldChange在1~-1范围内的

diff_gene_deseq2 <- row.names(diff_gene_deseq2)
res_diff_data <- merge(as.data.frame(res),as.data.frame(counts(dds,normalize=TRUE)),by="row.names",sort=FALSE)
write.csv(res_diff_data,file = "11_30_humen_data.csv",row.names = F)
##得到的11_30_humen_data.csv为差异表达分析的结果。
5.火山图
#需要先将差异表达分析得到的结果11_30_humen_data.csv在Linux中进行处理
#第三列log2foldchange大于1为上调,小于-1下调,其他的不显著(需要构建significant列:up,down,no)  
perl -F',' -alne '$F[5]=~s/\r//;if(/baseMean/){print "gene\tlog2FoldChange\tpadj\tsignificant"} else{unless(/NA/){if($F[2] >=1 && $F[5]<0.05){print "$F[0]\t$F[2]\t$F[5]\tup"} elsif($F[2]<=-1 && $F[5]<0.05){print "$F[0]\t$F[2]\t$F[5]\tdown"} else{print "$F[0]\t$F[2]\t$F[5]\tno"}}}' 11_30_humen_data.csv >volcano.txt
#火山图
library(ggplot2)
data <-read.table(file="volcano.txt",header = TRUE, row.names =1,sep = "\t")

volcano <-ggplot(data = data,aes(x=log2FoldChange,y= -1*log10(padj)))+geom_point(aes(color=significant))+scale_color_manual(values = c("red","grey","blue")) + labs(title="Volcano_Plot",x=expression((log[2](FC)), y=expression(-log[10](padj)) ))+geom_hline(yintercept=1.3,linetype=4)+geom_vline(xintercept=c(-1,1),linetype=4)
volcano
火山图
6.gene聚类热图
library(genefilter)
library(pheatmap)

rld <- rlogTransformation(dds,blind = F)
#生成一个mm.DESeq2.pseudo.counts.csv矩阵
write.csv(assay(rld),file="mm.DESeq2.pseudo.counts.csv")   

#head了前20个差异较大的基因
topVarGene <- head(order(rowVars(assay(rld)),decreasing = TRUE),20) 

mat  <- assay(rld)[ topVarGene, ]
# mat <- mat - rowMeans(mat) 减去一个平均值,让数值更加集中。得到的是第二个图。
anno <- as.data.frame(colData(rld)[,c("condition","sizeFactor")])
pheatmap(mat, annotation_col = anno)
聚类图之一

聚类图之二

做了2个聚类的图,都只做了前20个基因的聚类。第二幅图中的基因更加的集中。

参考:转录组入门(7):差异表达分析转录组学习七(差异基因分析)

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

推荐阅读更多精彩内容