HISAT2 - StringTie - DESeq2 pipeline 进行bulk RNA-seq

2023-05-16

软件官网:

Hisat2: Manual | HISAT2

StringTie:StringTie

文章:Transcript-level expression analysis of RNA-seq experiments with HISAT, StringTie and Ballgown | Nature Protocols

建议看保姆级教程:

1. RNA-seq : Hisat2+Stringtie+DESeq2 – 恒诺新知

2. RNA-seq用hisat2、stringtie、DESeq2分析 - 简书

基本用法:

1. 构建参考基因组索引

# 提取剪接位点和外显子信息
extract_splice_sites.py Mus_musculus.GRCm39.104.gtf > Mus_musculus.ss
extract_exons.py Mus_musculus.GRCm39.104.gtf > Mus_musculus.exon
# 建立索引
# 最后的 Mus_musculus.GRCm39_tran 为索引文件前缀
hisat2-build --ss Mus_musculus.ss --exon Mus_musculus.exon              Mus_musculus.GRCm39.dna.primary_assembly.fa \
               Mus_musculus.GRCm39_tran
# 时间超长,大于12h,建议晚上跑

2. 参考基因组比对

# -x跟索引名前缀,-1,-2跟双端测序文件,-U跟单端测序文件,-S输出为sam格式的文件,-p线程数量
# 我们直接输出为排序好的bam文件
# --dta输出为转录本组装的reads,--summary-file输出比对信息
hisat2 -p 10 --dta -x path/to/Mus_musculus.GRCm39_tran 
         --summary-file test1_summary.txt 
         -1 1.fastq-data/test1_R1_rep1.fq.gz 
         -2 1.fastq-data/test1_R2_rep1.fq.gz 
         -S test1.sam

3. samtools 对输出 sam 文件排序并转为 bam 文件

# -@为samtools的线程数
samtools sort -@ 10 -o test1.sorted.bam test.sam

4. 转录本组装

# 组装转录本,-p为线程数,-G为组装参考注释文件,-l为输出文件名前缀
# 单个样本运行
stringtie -p 10 -G Mus_musculus.GRCm38.102.gtf 
                -l test1 
                -o test1.gtf 
                test1.sorted.bam

5. 注释文件合并

# 创建 mergelist.txt 文件,指明组装后注释文件的路径
path/to/test1.gtf
path/to/test2.gtf
path/to/test3.gtf

# 合并gtf文件
$ stringtie --merge -p 10 -G ./Mus_musculus.GRCm38.102.gtf 
                    -o stringtie_merged.gtf 
                    mergelist.txt

6. 利用生成的注释文件对转录本进行定量

# 创建一个新的 test1 文件夹,转录本定量结果保存到文件夹中
mkdir test1/
stringtie  -p 10 -e -G ./stringtie_merged.gtf 
             -o test1/test1.gtf 
             -A test1/gene_abundances.tsv 
             test1.sorted.bam
# 相应文件夹下生成样本名.gtf和gene_abundances.tsv的两个文件,对应每个样本的 count 值定量结果,我们需要合并到一个文件里。

7. 提取基因定量结果

prepDE.py 需要一个 sample_list,第一列为样本名,第二列为 gtf 文件路径

# sample_list.txt 文件内容如下
test1 path/to/test1/test1.gtf
test2 path/to/test1/test2.gtf
test3 path/to/test1/test3.gtf
test4 path/to/test1/test4.gtf

# 提取合并count结果,-i为输入sample_list
prepDE.py -i sample_list.txt

# 生成gene_count_matrix.csv和transcript_count_matrix.csv文件

8. 选做:提取 FPKM/TPM 或 coverage 结果

需要用到stringtie_expression_matrix.pl,下载地址如下:

rnaseq_tutorial/stringtie_expression_matrix.pl at master · griffithlab/rnaseq_tutorial · GitHub

# 提取TPM
$ ./stringtie_expression_matrix.pl --expression_metric=TPM 
                                   --result_dirs='test1_rep1,test1_rep2,test2_rep1,test2_rep2' 
                                   --transcript_matrix_file=transcript_tpms_all_samples.tsv 
                                   --gene_matrix_file=gene_tpms_all_samples.tsv

# 提取FPKM
./stringtie_expression_matrix.pl --expression_metric=FPKM 
                                   --result_dirs='test1_rep1,test1_rep2,test2_rep1,test2_rep2' 
                                   --transcript_matrix_file=transcript_fpkms_all_samples.tsv 
                                   --gene_matrix_file=gene_fpkms_all_samples.tsv

# 提取coverage
./stringtie_expression_matrix.pl --expression_metric=coverage 
                                   --result_dirs='test1_rep1,test1_rep2,test2_rep1,test2_rep2' 
                                   --transcript_matrix_file=transcript_coverage_all_samples.tsv 
                                   --gene_matrix_file=gene_coverage_all_samples.tsv
# 在当前目录就会生成相应的基因和转录本的tpm、fpkm、coverage 结果

9. DESeq2 差异分析

# 安装DESeq2包
BiocManager::install('DESeq2')
# 加载包
library(DESeq2)
# 设置工作路径
setwd('D:rnaseq')
# 读入counts矩阵
gene_count_matrix <- read.csv("D:/rnaseq/gene_count_matrix.csv",row.names = 1)
count <- gene_count_matrix[rowSums(gene_count_matrix)>0,]
# 构建表型矩阵
colData <- data.frame(row.names = colnames(count),
                      condition = factor(c(rep('control',2),rep('treat',2)),
                                           levels=c('control','treat'))
                      )
# 查看
colData
#            condition
# test1_rep1   control
# test1_rep2   control
# test2_rep1     treat
# test2_rep2     treat

dds <- DESeqDataSetFromMatrix(countData = count, colData = colData,design = ~ condition)
dds <- DESeq(dds)
res <- results(dds)
diff_res <- as.data.frame(res)
diff_res$gene_name <- rownames(diff_res)
# 输出差异结果
write.table(diff_res,file = 'DESeq2_diff_results.csv',quote = F,sep = ',',row.names = F,col.names = T)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

HISAT2 - StringTie - DESeq2 pipeline 进行bulk RNA-seq 的相关文章

  • 使用jedis管道获取值

    我有一个 id 列表 我想用它来使用 java 客户端 jedis 从 Redis 服务器检索哈希值 正如文档中提到的 Jedis 提供了一种通过声明 Response 对象来使用管道的方法 然后同步管道以获取值 Pipeline p je
  • Reasonml 中 -> 和 |> 有什么区别?

    经过一段时间的激烈谷歌搜索 我得到了一些例子 人们在一个代码中使用两种类型的运算符 但通常它们看起来就像做一件事的两种方式 它们甚至具有相同的名称 tl dr 决定性的区别在于 gt 管道到第一个参数 同时 gt 管道到最后 那是 x gt
  • Django:批量操作

    商业 我遇到了一个问题 当使用 Django ORM 操作大型数据集时 规范的方法是操作每个元素 但当然这种方式效率很低 所以我决定使用原始 SQL 物质 我有一个形成 SQL 查询的基本代码 它更新表的行并提交它 from myapp i
  • Gitlab CI:仅在工件存在时运行作业

    我有 monorepo 我想根据已更改的目录内容运行子管道 在工作中prepare config我检查最新更改在哪里 我创建子配置 yml 并在下一阶段的工作中run child我从 运行子管道 问题是 如果model gitlab ci
  • RESTful API 和批量操作

    我有一个中间层 它在共享数据库上执行 CRUD 操作 当我将产品转换为 NET Core 时 我想我还会考虑使用 REST 作为 API 因为 CRUD 应该是它擅长的地方 看起来 REST 对于单条记录操作来说是一个很好的解决方案 但是当
  • Javamail,Transport.send() 非常慢

    我写了一个批量发送电子邮件的方法 但它非常非常慢 每 10 秒大约 3 封邮件 我想发送数千封邮件 有什么办法可以更快地做到这一点吗 我现在使用 gmail 但仅用于测试 最后我想使用我自己的 SMTP 服务器发送 这是代码 public
  • 使用 Batchblock.Triggerbatch() 在 TPL 数据流管道中进行数据传播

    在我的生产者 消费者场景中 我有多个消费者 每个消费者都向外部硬件发送一个操作 这可能需要一些时间 我的管道看起来有点像这样 BatchBlock gt TransformBlock gt BufferBlock gt 几个 ActionB
  • MySQL 批量插入或更新

    有没有办法批量执行查询 例如INSERT OR UPDATE在 MySQL 服务器上 INSERT IGNORE 不起作用 因为如果该字段已经存在 它将简单地忽略它并且不插入任何内容 REPLACE 不起作用 因为如果该字段已经存在 它将首
  • 在 PowerShell 中使用管道连接的 ffmpeg 和 ffplay

    我已将当前的视频项目从命令提示符切换到 PowerShell 以便我可以充分利用Tee Object对于多输出代码 目前 我有一个批量运行的代码版本 但我需要通过 T 恤添加一项功能 这是我第一次使用 PowerShell 所以这可能是一个
  • 从 GitLab 运行程序/管道中创建版本

    随着 2019 年 1 月 Gitlab 11 7 的发布 我们获得了新的关键功能为您的项目发布版本 https about gitlab com 2019 01 22 gitlab 11 7 released publish releas
  • Github 操作 `on` 中没有定义事件触发器

    我创建了一个管道 我想在每次推送任何分支时触发 有我的default yml name default on push branches jobs build runs on macOS latest steps uses actions
  • C# TPL 数据流 - 完成不起作用

    此代码永远不会到达最后一行 因为完成不会从 saveBlock 传播到 sendBlock 我究竟做错了什么 var readGenerateBlock new TransformBlock
  • python 管道中的特征选择:如何确定特征名称?

    我使用 pipeline 和 grid search 选择最佳参数 然后使用这些参数来拟合最佳管道 best pipe 然而 由于 feature selection SelectKBest 处于管道中 因此尚未对 SelectKBest
  • Bash 错误:需要整数表达式

    在下面的部分中 您将看到我尝试在 UNIX 计算机上运行的 shell 脚本以及脚本 当我运行这个程序时 它给出了预期的输出 但它也给出了记录中显示的错误 可能是什么问题以及如何解决它 首先 脚本 usr bin bash while re
  • scikit learn Pipeline 是否将 StandardScaler 应用于 y?

    鉴于我的管道是 pipe Pipeline scaler StandardScaler regressor LinearRegression 然后我打电话pipe fit X train y train 管道是否将缩放器应用于特征和目标 还
  • 在获得响应之前发出多个请求

    当并行发送多个请求时 在获得响应之前 我无法理解 HTTP 的工作原理 有两种情况 1 With Connection Keep Alive 根据HTTP规范 http www w3 org Protocols rfc2616 rfc261
  • 如何将node.js管道传输到redis?

    我有很多数据要插入 SET INCR 到redis DB 所以我正在寻找pipeline http redis io topics pipelining 质量插入 http redis io topics mass insert通过node
  • 从 azure pipeline.yml 将变量组参数传递到模板时出现问题

    我已经声明了一个变量组Agile Connections 如下所示 该组对任何管道没有任何限制 我正在使用另一个名为 vars yml 的模板来存储一些其他变量 variables group Agile Connections name
  • 如何使用ssh直接连接远程docker容器

    我想直接使用 ssh 连接到远程运行的 Docker 容器 通常我可以 ssh i privateKey user host docker ps which will list all running containers docker e
  • PHP 资产管道/框架

    背景 我正在致力于 现代化 一个现有的 PHP 驱动的网站 该网站最初是一个带有一些 php 方法的静态网站 它现在有一个移动网络应用程序 多个模型和大量动态内容 然而 随着时间的推移 应用程序本身的结构与它主要是静态站点时相比并没有太大变

随机推荐