转录组差异分析方法整理(deseq2,edgeR,limma_voom)

news2024/10/2 6:30:54

三种最常用的差异分析方法(deseq2,edgeR,limma_voom)的整理。

目前在实际应用的过程中一般选择其中一种结果即可,或三种方法分析后结果取交集。

本次演示选择了GSE213615数据集,该数据集采用了两种肝癌细胞系,并使用索拉菲尼处理,最后得到了索拉菲尼耐药细胞,差异分析的目的是观察索拉菲尼耐药组相比于对照组而言的肝癌细胞基因变化情况。

差异分析前数据准备
1、导入数据并处理
rm(list = ls())
library(dplyr)

proj = "GSE213615"

# Raw-data已经被研究者所清洗,合并即可
file_directory = "~/desktop/dat/GSE213615_RAW" #设置路径
fs=list.files(file_directory) #列出路径下所有文件
exp = do.call(cbind,lapply(fs, function(x){
  # 读取文件
  a <- read.table(file.path(file_directory, x),
                  header = T, sep = '\t', row.names = NULL, 
                  quote = "",comment.char = "")
  # 去除lncRNA数据
  a <- a[!grepl("lncRNA", a$description),]
  # 提取含有 "Hep" 或 "Huh" 字样的列和 "symbol" 列
  selected_cols <- which(grepl("Hep|Huh", colnames(a)))
  selected_cols <- c(selected_cols, which(colnames(a) == "symbol"))
  a <- a[, selected_cols]
  
  # 提取文件名并去除扩展名
  file_name <- strsplit(basename(x), "_")[[1]][1]
  # 对列名进行重命名,使用文件名作为前缀
  colnames(a)[colnames(a) != "symbol"] <- file_name
  # 返回处理后的数据框
  return(a)
}))
exp[1:4,1:4]
# 这里do.call函数的作用是对后面的lapply函数中得到的数据进行cbind处理。
# lapply函数的作用是将fs中的每一个文件进行自定义函数处理,这里就是读取每一个文件。

exp <- distinct(exp, symbol, .keep_all = T)
rownames(exp) <- exp$symbol
exp <- exp[, !grepl("symbol", colnames(exp))]
2、提取临床信息
library(GEOquery)
eSet = getGEO("GSE213615",getGPL = F,destdir = ".")
eSet = eSet[[1]]
clinical = pData(eSet)
#提取自己需要的
colnames(clinical)
clinical = clinical[,c(1:2,47:48)]
3、基因过滤
#请注意这里必须是count数据!!!
#需要过滤一下那些在很多样本里表达量都为0或者表达量很低的基因。过滤标准不唯一。
#过滤之前基因数量:
nrow(exp)

# 仅保留在一半以上样本里表达的基因
exp = exp[apply(exp, 1, function(x) sum(x > 0) > 0.5*ncol(exp)), ]
nrow(exp)
exp =round(exp)
4、获取分组信息
k = stringr::str_detect(clinical$`treatment:ch1`,"None");table(k)
Group = ifelse(k,"control","resistent")
Group = factor(Group,levels = c("control","resistent"))
table(Group)
5、重新对clinical和exp数据进行排序整理
p = identical(rownames(clinical),colnames(exp));p
if(!p) {
  s = intersect(rownames(clinical),colnames(exp))
  exp = exp[,s]
  clinical = clinical[s,]
}
6、保存数据
#差异基因分析是count值,实在不行可以用tpm
save(exp,Group,proj,clinical,file = paste0(proj,".Rdata"))
deseq2差异分析
rm(list = ls()) 
options(stringsAsFactors = F)
library(ggplot2)
library(ggstatsplot)
library(ggsci)
library(RColorBrewer)
library(patchwork)
library(ggplotify)
library(limma)
library(edgeR)
library(DESeq2)

proj = "GSE213615"
load(file = paste0(proj,".Rdata")) 
# 这里的赋值是为了方便后面的分析过程
exprSet <- exp
group_list <- Group
# 制作分组表格
colData <- data.frame(row.names=colnames(exprSet), 
                      group_list=group_list) 
# 基因表达值变成整数
exprSet <- apply(exprSet, 2, as.integer)
rownames(exprSet) <- rownames(exp)
# 构建分析数据,exprSet,colData和group_list的排序必须一致
dds <- DESeqDataSetFromMatrix(countData = exprSet,
                              colData = colData,
                              design = ~ group_list)
dds <- DESeq(dds) 
# 这里的group_list需因子化
res <- results(dds, 
               contrast=c("group_list",
                          levels(group_list)[2],
                          levels(group_list)[1]))
# contrast函数规定了比较的顺序,是前者比后者,在这里就是resistent组比control组
levels(group_list)[2];levels(group_list)[1]
# [1] "resistent"
# [1] "control"

# 按照padj的顺序进行从小到大排序
resOrdered <- res[order(res$padj),]
head(resOrdered)
DEG =as.data.frame(resOrdered)
DEG_deseq2 = na.omit(DEG)
   
save(DEG_deseq2, 
     file =  'DEG_deseq2.Rdata' ) 

edgeR差异分析
proj = "GSE213615"
load(file = paste0(proj,".Rdata")) 
# 这里的赋值是为了方便后面的分析过程
exprSet <- exp
group_list <- Group
# 使用 DGEList 函数创建一个边缘回归(edgeR)的数据对象
d <- DGEList(counts=exprSet, 
             group= group_list)
# 使用cpm计算每个基因的Counts Per Million (CPM) 值。然后筛选出在至少两个样本中 CPM 大于1的基因,以过滤掉低表达的基因
keep <- rowSums(cpm(d)>1) >= 2
table(keep)
d <- d[keep, , keep.lib.sizes=FALSE]
# 重新计算每个样本的库大小(库中的总读数),并更新 d$samples 中的库大小信息。
d$samples$lib.size <- colSums(d$counts)
# 计算并应用标准化因子(Normalization Factors),这有助于在不同样本之间进行公平的比较。
d <- calcNormFactors(d)
d$samples

dge=d
# 创建无截距(intercept)的模型矩阵,将每个分组视为单独的模型参数
design <- model.matrix(~0+factor(group_list)) 
rownames(design)<-colnames(dge)
colnames(design)<-levels(factor(group_list))

# 估计所有基因的共有离散度(common dispersion)
dge <- estimateGLMCommonDisp(dge,design) 
# 估计基因表达水平随平均表达变化的趋势性离散度(trended dispersion)
dge <- estimateGLMTrendedDisp(dge, design)
# 估计每个基因特异性的离散度(tagwise dispersion),即对每个基因单独进行离散度估计
dge <- estimateGLMTagwiseDisp(dge, design)
# 根据设计矩阵 design 使用广义线性模型(GLM)拟合数据对象 dge,并返回拟合结果 fit
fit <- glmFit(dge, design)
# https://www.biostars.org/p/110861/
#使用广义线性模型对比两个组(这里的对比是第二组相对于第一组,即 contrast=c(-1, 1)),计算出每个基因的似然比检验(Likelihood Ratio Test)统计量
lrt <- glmLRT(fit,  contrast=c(-1,1)) 
# 从 lrt 结果中提取前 n 个基因(这里 n = nrow(dge) 表示提取所有基因)的差异表达结果
nrDEG=topTags(lrt, n=nrow(dge))

DEG_edgeR = as.data.frame(nrDEG)
head(DEG_edgeR)
 
save(DEG_edgeR, 
     file =  'DEG_edgeR.Rdata' ) 

limma-voom
proj = "GSE213615"
load(file = paste0(proj,".Rdata")) 
# 这里的赋值是为了方便后面的分析过程
exprSet <- exp
group_list <- Group
# 创建无截距的设计矩阵,其中每个分组作为单独的模型参数
design <- model.matrix(~0+factor(group_list))
colnames(design)=levels(factor(group_list))
rownames(design)=colnames(exprSet)
design
#            control resistent
# GSM6589876       0         1
# GSM6589877       0         1
# GSM6589878       0         1
# GSM6589879       1         0
# GSM6589880       1         0
# GSM6589881       1         0
# GSM6589882       0         1
# GSM6589883       0         1
# GSM6589884       0         1
# GSM6589885       1         0
# GSM6589886       1         0
# GSM6589887       1         0
# attr(,"assign")
# [1] 1 1
# attr(,"contrasts")
# attr(,"contrasts")$`factor(group_list)`
# [1] "contr.treatment"

# 使用DGEList函数创建一个edgeR的数据对象dge
dge <- DGEList(counts=exprSet)
# 计算并应用标准化因子(Normalization Factors)
dge <- calcNormFactors(dge)
# 计算Counts Per Million(CPM)值,并取对数变换
logCPM <- cpm(dge, log=TRUE, prior.count=3)
# voom 函数将RNA-seq数据转换为类似微阵列数据的格式,以便应用线性模型进行分析
v <- voom(dge,design,plot=TRUE, normalize="quantile")
# 使用线性模型拟合经过 voom 处理的数据 "v"
fit <- lmFit(v, design)
group_list
g1=levels(group_list)[1]
g2=levels(group_list)[2]
# 创建对比组字符串,表示将比较 g2 与 g1 的差异表达
con=paste0(g2,'-',g1)
cat(con)
# 创建一个对比矩阵,用于指定要比较的组别。con 是之前创建的对比字符串
cont.matrix=makeContrasts(contrasts=c(con),levels = design)
# 应用对比矩阵到线性模型 fit 中,得到 fit2
fit2=contrasts.fit(fit,cont.matrix)
# 使用经验贝叶斯方法对模型 fit2 进行调整,以提高统计精度
fit2=eBayes(fit2)
# 提取差异表达分析的结果
# n=Inf 表示提取所有基因。coef=con表示基于对比con提取结果。
tempOutput = topTable(fit2, coef=con, n=Inf)
DEG_limma_voom = na.omit(tempOutput) # 去除结果中的缺失值(NA)。
head(DEG_limma_voom)
 
save(DEG_limma_voom, 
     file =  'DEG_limma_voom.Rdata' ) 

参考资料:

1、deseq2:https://bioconductor.org/packages/devel/bioc/vignettes/DESeq2/inst/doc/DESeq2.html

2、edgeR:https://bioconductor.org/packages/release/bioc/vignettes/edgeR/inst/doc/edgeRUsersGuide.pdf

3、limma-voom: https://ucdavis-bioinformatics-training.github.io/2018-June-RNA-Seq-Workshop/thursday/DE.html

4、生信技能树:https://mp.weixin.qq.com/s/G7LQHvybW32Kn-jPYR7k6A

致谢:感谢曾老师,小洁老师以及生信技能树团队全体成员。

:若对内容有疑惑或者有发现明确错误的朋友,请联系后台(欢迎交流)。更多内容可关注公众号:生信方舟

- END -

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

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

相关文章

鸿蒙媒体开发【相机数据采集保存】音频和视频

相机数据采集保存 介绍 本示例主要展示了相机的相关功能&#xff0c;使用libohcamera.so 接口实现相机的预览、拍照、录像、前后置摄像头切换进行拍照、录像&#xff0c;以及对焦、曝光等控制类功能。 效果预览 使用说明 弹出是否允许“CameraSample”使用相机&#xff1f;…

CentOS上面的MySQL安装~~~保姆级教程

目录 0.声明 1.下载官网包包 2.新建文件夹&#xff0c;把rpm拖拽进来 3.安装yum源&#xff0c;查看前后变化 4.安装mysql服务 5.查看是否安装成功 6.出现报错的解决方案 7.启动MySQL 8.查看启动服务 9.配置文件 10.重新运行 11.免密码登录 12.再谈配置文件 0.声明…

【Unity】3D功能开发入门系列(四)

Unity3D功能开发入门系列&#xff08;四&#xff09; 一、组件的访问&#xff08;一&#xff09;组件的调用&#xff08;二&#xff09;组件的参数&#xff08;三&#xff09;引用别的组件&#xff08;四&#xff09;引用脚本组件&#xff08;五&#xff09;消息调用 二、物体的…

A*搜索算法 双向A*搜索算法 Julia实现

算法概述 抽象的在非负有向边权图 G ( V , E , W ) , W : E → R G (V, E, W), W: E \to \mathbb{R} G(V,E,W),W:E→R 上的 BFS 过程可以看作这样&#xff1a; (1) 设 C C C 点集表示已遍历的点&#xff0c; ∀ n ∈ C , d ( n ) \forall n \in C, d(n) ∀n∈C,d(n) 表示…

Leetcode75- 种花问题

间隔种花 也就是 0 0 0 或者开头 0 0 结尾 0 0 也就是这三个地方可以种花 然后分别判断 最后根据提交结果分析漏掉的情况 比如 n为0 和 数组长度只有一个的情况 使用枚举可以很快解题

技术男的审美反击:UI配置化新纪元

之前常常被甲方的领导说&#xff0c;我们全是一群钢铁直男&#xff0c;一点不懂审美&#xff0c;其实我们心里边想的 “您说得对啊&#xff01;&#xff01;&#xff01;&#xff01;” 这个可能和理工科有关系吧&#xff0c;理工男好像都差不多&#xff0c;所以这次我们就把很…

Vue的学习(二)

目录 一、class及style的绑定 1.v-bind:class绑定类名 绑定class为对象 ​编辑2. v-bind:class绑定类名 绑定class为对象 3.v-bind:class绑定类名 绑定class为数组 1) v-bind:class绑定类名 绑定class为数组 方法一&#xff1a; 2) v-bind:class绑定类名 绑定class为数组…

实验4-2-1 求e的近似值

//实验4-2-1 求e的近似值 /* 自然常数 e 可以用级数 11/1!1/2!⋯1/n!⋯ 来近似计算。 本题要求对给定的非负整数 n&#xff0c;求该级数的前 n1 项和。 输入格式:输入第一行中给出非负整数 n&#xff08;≤1000&#xff09;。 输出格式:在一行中输出部分和的值&#xff0c;保留…

nginx: [error] open() “/run/nginx.pid“ failed (2: No such file or directory)

今天 准备访问下Nginx服务&#xff0c;但是 启动时出现如下报错&#xff1a;&#xff08;80端口被占用&#xff0c;没有找到nginx.pid文件&#xff09; 解决思路&#xff1a; 1、 查看下排查下nginx服务 #确认下nginx状态 ps -ef|grep nginx systemctl status nginx#查看端口…

数据结构——时间和空间复杂度

目录 一、时间复杂度和空间复杂度是什么 二、为什么要有时间复杂度和空间复杂度 三、时间复杂度 四、空间复杂度 一、时间复杂度和空间复杂度是什么 在生活中&#xff0c;我们做一件事情需要花费一定的时间和一定的空间&#xff0c;举一个例子&#xff1a; 一个工厂需要制…

从根儿上学习spring 十一 之run方法启动第四段(5)

图15-AbstractAutowireCapableBeanFactory#doCreateBean方法 我们接着讲doCreateBean方法&#xff0c;之前对循环依赖做了些解释&#xff0c;我们接着往下看populateBean(beanName, mbd, instanceWrapper)方法 图15-572行 这行就是调用populateBean(beanName, mbd, instanceW…

目标检测——YOLOv10: Real-Time End-to-End Object Detection

YOLOv10是在YOLOv8的基础上&#xff0c;借鉴了RT-DETR的一些创新点改进出来的 标题&#xff1a;YOLOv10: Real-Time End-to-End Object Detection论文&#xff1a;https://arxiv.org/pdf/2405.14458源码&#xff1a;https://github.com/THU-MIG/yolov10 1. 论文介绍 在过去的几…

【C语言】详解feof函数和ferror函数

文章目录 前言1. feof1.1 feof函数原型1.2 正确利用函数特性读写文件1.2.1 针对文本文件1.2.2 针对二进制文件 1.3 feof函数的原理1.4 feof函数实例演示 2. ferror2.1 ferror函数原型 前言 或许我们曾在网络上看过有关于feof函数&#xff0c;都说这个函数是检查文件是否已经读…

Windows系统使用内网穿透配置Mysql公网地址实现IDEA远程连接

文章目录 前言1. 本地连接测试2. Windows安装Cpolar3. 配置Mysql公网地址4. IDEA远程连接Mysql5. 固定连接公网地址6. 固定地址连接测试 前言 IDEA作为Java开发最主力的工具&#xff0c;在开发过程中需要经常用到数据库&#xff0c;如Mysql数据库&#xff0c;但是在IDEA中只能…

【Python学习手册(第四版)】学习笔记15-文档(注释、PyDoc等)

个人总结难免疏漏&#xff0c;请多包涵。更多内容请查看原文。本文以及学习笔记系列仅用于个人学习、研究交流。 本文主要介绍程序的文档概念。包括为程序编写的注释&#xff0c;以及内置工具的文档。讲解文档字符串、Python的在线手册等资源、以及PyDoc的help函数和网页接口。…

蒙电通无人机航线规划系统 雷达点云电力应用软件

蒙电通无人机航线规划系统&#xff0c;它可进行标记杆塔、切档、自动对点云数据分类和点云抽稀等处理&#xff0c;按3张或6张照片自动生成航线&#xff0c;或按自定义航线模型生成航线&#xff0c;支持安全性检测。在满足当地巡检标准的前提下&#xff0c;系统操作非常简便。 …

llama神经网络的结构,llama-3-8b.layers=32 llama-3-70b.layers=80; 2000汉字举例说明

目录 llama-3-8b.layers=32 llama-3-70b.layers=80 llama神经网络的结构 Llama神经网络结构示例 示例中的输入输出大小 实际举例说明2000个汉字文本数据集 初始化词嵌入矩阵 1. 输入层 2. 嵌入层 3. 卷积层 4. 全连接层 llama-3-8b.layers=32 llama-3-70b.laye…

跑深度学习模型Ⅲ:正确安装与torch版本对应的其他torch包

pytorch的正确安装可以回看我前面的博客跑深度学习模型Ⅱ&#xff1a;一文安装正确pytorch及dgl-CSDN博客 这篇博客将安装torch_grometric&#xff0c;torch_scatter, torch_sparse, torch_cluster库 1. 查看自己的torch版本 进入cmd 切换到要用的python环境中&#xff0c;输…

ADB Installer 0 file(s)copied

在为泡面神器刷安卓&#xff0c;做准备工作装ADB时报错了&#xff0c;以下是报错提示 再用cmd命令adb version验证下&#xff0c;提示adb不是有效命令&#xff0c;百分百安装失败了&#xff0c;往上各种搜索查询均没有对症的&#xff0c;其中也尝试了安装更新版本的&#xff0c…

2024版本IDEA创建Servlet模板

IDEA 版本 2024.1.4 新版本的 IDEA 需要自己创建 Servlet 模板 旧版本 IDEA 看我这篇文章&#xff1a;解决IDEA的Web项目右键无法创建Servlet问题_2024idea无法创建servlet项目-CSDN博客文章浏览阅读216次&#xff0c;点赞7次&#xff0c;收藏3次。解决IDEA的Web项目右键无法创…