如果你还不会利用limma进行多组差异分析?不慌!跟着小果一文拿捏
生信人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)等小工具,欢迎大家和小果一起讨论学习哈!!!!
往期推荐
点击“阅读原文”立刻拥有
↓↓↓