转录组丨limma差异表达分析,绘制火山图和热图

news2024/9/25 17:17:52

limma差异表达分析

本篇笔记的内容是在R语言中利用limma包进行差异表达分析,主要针对转录组测序得到的基因表达数据进行下游分析,并将分析结果可视化,绘制火山图热图

文章目录

  • limma差异表达分析
    • @[toc]
    • 环境部署与安装
    • 输入数据准备
    • 差异表达分析过程
      • 准备环节
      • 数据导入
      • 构建分组矩阵
      • 构建比较矩阵
      • 线性混合模拟
      • 差异基因标注
      • 结果保存
      • 区分上下调基因
      • 差异基因名称提取
      • 自定义筛选阈值
    • 结果可视化
      • 火山图绘制方法一
      • 火山图绘制方法二
      • 热图绘制

基因表达差异分析是我们做转录组最关键根本的一步,不管哪种差异分析,其本质都是广义线性模型,limma也是广义线性模型的一种,其对每个gene的表达量拟合一个线性方程。

limma包是2015年发表在Nucleic Acids Resarch一个做差异分析的工具,目前引用次数高达七千多次,最流行的差异分析软件之一就是limma。

环境部署与安装

  • 安装limma包
if (!require("BiocManager", quietly = TRUE))
    install.packages("BiocManager")

BiocManager::install("limma")
  • 安装ggVolcano包
# install.packages("devtools")
devtools::install_github("BioSenior/ggVolcano")
  • 安装ggplot2包
#直接安装tidyverse,一劳永逸(推荐,数据分析大礼包)
install.packages("tidyverse")
#直接安装ggplot2
install.packages("ggplot2")
#从Github上安装最新的版本,先安装devtools(如果没安装的话)
devtools::install_github("tidyverse/ggplot2")

输入数据准备

  • 样本信息表:第一列为样本名称ID,第二列为样本的分组(CK、HT),sampleinfo.csv格式如下

    这一步需要注意:每个分组下至少有两个生物学重复,即至少4行数据,如果没有重复的话在后续贝叶斯检验会出错,原因是该模型利用统计假设检验,多个重复能够评估变异性,而如果仅有一组数据,则无法检验。

    samplegroup
    A01CK
    A02HT
  • 表达矩阵:每行是一个基因,每列是一个样本,表达数据为TPM,data.csv格式如下

    A01A02
    gene1xxxx
    gene2xxxx

差异表达分析过程

准备环节

载入R包,设置参数,其中job变量用于项目输出文件前缀标识,可以自定义修改。

setwd("D:/LABdata")
options(stringsAsFactors = F)
rm(list=ls()) #清空变量
job <- "test" #设定项目名称
library(limma)
library(ggplot2) #用于绘制火山图
library(ggVolcano)

数据导入

导入样本信息和表达量数据,然后进行删除表达量之和为0基因、log2化、替换异常值等步骤,得到原始数据矩阵。

# 输入表达矩阵和分组文件 -------------------------------------------------------------

expr_data<-read.csv("data.csv",header = T,row.names = 1,sep = ",") #输入文件TPM原始值,行名是基因,列名是样本
expr_data <- expr_data[which(rowSums(expr_data)!=0),] #删除表达量为0的基因
expr_data = log2(expr_data) #log化处理
expr_data[expr_data == -Inf] = 0 #将log化后的负无穷值替换为0
group<-read.csv("sampleinfo.csv",header = T,row.names = 1,sep = ",") #输入文件,样本信息表,包含分组信息

构建分组矩阵

根据样本的分组信息,构建分组矩阵,最终得到的design矩阵由0和1构成,为斜对角矩阵。

# 构建分组矩阵--design ---------------------------------------------------------

design <- model.matrix(~0+factor(group$group))
colnames(design) <- levels(factor(group$group))
rownames(design) <- colnames(expr_data)

构建比较矩阵

设置样本的比较方式,这里为CK对照比HT处理,该步骤生成的文件为1和-1构成的矩阵。

# #构建比较矩阵——contrast -------------------------------------------------------

contrast.matrix <- makeContrasts(CK-HT,levels = design) #根据实际的样本分组修改,这里对照组CK,处理组HT

线性混合模拟

该步骤是limma包的核心步骤,首先使用lmFit函数进行非线性最小二乘法分析,然后用经验贝叶斯调整t-test中方差部分,得到差异表达结果。

# #线性拟合模型构建 ---------------------------------------------------------------

fit <- lmFit(expr_data,design) #非线性最小二乘法
fit2 <- contrasts.fit(fit, contrast.matrix)
fit2 <- eBayes(fit2)#用经验贝叶斯调整t-test中方差的部分
DEG <- topTable(fit2, coef = 1,n = Inf,sort.by="logFC")
DEG <- na.omit(DEG)

最终生成的DEG文件包含以下几列信息:

> colnames(DEG)
[1] "logFC"     "AveExpr"   "t"         "P.Value"   "adj.P.Val" "B"        
[7] "regulate"  "Genes"    

差异基因标注

本步骤中对P.ValuelogFC进行筛选,并对每个基因进行标注,显示其表达变化情况。

DEG$regulate <- ifelse(DEG$P.Value > 0.05, "unchanged",
        ifelse(DEG$logFC > 1, "up-regulated",
        ifelse(DEG$logFC < -1, "down-regulated", "unchanged")))

结果保存

生成两个文件,保存差异表达结果。

write.table(table(DEG$regulate),file = paste0(job,"_","DEG_result_1_005.txt"),
            sep = "\t",quote = F,row.names = T,col.names = T)
write.table(data.frame(gene_symbol=rownames(DEG),DEG),file = paste0(job,"_","DEG_result.txt"),
            sep = "\t",quote = F,row.names = F,col.names = T)

区分上下调基因

该步骤中DEG$P.Value<0.05&abs(DEG$logFC)>1为参数,筛选了差异倍数和显著性,并将基因按照上调和下调进行区分。

DE_1_0.05 <- DEG[DEG$P.Value<0.05&abs(DEG$logFC)>1,]
upGene_1_0.05 <- DE_1_0.05[DE_1_0.05$regulate == "up-regulated",]
downGene_1_0.05 <- DE_1_0.05[DE_1_0.05$regulate == "down-regulated",]
write.csv(upGene_1_0.05,paste0(job,"_","upGene_1_005.csv"))
write.csv(downGene_1_0.05,paste0(job,"_","downGene_1_005.csv"))

差异基因名称提取

提取差异倍数最大的1000个基因,按照顺序保存到txt文本中,只保留基因名称ID,用于后续验证。

tem1 <- head(rownames(upGene_1_0.05),1000) #以logFC差异倍数从大到小为序,提取前1000个基因名称
tem2 <- as.data.frame(tem1) # 转化数据类型为数据框
write.table(tem2$tem,file = paste0(job,"_","upgene_head100_name.txt"),
          row.names = FALSE,col.names = FALSE)

tem1 <- head(rownames(downGene_1_0.05),1000) #以logFC差异倍数从大到小为序,提取前1000个基因名称
tem2 <- as.data.frame(tem1) # 转化数据类型为数据框
write.table(tem2$tem,file = paste0(job,"_","downgene_head100_name.txt"),
          row.names = FALSE,col.names = FALSE)

自定义筛选阈值

之前的结果均为默认设置,如果你需要修改,仅需更改下面开头两行参数即可,运行后可以得到3个文件,分别是差异基因集、上下调过滤所得基因信息。

foldChange = 2 # 自定义修改筛选参数
padj = 0.05 # 自定义修改筛选参数
All_diffSig <- DEG[(DEG$adj.P.Val < padj & (DEG$logFC > foldChange | DEG$logFC < (-foldChange))),]
#dim(All_diffSig)
write.csv(All_diffSig, paste0(job,"_","all_diffsig_filtered.csv"))  ##输出差异基因数据集

### 自定义筛选上调和下调的基因 ===================================================================

diffup <-  All_diffSig[(All_diffSig$P.Value < padj & (All_diffSig$logFC > foldChange)),]
write.csv(diffup, paste0(job,"_","diffup_filtered.csv"))
diffdown <- All_diffSig[(All_diffSig$P.Value < padj & (All_diffSig$logFC < -foldChange)),]
write.csv(diffdown, paste0(job,"_","diffdown_filtered.csv"))

利用limma分析后,正常情况下应该会生成下面这些数据文件,可以用于验证过程中是否有问题。

image-20230222202113721

结果可视化

火山图绘制方法一

有了上面的DEG差异分析结果,根据gene、logFC、adj.P.Val三列信息即可绘制火山图,第一种方法使用ggvolcano,绘图代码如下:

# ggvolcano绘制火山图 ----------------------------------------------------------

pdf(paste0(job,"_","volcano1.pdf"),width = 10,height = 10)
ggvolcano(data = DEG,x = "logFC",y = "P.Value",output = FALSE,label = "Genes",
          fills = c("#00AFBB", "#999999", "#FC4E07"),
          colors = c("#00AFBB", "#999999", "#FC4E07"),
          x_lab = "log2FC",
          y_lab = "-Log10P.Value",
          legend_position = "UR") #标签位置为up right
dev.off()

image-20230222202352090

火山图绘制方法二

第二种方法使用ggplot2,得到另外一种形式的火山图,绘图代码如下:

# 火山图的绘制 ------------------------------------------------------------------

DEG$Genes <- rownames(DEG)
pdf(paste0(job,"_","volcano2.pdf"),width = 7,height = 7)
ggplot(DEG,aes(x=logFC,y=-log10(P.Value)))+ #x轴logFC,y轴adj.p.value
  geom_point(alpha=0.5,size=2,aes(color=regulate))+ #点的透明度,大小
  ylab("-log10(P.Value)")+ #y轴的说明
  scale_color_manual(values = c("blue", "grey", "red"))+ #点的颜色
  geom_vline(xintercept = c(-1,1),lty=4,col ="black",lwd=0.8)+ #logFC分界线
  geom_hline(yintercept=-log10(0.05),lty=4,col = "black",lwd=0.8)+ #adj.p.val分界线
  theme_bw()  #火山图绘制
dev.off()

image-20230222202415207

热图绘制

根据基因的表达变化信息,绘制热图并展示聚类树,详细代码如下:

# 热图的绘制 -------------------------------------------------------------------

DEG_genes <- DEG[DEG$P.Value<0.05&abs(DEG$logFC)>1,]
DEG_gene_expr <- expr_data[rownames(DEG_genes),]
#DEG_gene_expr[is.infinite(DEG_gene_expr)] = 0
#DEG_gene_expr[DEG_gene_expr == -Inf] = 0
pdf(paste0(job,"_","pheatmap.pdf"))
pheatmap(DEG_gene_expr,
         color = colorRampPalette(c("blue","white","red"))(100), #颜色
         scale = "row", #归一化的方式
         border_color = NA, #线的颜色
         fontsize = 10, #文字大小
         show_rownames = F)
dev.off()

image-20230222202505089

参考资料:https://zhuanlan.zhihu.com/p/437712423

本文由mdnice多平台发布

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/367318.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

java JMM 内存屏障

内存屏障的目的 每个CPU都会有自己的缓存&#xff08;有的甚至L1,L2,L3&#xff09;&#xff0c;缓存的目的就是为了提高性能&#xff0c;避免每次都要向内存取。但是这样的弊端也很明显&#xff1a;不能实时的和内存发生信息交换&#xff0c;分在不同CPU执行的不同线程对同一…

你真的需要文档管理软件吗?

什么是文档管理软件&#xff1f; 文档管理软件 (DMS) 是一种数字解决方案&#xff0c;可帮助组织处理、捕获、存储、管理和跟踪文档。 通过严格管理您的关键业务信息&#xff0c;您可以开发以稳定、可预测、可衡量的方式启动、执行和完成的流程。 如果没有功能齐全的文档管理软…

堆-优先队列priorityqueue原理和应用

java中PriorityQueue优先队列 优先队列 &#xff1a;底层是用数组实现的二叉堆&#xff0c;因为堆通常分为大顶堆或者小顶堆&#xff0c;所以优先队列可以获取每次出来的都是最大或者最小元素&#xff08;对象可以实现比较器&#xff0c;Java优先级队列默认每次取出来的为最小元…

RocketMQ-NameServer详解

RocketMQ 路由管理 服务注册及服务发现由NameServer提供。 服务发现&#xff1a; 分布式服务 SOA&#xff08;全称&#xff1a;Service Oriented Architecture 面向服务的架构&#xff09;构体系中会有服务注册中心&#xff0c;分布式服务 SOA 的注册中心主要提供服务调用的解析…

10套“2023年软考备考资料”送给你

距离软考考试越来越近了&#xff0c;备考的形势越发紧张了。考点那么多&#xff0c;我们需要抓出常考的大部分知识点。 ​为此&#xff0c;为大家整理了《2023年软考免费备考资料》&#xff0c;内含软考各科目不同类型共10套备考资料。 ​ 第1套&#xff1a;早鸟学习计划&am…

华为OD机试题,用 Java 解【密室逃生游戏】问题

最近更新的博客 华为OD机试 - 猴子爬山 | 机试题算法思路 【2023】华为OD机试 - 分糖果(Java) | 机试题算法思路 【2023】华为OD机试 - 非严格递增连续数字序列 | 机试题算法思路 【2023】华为OD机试 - 消消乐游戏(Java) | 机试题算法思路 【2023】华为OD机试 - 组成最大数…

使用matlab生成符合哈工大学报的图片格式

前言 去年投稿了哈尔滨工业大学学报&#xff0c;因为模板问题没有过于要求投稿的细节&#xff0c;所以出图都是按照自己的风格来的。录用前的最后要求时需要修改图片格式&#xff0c;具体是表示成函数图&#xff0c;并且横纵坐标保持相同的精确位数。我想那么多图片我咋搞呀&a…

Elasticsearch(一)——部署

最近遇到一个需求&#xff0c;需要用到Elasticsearch&#xff0c;于是开始学习Elasticsearch。 我是个学东西先学实操再理论的人。所以开始着手安装Elasticsearch&#xff0c;并进行记录。 目录一、Elasticsearch部署Windows安装1 下载2 解压3 配置文件3.1 jvm.options3.2 elas…

没有公网IP,如何实现内网用友ERP的外网访问 ?

用友是全球领先的企业云服务与软件提供商&#xff0c;在财务、人力、供应链、采购、制造、营销、研发、项目、资产、协同等领域为客户提供数字化、智能化、社会化的企业云服务产品与解决方案。 U8C是用友针对成长型、创新型企业&#xff0c;提供企业级ERP整体解决方案。在系统…

【软件测试】自动化测试的追求,水土不服?看看资深测试咋说的......

目录&#xff1a;导读前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09;前言 大部分测试初学者入…

mysql存储位置 、数据类型

在线版 mysql0.80 版本 数据库存放位置默认为:C:\ProgramData\MySQL\MySQL Server 8.0 mysql数据类型(来自黑马) 数据类型大小描述备注TINYINT1 byte小整数值SMALLINT2 bytes大整数值MEDIUMINT3 bytes大整数值INT或INTEGER4 bytes大整数值age intBIGINT8 bytes极大整数值F…

MQRabbitMQ

介绍 MQ&#xff0c;中文是消息队列&#xff08;MessageQueue&#xff09;&#xff0c;字面来看就是存放消息的队列。也就是事件驱动架构中的Broker。 几种常见MQ的对比 RabbitMQActiveMQRocketMQKafka公司/社区RabbitApache阿里Apache开发语言ErlangJavaJavaScala&Java…

车载开发知识交流【学习路线】

前言 在2023国内百废待兴&#xff1b;经济复苏的号召一直在响应&#xff0c;这对于压抑了三年的人民来说无疑是福音。这篇我们主要说一下拉动经济的其中大板块——车企&#xff1b;我们知道我们最大的经济除了房地产&#xff0c;第二就是车企。而在造车领域中也不断的加入了许…

CF1692C Where‘s the Bishop? 题解

CF1692C Wheres the Bishop? 题解题目链接字面描述题面翻译题目描述题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1提示代码实现题目 链接 https://www.luogu.com.cn/problem/CF1692C 字面描述 题面翻译 题目描述 有一个888\times888的棋盘&#xff0c;列编号从…

【Android视频号② 搜索用户】

上一节我们已经拿到了视频号个人主页信息 但是发现传过来的用户名是一个以V2开头的数据 接下来我们就需要根据用户名去获取V2数据 DDMS问题 上一节根据ddms 可以很好的定位到视频号触发点 但是很多人会遇到一个问题就是 Monitor 使用 如果打开报错 需要装Java1.8 版本太高了…

运维排查篇 | Linux 连接跟踪表满了怎么处理

nf_conntrack (在老版本的 Linux 内核中叫 ip_conntrack )是一个内核模块&#xff0c;用于跟踪一个网络连接的状态 一旦内核 netfilter 模块 conntrack 相关参数配置不合理&#xff0c;导致 nf_conntrack table full &#xff0c;就会出现丢包、连接无法建立的问题 这个问题其…

电子技术——反馈放大器的分析方法总结

电子技术——反馈放大器的分析方法总结 第一种也是最简单的估算方法&#xff0c;直接拿出反馈网络&#xff0c;计算 β\betaβ 则假设在 AβA\betaAβ 无限大的情况下有 Af≃1/βA_f \simeq 1/\betaAf​≃1/β 。开环法。比第一种方法更能精确的估计 AAA 和 β\betaβ 的值。系…

js的异步方法:promise与定时器相遇,碰到的火花

前言&#xff1a; 我们在项目中长使用的异步方法 promise与定时器 在一起后&#xff0c;他们的顺序是什么样呢&#xff1f;这里来说一说。 案例1&#xff1a; console.log(异步打印顺序&#xff1a;);console.log(1);setTimeout(()>{console.log(2);},2000)setTim…

APP 兼容性测试是什么?10年阿里测试老鸟告诉你......

1、APP 兼容性测试认识 随着 APP 应用范围越来越广&#xff0c;用户群体越来越大&#xff0c;终端设备的型号也越来越多&#xff0c;移动终端碎片化加剧&#xff0c;使得 APP 兼容性测试成为测试质量保障必须要考虑的环节。 APP 兼容性测试通常会考虑&#xff1a;操作系统、厂…

firefly开发板RK3588非默认外设使能(串口uart、IIC、adc等)设备树修改详细步骤

sdk获取和内核编译&#xff0c;参考上一篇博文&#xff1a;rk3588内核裁剪 一、相关文件 文件1&#xff1a; rk3588_repo_sdk_v1.0.2a/kernel/arch/arm64/boot/dts/rockchip/rk3588-firefly-itx-3588j.dtsi此文件是针对firefly的板级设备树文件。 文件2&#xff1a; rk3588…