百日筑基篇——差异基因分析Limma包(R语言初识七)
书接上章,简述了在R中用DESeq2包进行差异基因分析;其实,还可以用另外的R包,本章则简述Limma包在差异基因分析中的应用,并于DESeq2包比较,希望通过我的学习笔记,能加深理解。
Limma包是针对微阵列数据和RNA-seq数据开发的一个强大的R软件包,其提供了一套统计模型和工具来鉴定差异表达基因,是进行差异基因分析的常用方法之一
首先,对原始数据进行质量控制和预处理操作。这包括检查数据质量、去除背景噪音、标准化处理等。
示例数据:
head(gene)
c1 c2 c3 c4 c5 c6 c7 c8 t1 t2 t3 t4 t5 t6 t7 t8
ENSG00000000003.13 895 4596 2304 2001 4014 6387 2381 1319 2027 3750 2255 2305 3489 1402 3554 1702
ENSG00000000005.5 4 0 1 1 0 2 0 1 2 0 0 5 0 3 1 0
ENSG00000000419.11 1845 4645 2772 2699 1768 4096 3993 2798 3815 3955 2678 2189 1788 2978 2695 1288
ENSG00000000457.12 853 692 1539 1940 1400 1648 1109 1329 1218 1017 608 1077 1212 1226 776 1057
ENSG00000000460.15 273 959 1077 1436 913 1853 837 273 1019 856 621 497 852 561 502 688
ENSG00000000938.11 1880 298 779 468 868 291 542 770 1431 438 463 369 691 1720 3987 817
创建样本分类信息表:
coldata <- data.frame(group = factor(rep(c(‘control’, ‘treat’), each = 8)))
然后:
#加载包
library(limma)
# 构建设计矩阵
design <- model.matrix(~group, data=gene)
colnames(design)=levels(coldata$group)
rownames(design)=colnames(gene)
> design
control treat
c1 1 0
c2 1 0
c3 1 0
c4 1 0
c5 1 0
c6 1 0
c7 1 0
c8 1 0
t1 1 1
t2 1 1
t3 1 1
t4 1 1
t5 1 1
t6 1 1
t7 1 1
t8 1 1
attr(,"assign")
[1] 0 1
attr(,"contrasts")
attr(,"contrasts")$`coldata$group`
[1] "contr.treatment"
#control组被编码为0,treat组被编码为1。这意味着该对比方式将以control组为参考(基准)
在回归模型中,如果使用了该对比方式,那么截距项对应的是control组,而与treat组的系数则代表了treat组相对于control组的差异效应。
然后,我们规定哪一组数据与哪一组数据比较。
contrast.matrix<-makeContrasts("control-treat",levels=design)
> contrast.matrix
Contrasts
Levels control-treat
control 1
treat -1
在这个对比矩阵中,"control"组被编码为1,"treat"组被编码为-1。这意味着您想要计算"control"组相对于"treat"组的差异。
Voom方法结合了基于方差稳定化的权重计算和线性模型分析。它通过对原始计数数据进行log转换,并根据样本之间的差异来估计每个基因的准确差异度量。然后,voom函数将这些差异度量与基因的变化方差结合起来,产生稳健的权重,用于基因表达差异的统计分析。
除了稳健的权重计算外,voom函数还可用于对数据进行归一化。它会自动进行样本之间的读数均衡化。
v <- voom(gene, design, plot = TRUE)
#利用线性模型拟合数据
fit <- lmFit(v,design)
#使用contrast.matrix对拟合的线性模型进行对比。这个步骤可以帮助比较不同组别或处理之间的差异。
fit2 <- contrasts.fit(fit, contrast.matrix)
#将对比后的模型转化为经验贝叶斯模型,以获得更可靠的差异信号估计
fit2 <- eBayes(fit2)
#这一步用于获取差异表达分析的结果
Output = topTable(fit2, coef=1, n=Inf)
write.table(Output,"wht.txt")
head(Output)
logFC AveExpr t P.Value adj.P.Val B
ENSG00000075624.12 12.392921 12.481448 43.24432 5.653268e-21 3.160177e-16 36.69579
ENSG00000198886.2 13.566915 13.431158 40.10286 2.452927e-20 6.855930e-16 35.91744
ENSG00000156508.16 12.315579 11.701774 33.38949 8.571419e-19 1.197856e-14 32.33785
ENSG00000009307.14 9.145128 8.631626 35.38586 2.784296e-19 5.188071e-15 31.69184
ENSG00000197746.12 10.120767 10.240915 32.13086 1.801616e-18 2.014207e-14 31.13041
ENSG00000196230.11 10.124573 9.532064 30.41885 5.183391e-18 3.621895e-14 30.02808
多维缩放图可以通过样本之间的距离来展示样本间的相似性或差异性,可以帮助我们观察样本聚类情况、批次效应等。
在差异基因分析中,可以使用多维缩放图来探索样本间的整体结构和分组情况。
# 计算样本间的表达差异距离
distance <- dist(t(v))
# 使用plotMDS函数绘制多维缩放图
plotMDS(distance, labels = colnames(v))
差异基因分析的目标:DESeq2和Limma都旨在识别在不同条件(例如不同组别、时间点或处理)之间表达差异显著的基因。
输入数据类型:两个包都适用于批次效应校正后的RNA-seq或微阵列表达数据。
基于假设检验的方法:DESeq2使用负二项分布模型来估计基因表达的离散性,并通过广义线性模型(GLM)和Wald统计检验来进行差异分析。Limma则采用另一种方法,即线性模型和经验贝叶斯方法,利用数据中的信息进行每个基因的精确统计检验。
样本大小和偏差:DESeq2适用于较小的样本大小,尤其在条件下有多个重复观测值的情况下表现得很好。Limma则在样本大小较大时可提供更稳健和准确的分析结果。
考虑基因表达的特征:DESeq2根据基因表达的离散性和方差-均值关系对数据进行归一化和差异分析。Limma则使用voom方法将RNA-seq数据转化为线性模型所需的稳定差异表达估计,考虑基因水平的方差-均值依赖性。
引入批次效应校正:DESeq2内建了考虑批次效应的功能,可以通过设计矩阵进行批次效应的调整。而Limma包一般需要额外对批次效应进行校正。
综上,结合 (R语言初识六),使用DESeq2包,主要使用的函数有DESeqDataSetFromMatrix() ; DESeq() ; results() ; plotMA().
而使用limma包的主要函数有 makeContrasts();voom() ; lmfit() ; contrasts.fit() ; eBayes() ; topTable() ; plotMDS() ; dist()
世上无难事,只要肯攀登
-2023-7-9 筑基篇