RNA-seq分析流程二:DEseq2做不同组间差异表达分析

使用DEseq2循环做多组间差异表达分析

    当有多组RNA-seq数据时,有时需要对多个组合进行差异表达分析,例如当我有CIM0/CIM7/CIM14/CIM28四组时,我需要得到每个组合间的差异表达情况,CIM7:CIM0; CIM14:CIM0; CIM14:CIM7等。使用ANOVA的方式也可以进行多组间比较,但由于ANOVA是指定同一个CK,并且不能得到具体是哪组相对于CK有差异表达,不能精准的解决我的需求,因此选择使用DEseq2循环对不同组进行差异表达分析。

一. R脚本

    目前脚本中DEGs(差异表达基因)筛选标准为log2FoldChange>1或log2FoldChange<-1以及pvalue<0.05, qvalue<0.05,可根据需求更改阈值。

###

library(GenomicFeatures)

library(DESeq2)

library(dplyr)

###load and set output file

file_in <- "counts.txt"

file_design <- "design.txt"

file_compare <- "compare2.txt"

file_deg_num = paste("data//","DE_",file_in,sep="")  ##number of DEGs in all compare

file_final_csv  = paste("data//","DE_",file_in, "_Final_Out.csv",sep="")

file_final_genelist = paste("data//","DEG_geneid_allcomapre.txt",sep="")


################################################################

###########get DEGs in different compare

# counts file

data_in = read.table(file_in, head=TRUE,row.names =1, check.names = FALSE)

mycompare=read.table(file_compare,head=TRUE)

mydesign=read.table(file_design, head = TRUE)

##filter counts

countData = as.data.frame(data_in)

dim(countData)

mycounts_filter <- countData[rowSums(countData) != 0,]

dim(mycounts_filter)

##check group

head(mycompare)

head(mydesign)

total_num=dim(mycompare)[1]  ##get the num of groups

tracking = 0

gene_num_out = c()

pvalue_cut = 0.01

condition_name = c()

for (index_num in c(1:total_num)){

  tracking = tracking + 1

  test_name = as.character(mycompare[index_num,1])

  group1 = as.character(mycompare[index_num, 2])

  group2 = as.character(mycompare[index_num, 3])

  sample1 = mydesign[mydesign$Group == group1,]

  sample2 = mydesign[mydesign$Group == group2,]

  allsample = rbind(sample1, sample2)

  counts_sample = as.character(allsample$counts_id)

  groupreal = as.character(allsample$Group)

  countData = mycounts_filter[, counts_sample]

  colData = as.data.frame(cbind(counts_sample, groupreal))

  names(colData) = c("sample", "condition")

  dds <- DESeqDataSetFromMatrix(countData = countData,

                                colData = colData,

                                design = ~ condition)

  dds <- DESeq(dds)

  resSFtreatment <- results(dds, cooksCutoff =FALSE, contrast=c("condition",group2,group1))

  out_test = as.data.frame(resSFtreatment)

  final_each = cbind( out_test$log2FoldChange,out_test$pvalue,out_test$padj)

  rownames(final_each) = resSFtreatment@rownames

  names = c('(logFC)','(pvalue)','(Qvalue)')

  final_name = paste(test_name,'_',names,sep="")

  colnames(final_each) = final_name

  if (tracking == 1){

    final_table = final_each

  }else{

    final_table = cbind(final_table, final_each)

  }

  gene_sel = out_test[((!is.na(out_test$pvalue))&(!is.na(out_test$log2FoldChange)))&out_test$pvalue < 0.05 & abs(out_test$log2FoldChange) >= 1 & out_test$padj<0.05, ]

  gene_sel<-na.omit(gene_sel)  ##delete rows contain NA

  gene_sel_up = gene_sel [gene_sel$log2FoldChange>0,]

  gene_sel_do = gene_sel [gene_sel$log2FoldChange<0,]

  file_out_up = paste("data//DEGsid//","UP_",test_name,".txt",sep="")

  file_out_do = paste("data//DEGsid//","DOWN_",test_name,".txt",sep="")

  gene_list_up = rownames(gene_sel_up)

  gene_list_do = rownames(gene_sel_do)

  all_ub_down = list(gene_list_up, gene_list_do)

  nameup <- paste(test_name,"_up",sep="")

  namedown <- paste(test_name,"_down",sep="")

  names(all_ub_down) = c(nameup, namedown)

  if (tracking == 1){

    final_genelist = all_ub_down

  }else{

    final_genelist = c(final_genelist, all_ub_down)

  }

  gene_num_up = length(gene_list_up)

  gene_num_do = length(gene_list_do)

  write.table(gene_sel_up, file= file_out_up , row.names = TRUE,col.names = TRUE)

  write.table(gene_sel_do, file= file_out_do , row.names = TRUE,col.names = TRUE)

  condition_name = c(condition_name, paste("UP_",test_name,sep=""),paste("DO_",test_name,sep=""))

  gene_num_out = c(gene_num_out,gene_num_up,gene_num_do)

}

final_DEGs_list<-do.call(cbind, lapply(lapply(final_genelist, unlist), `length<-`, max(lengths(final_genelist))))

final_DEGs_list

out_final2 = cbind(condition_name, gene_num_out)

colnames(out_final2) = c("Tests", "DEG number")

write.table(final_DEGs_list, file=file_final_genelist, row.names = FALSE, sep="\t", na = "") ###all DEGs list

write.table(out_final2, file=file_deg_num, row.names = FALSE, sep="\t")    ##DEG number in different compare

write.csv(final_table, file=file_final_csv, row.names = TRUE,quote=TRUE)  ##allgene in all compare

二. 输入文件

2.1.counts.txt

    DEseq2的输入counts数据需为整数;如果是RSEM结果,使用expected

counts取整。

2.2.design.txt

文件共四列,格式如下:

sample_id: 样本id;

counts_id: counts文件中的样品id;

Group: 样本分组;

rep: 样本重复;

2.3.compare.txt

指定比较组

Test:进行比较的组

denominator: 对照组

numerator: 比较组

注:对照组在前,比较组在后,假如做CIM7相对于CIM0的差异表达基因分析,denominatorCIM0numeratorCIM7

三.输出文件

    运行脚本前在当前目录下建立data文件夹,并在data下建立DEGsid文件夹,用于存放输出文件。脚本运行完成后会在data文件夹下输出3个文件:

3.1.DE_counts.txt_Final_Out.csv

输出总表,格式如下:

第一列为基因id,包括所有基因,后几列为所有比较组的logFC,pvalue以及qvaue值。

3.2.DE_counts.txt

所有比较组中差异表达基因的数目。

3.3. DEG_geneid_allcomapre.txt

    所有比较组中差异表达基因的基因id,该文件用于筛选不同组间的重叠基因。“-up”表示比较组内上调的基因,“_down”表示比较组内下调的基因。

3.4.DEGsid

    DEGsid文件夹下生成一系列文件,为每个比较组的DEseq2的分析结果, “UP_”和“DOWN”分别表示上调和下调的基因。

四.找不同比较组间的重叠DEGs

得到这些输出结果后我还想找到不同组间的重叠DEGs:


names(mydegs)获得不同比较组的名称,指定mycom1和mycom2后使用intersect()找到交集。

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

推荐阅读更多精彩内容