转录组分析--step2 差异分析

以下内容根据生信技能树Jimmy老师代码按个人习惯修改而成,欢迎讨论共同进步
三种最常用的方法都试一下看看,用function定义函数的写法比较整齐,不然大段大段的心烦

用DEseq2
degdeseq <- function(exprset,pd,group,pvcut){
  library(DESeq2)
  colData <- data.frame(row.names=rownames(pd), grouplist=pd[,group])
  dds <- DESeqDataSetFromMatrix(countData = exprset,colData = colData,design = ~ grouplist)
  dds <- dds[rowSums(counts(dds))>100,]   ###过滤低counts####
  dds <- DESeq(dds)
  res <- results(dds, contrast=c('grouplist',"trt","untrt"))
  #res <- results(dds, contrast=c('grouplist',"trt","untrt"),pAdjustMethod = 'fdr', alpha = 0.01)
  plotMA(res)
  resordered <- as.data.frame(res[order(res$padj),])
  resordered <- na.omit(resordered)
  fdcutoff <- with(resordered,mean(abs(log2FoldChange))+2*sd(abs(log2FoldChange))) 
  #fdcutoff <- 3      ###或者简单粗暴自己定义cutoff###
  print(fdcutoff)
  resordered$sig <- ifelse(resordered$padj<pvcut & abs(resordered$log2FoldChange)>fdcutoff,ifelse(resordered$log2FoldChange > 0,'up','down'),'no sig')        
  return(resordered)
}
resdegseq <- degdeseq(exprset,pd,'group',0.05)
table(resdegseq$sig)            ###看一下上下调基因的分布####
EdgeR
degdge <- function(exprset,group_list,pvcut){
  library(edgeR)
  dge <- DGEList(counts=exprset,group=factor(group_list))
  keepe <- rowSums(cpm(dge)>1) >=2               ###按cpm过滤低表达####
  dge <- dge[keepe,keep.lib.sizes=F]
  dge <- calcNormFactors(dge)            
  #dge$samples
  design <- model.matrix(~0+factor(group_list))
  rownames(design)<-colnames(dge)
  colnames(design)<-levels(factor(group_list))
  dge <- estimateDisp(dge,design,robust = T)
  #dge <- estimateGLMCommonDisp(dge,design)
  #dge <- estimateGLMTrendedDisp(dge, design)
  #dge <- estimateGLMTagwiseDisp(dge, design)
  fit <- glmQLFit(dge, design)
  cont.matrix=makeContrasts(contrasts=c('trt-untrt'),levels = design)
  lrt <- glmQLFTest(fit,  contrast=cont.matrix)
  nrDEG <- topTags(lrt, n=nrow(exprset))
  resdge <- na.omit(as.data.frame(nrDEG))
  #fdcutoff <- 3
  fdcutoff <- with(resdge,mean(abs(logFC))+2*sd(abs(logFC)))
  print(paste0('fdcutoff is ',fdcutoff))
  resdge$sig <- ifelse(resdge$PValue<pvcut & abs(resdge$logFC)>fdcutoff,ifelse(resdge$logFC > 0,'up','down'),'no sig')
  return(resdge)
}
resdge <- degdge(exprset,group_list,0.05)
table(resdge$sig)
Limma
deglim <- function(exprset,pvcut){
  library(limma)
  design <- model.matrix(~0+factor(group_list))
  colnames(design)=levels(factor(group_list))
  rownames(design)=colnames(exprset)
  dgelim <- DGEList(counts=exprset,group=factor(group_list))
  keepl <- rowSums(cpm(dgelim)>1) >=2               ###按cpm过滤低表达####
  dgelim <- dgelim[keepl,keep.lib.sizes=F]
  dgelim <- calcNormFactors(dgelim)
  #logCPM <- cpm(dgelim, log=TRUE, prior.count=3)    ####可以选另一种方法trend#####
  #fitc <- lmFit(logCPM, design)
  v <- voom(dgelim,design,plot=TRUE, normalize="quantile")
  fit <- lmFit(v, design)
  cont.matrix=makeContrasts(contrasts=c('trt-untrt'),levels = design)
  fit2 <- contrasts.fit(fit,cont.matrix)
  fit2 <- eBayes(fit2)
  tempOutput <- topTable(fit2, coef='trt-untrt', n=Inf)
  deglim <- na.omit(tempOutput)
  #fdcutoff <- 3
  fdcutoff <- with(deglim,mean(abs(logFC))+2*sd(abs(logFC)))
  deglim$sig <- ifelse(deglim$adj.P.Val<pvcut & abs(deglim$logFC)>fdcutoff,ifelse(deglim$logFC > 0,'up','down'),'no sig')
  print(paste0('fdcutoff is ',fdcutoff))
  return(resdge)
}
reslim <- deglim(exprset,0.05)
table(reslim$sig)
#######check expression ####
cherld <- function(rld){
  library(gplots)
  rld <- assay(rlogTransformation(dds))                 ####in deseq2 count-log2 
  rld <- log2(cpm(exprset)+1)                           ####cpm
  boxplot(rld)
  hist(rld)
  sampleDists <- as.matrix(dist(t(rld)))
  library(RColorBrewer)
  mycols <- brewer.pal(ncol(sampleDists), "Dark2")[1:length(unique(group_list))]
  heatmap.2(as.matrix(sampleDists), key=F, trace="none",
            col=colorpanel(100, "black", "white"),
            ColSideColors=mycols[group_list], RowSideColors=mycols[group_list],
            margin=c(10, 10), main="Sample Distance Matrix")
}

韦恩图,看一下三种方法的差距

######gene overlap ######
venn <- function(degf,allv,deseq){
  library(VennDiagram)
  geneedge <- rownames(degf)[-grep("no sig",degf$sig)]
  genelima <- rownames(allv)[-grep("no sig",allv$sig)]
  genedeseq <- rownames(deseq)[-grep("no sig",deseq$sig)]
  venn.plot <- venn.diagram(x=list(edger=geneedge,limmac=genelima,deseq=genedeseq),col="transparent",filename = '3 triple overlap.png',
                            fill=c("red","blue","green"),cex = 1.5,
                            fontfamily = "serif",
                            fontface = "bold",
                            cat.default.pos = "text",
                            cat.col = c("darkred", "darkblue", "darkgreen"),
                            cat.cex = 1.5,
                            cat.fontfamily = "serif",
                            cat.dist = c(0.08, 0.08, 0.08),
                            cat.pos = 0,
                            alpha = 0.7,
                            margin = 0.08)
}
venn(resdegseq,resdge,reslim)

类似效果如下

热图展示​

######heatmap######
pt <- function(degsig,exprn,pd){
  library(pheatmap)
  degsig <- degsig[-grep('no sig',degsig$sig),] 
  #degsig <- degsig[order(degsig$log2FoldChange,decreasing = T),]  ###for deseq2####
  g <- c(head(rownames(degsig),20),tail(rownames(degsig),20))  #前20个差异基因###
  degmat <- exprn[g,]
  #degmat <- log2(degmat+1)
  degmat <- t(scale(t(degmat)))                        ##normalize extreme value##
  anc <- matrix(pd$type)
  rownames(anc) <- rownames(pd)
  anc <- as.data.frame(pd$type,row.names = rownames(pd))
  pheatmap(degmat,annotation_col = anc,cluster_cols = F)
}
pt(reslim,mergerem,pd2)

火山图

######volcano########
volcano_print <- function(DEG,fccutoff,pcutoff,plotfccut,plotpcut){
  library(dplyr)
  library(ggrepel)
  degsig <- DEG[-grep('no sig',DEG$sig),]
  this_tile <- paste0('Cutoff for log2FoldChange is ',round(fccutoff,3),
                      '\nThe number of up gene is ',nrow(DEG[DEG$sig =='up',]) ,
                      '\nThe number of down gene is ',nrow(DEG[DEG$sig =='down',]))
  l <- degsig[which(abs(degsig$log2FoldChange)>=plotfccut & (-log10(degsig$padj) > -log10(plotpcut))),]                     ##filter label###
  g <- ggplot(data=degsig, aes(x=log2FoldChange, y=-log10(padj), color=sig)) +
    geom_point(aes(color = sig), alpha = 0.6, size = 1)  +
    theme_set(theme_set(theme_bw(base_size=20)))+
    geom_vline(xintercept = c(-fccutoff, fccutoff), color = 'gray', size = 0.25) +
    geom_hline(yintercept = -log(pcutoff, 10), color = 'gray', size = 0.25) +
    xlab("log2 fold change") + ylab("-log10 p-value") +
    ggtitle( this_tile ) + theme(plot.title = element_text(size=15,hjust = 0.5))+
    geom_text_repel(data=l,aes(label=rownames(l)),size=2)      ###加标签###
  print(g)
}
volcano_print(resdegseq,3,0.05,3,0.05)

代码出来是有标签的,图上忘了加

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

推荐阅读更多精彩内容

  • 国有资产划转的涉税问题探讨 姜新录,陈爱华陇上税语1月30日 在对资产划转行为定性的基础上,笔者对现行相关的税收政...
    UncleHappy阅读 3,842评论 0 0
  • 自杀未遂者(小说) 文/黄开兵 马宝还是睁开眼睛了。 马宝感觉头已经裂开了,他想,肯定像一堆碎石头一样了。 但他很...
    黄开兵阅读 824评论 1 3
  • 没有最难,只有更难。 味随心,欢喜的时候什么都是好的…… 可欢喜的时候,太少…… 仿佛都与我无缘。 记得那一年,有...
    二娃爱读书阅读 316评论 0 2
  • 我劝自己好好学习,我劝自己好好学习,用自身学习行动,来追求自身美好生活。 悠然回到母校,多的是几分自责,少的是几分...
    庄德坤阅读 137评论 0 1