如果你还不会利用limma进行多组差异分析?不慌!跟着小果一文拿捏






如果你还不会利用limma进行多组差异分析?不慌!跟着小果一文拿捏

小果  生信果  2023-07-05 19:00:29

生信人R语言学习必备

立刻拥有一个Rstudio账号

开启升级模式吧

(56线程,256G内存,个人存储1T)

 

今天小果想为大家分享的是基于limma包进行多组差异分析


limma包在进行GEO数据库mRNA芯片数据分析时,使用的频率非常非常高,强烈安利小伙伴学习奥!有GEO数据分析需求的小伙伴可以跟着小果一起来学习,接下来小果就开始今天的分享。



1. 如何利用limma进行多组差异分析?

在进行讲解如何进行分析之前,小果想为小伙伴简单讲解一下limma包的分析原理,该包是基于线性模型进行差异分析,如何使用该包进行转录组数据差异分析,可以参考官网http://bioconductor.org/packages/release/bioc/vignettes/limma/inst/doc/usersguide.pdf文档进行学习,小果在这里就不做详细介绍了。本推文只需要基因表达矩阵文件和样本分组文件,就可以批量完成多组差异分析,非常简单方便,值得小伙伴们学习奥!接下来跟着小果开始今天的实操学习吧!


2. 准备需要的R包

limma包的安装直接可以通过Bioconductor安装,安装非常简单,小果为大家也提供网址:http://bioconductor.org/packages/release/bioc/html/limma.html,如下:



#安装limma包BiocManager::install("limma")#加载limma包library(limma)



3. 数据准备

input_FPKM.txt

#基因表达矩阵文件,行名为Gene,列为样本名.

 

input_subtype.txt

##样本分组信息文件,第一列为样本名,第二列为分组信息

 



4. limma进行多组差异分析

# 创建需要配对比较的列表函数createList <- function(group=NULL) {  tumorsam <- names(group)  sampleList = list()  treatsamList =list()  treatnameList <- c()  ctrlnameList <- c()  #A-1: 类1 vs 其他  sampleList[[1]] = tumorsam  treatsamList[[1]] = intersect(tumorsam, names(group[group=="immune"])) # 亚型名称需要根据情况修改  treatnameList[1] <- "immune" # 该亚型的命名  ctrlnameList[1] <- "Others" # 其他亚型的命名  #A-2: 类2 vs 其他  sampleList[[2]] = tumorsam  treatsamList[[2]] = intersect(tumorsam, names(group[group=="keratin"]))  treatnameList[2] <- "keratin"  ctrlnameList[2] <- "Others"  #A-3: 类3 vs 其他  sampleList[[3]] = tumorsam  treatsamList[[3]] = intersect(tumorsam, names(group[group=="MITF-low"]))  treatnameList[3] <- "MITF-low"  ctrlnameList[3] <- "Others"  #如果有更多类,按以上规律继续写  return(list(sampleList, treatsamList, treatnameList, ctrlnameList))}# 配对limma差异分析函数twoclasslimma <- function(res.path=NULL, expr=NULL, prefix=NULL, complist=NULL, overwt=FALSE) {  sampleList <- complist[[1]]  treatsamList <- complist[[2]]  treatnameList <- complist[[3]]  ctrlnameList <- complist[[4]]  allsamples <- colnames(expr)  options(warn=1)  for (k in 1:length(sampleList)) { # 循环读取每一次比较的内容    samples <- sampleList[[k]]    treatsam <- treatsamList[[k]]    treatname <- treatnameList[k]    ctrlname <- ctrlnameList[k]    compname <- paste(treatname, "_vs_", ctrlname, sep="") # 生成最终文件名    tmp = rep("others", times=length(allsamples))    names(tmp) <- allsamples    tmp[samples]="control"    tmp[treatsam]="treatment"    outfile <- file.path( res.path, paste(prefix, "_limma_test_result.", compname, ".txt", sep="") )    if (file.exists(outfile) & (overwt==FALSE)) { # 因为差异表达分析较慢,因此如果文件存在,在不覆盖的情况下(overwt=F)不再次计算差异表达      cat(k, ":", compname, "exists and skipped;n")      next    }    pd <- data.frame(Samples=names(tmp),Group=as.character(tmp),stringsAsFactors = F)    design <-model.matrix(~ -1 + factor(pd$Group, levels=c("treatment","control"))) # 设计矩阵仅包含亚型信息,若有批次效应请修改    colnames(design) <- c("treatment","control")    # 对数转换    gset <- log2(expr + 1)     # 差异表达过程    fit <- lmFit(gset, design=design);    contrastsMatrix <- makeContrasts(treatment - control, levels=c("treatment", "control"))    fit2 <- contrasts.fit(fit, contrasts=contrastsMatrix)    fit2 <- eBayes(fit2, 0.01)    tT <- topTable(fit2, adjust="fdr", sort.by="B", number=100000)    tT <- subset(tT, select=c("logFC","t","B","P.Value","adj.P.Val"))    colnames(tT) <- c("log2FC","t","B","PValue","FDR")    tT <- tT[order(tT$FDR),]    write.table(tT, file=outfile, row.names=T, col.names=NA, sep="t", quote=F)    cat(k, ",")  }  options(warn=0)}# 读取表达矩阵expr <- read.table("input_FPKM.txt",sep = "t",header = T,check.names = F,stringsAsFactors = F,row.names = 1)# 读取分组信息subt <- read.table("input_subtype.txt", sep = "t", check.names = F, stringsAsFactors = F, header = T, row.names = 1)#分组名称n.sub.label <- unique(subt$TCGA_Subtype) #分组个数n.sub <- length(table(subt$TCGA_Subtype)) ### 创建配对比较的列表信息#获得分组名group <- subt$TCGA_Subtype#通过样本名来命名names(group) <- rownames(subt)#利用createList函数创建需要比较的列表信息complist <- createList(group=group)# 利用twoclasslimma函数进行分组差异分析,所有配对差异表达结果都会输出在res.path路径下。twoclasslimma(res.path = ".",              expr = expr[,intersect(colnames(expr),rownames(subt))],              prefix = "SKCM",              complist = complist,              overwt = F)



5. 结果文件

1. SKCM_limma_test_result.immune_vs_Others.txt

该结果文件为计算的immune组与其他分组的差异分析结果文件,行名为基因名,第一列为log2FC,第四列为Pvalue值,第五列为FDR(矫正后的P值)

 

2. SKCM_limma_test_result.keratin_vs_Others.txt

该结果文件为计算的keratin组与其他分组的差异分析结果文件,行名为基因名,第一列为log2FC,第四列为Pvalue值,第五列为FDR(矫正后的P值)

 

3. SKCM_limma_test_result.MITF-low_vs_Others.txt

该结果文件为计算的MITF-low组与其他分组的差异分析结果文件,行名为基因名,第一列为log2FC,第四列为Pvalue值,第五列为FDR(矫正后的P值).

 

 

今天小果的分享就到这里啦!如果小伙伴有其他数据分析需求,可以尝试使用本公司新开发的生信分析小工具云平台,零代码完成分析,非常方便奥,云平台网址为:http://www.biocloudservice.com/home.html,包括了用edgeR实现多组差异分析(http://www.biocloudservice.com/289/289.php),DEseq2实现多组差异分析(http://www.biocloudservice.com/287/287.php)等小工具,欢迎大家和小果一起讨论学习哈!!!!


往期推荐


1 PCA绘图,从原理到绘图

2 小果的单日小技巧DAY6:如何利用panImmune轻松分析免疫浸润?

3 Fastp软件:处理fastq文件它超棒!

4 高分生信SCI常用的肿瘤免疫学单细胞分析工具

5 基因维度太高怎么办?无所谓!PCA降维会出手!

点击“阅读原文”立刻拥有

↓↓↓