宏基因组TPM定量

news/2024/12/29 4:08:10/

        在RNA-Seq分析中,为了获取基因表达量差异,于是产生了RPKM、FPKM、TPM定量方法,去除测序深度和基因长度的影响。RPKM用于单端测序;FPKM用于双端测序。而TPM计算方法类似于RPKM,但更具有优势,是目前使用的较多的定量方法。详细的解释及计算公式:

https://www.jianshu.com/p/1940c5954c81

(建议学习一下,至少了解清楚TPM计算过程,否则得到比对结果后自己不知道怎么算TPM)

简单来说,TPM定量分为三步:

1. 基因长度标准化。测序reeads数除以基因长度length,得到RPK

2. 进行百万转换。因为计算的单位为M

3. 测序深度标准化。reads数除以总reads数即总RPK

宏基因组的定量用TPM是个不错的选择。

进行宏基因组的TPM定量,需要文件预测的CDS序列文件对应的fastq(cleandata)

软件安装:BWA和Samtools

#傻瓜式安装conda
#samtools
conda install -c bioconda samtools#bwa 
conda install -c bioconda bwa
#如果你会自己编译环境可以不用conda安装,反正能装上并且能使用就行

以bwa构建CDS序列索引进行比对

#构建索引
bwa index Unigene.fasta#例如我有5个样本A,B,C,D,E
for i in {A,B,C,D,E} \
do bwa mem -k 19 – t 24 Unigene.fasta \        
${i}_clean_R1.fastq ${i}_clean_R2.fastq > ./${i}.sam \ #压缩的fastq文件也可以,即后缀为gz
done

samtools提取比对到clean上的reads数

#Samtools转换sam文件为bam文件 1.3版本前 单个样本举例,多样本for循环
samtools view -bS sample.sam > sample.bam
samtools sort sample.bam > sample_sort.bam
samtools index sample_sort.bam#1.3版本后(sort将sam转化为bam与排序同时进行)
samtools sort sample.sam > sample_sort.bam
samtools index sample_sort.bam#获取每个ORF比对的read数
for i in {A,B,C,D,E} \
do samtools idxstats ${i}_sort.bam > ${i}_mapped.txt \
done
#注意,这一步之前需要经过sort和index

获得的txt结果有四列,从左至右分别是:基因名、基因长度、mapped_read、unmapped_read

 因为输出的文件不含表头,我们手动添加一个

for i in {A,B,C,D,E} \
do \
sed -i "1 i GeneID\t\length\tmapped_read\tunmapped_read " ${i}_mapped.txt \
done

 因为TPM计算是不需要unmapped_read的,所以只保留前面三列

for i in {A,B,C,D,E} \
do \
cut -f 1-3 ${i}_read.txt > ${i}_read_cut.txt \
done

这时候的文件就是我们需要的了,只需根据公式来计算即可以获得TPM ,这里我贴上用R语言和python计算的代码,比较简单。

R的脚本:

#读取文件
df <- read.delim("BJS_read.txt",header = T,row.names = 1)
#截取需要的部分
df_cut <- df[,1:2]
#计算RPK
df_cut$RPK <- df_cut$mapped_read*1000/df_cut$length
n <- nrow(df_cut)
result <- df_cut[-n,]#文件最后一行存在一个*行,含有NULL,需要去除掉才能计算,否则结果都为NULL
TotalRPK <- sum(result$RPK)
result$TPM <- (result$RPK*10e6)/TotalRPK
write.csv(result,file = "BJS_TPM.csv")

 python:

import pandas as pd
count = pd.read_table("BJS_read_test.txt",index_col=0)
count_part = count.iloc[:,[0,1]]
#n = count_part.shape[0]#获取数据框行列数
count_cut=count_part.drop(index="*")
#创建一个新的数据框
new_data = pd.DataFrame(columns=("RPK","TPM"))
df = pd.concat([count_part,new_data],axis=1)
df["RPK"] = df.apply(lambda x: (x["mapped_read"]*1000)/x["length"] ,axis=1)
TotalRPK = sum(df["RPK"])
df["TPM"]  = df.apply(lambda x: (x["mapped_read"]*10e6)/TotalRPK,axis=1)
result = df.iloc[:,[0,3]]
result.to_csv("BJStmp.csv",index=True,sep="\t")

两个的结果都一样,需要注意的是由sam文件到最后的txt文件的最后一行会含有一个*的行,代表的是未匹配到任何CDS的reads,需要在计算中将其去除。

最终会得到每个样本的TPM文件,可以使用python或者R中的merge函数将所有的样本TPM拼接到一起,得到一个最终的表格


http://www.ppmy.cn/news/211851.html

相关文章

【Protobuf速成指南】什么是Protobuf?

文章目录 一、序列化和反序列化1.1 概念1.2 场景1.3 如何序列化 二、Protobuf介绍1. 自身特点2.使用特点 一、序列化和反序列化 1.1 概念 &#x1f3af;[总结]: 序列化&#xff1a;把对象转换为字节序列的过程称为对象的序列化。反序列化&#xff1a;把字节序列恢复为对象的过…

10-风险管理:如何应对暗礁风险?系统化风险管理让你安心!

项目已到中期&#xff0c;目前看很顺利&#xff0c;但隐隐不安&#xff1a;项目进展越平稳&#xff0c;我越觉不安。我担心项目会不会存在什么风险&#xff0c;而自己却没发现。 这种担心很必要&#xff0c;因为项目从构思起&#xff0c;就存在风险。光担心没用&#xff0c;项…

Java-CAS(三)

Java-CAS(三) 基本概念 CAS的全称为Compare-And-Swap&#xff0c;直译就是对比交换。是一条CPU的原子指令&#xff0c;其作用是让CPU先进行比较两个值是否相等&#xff0c;然后原子地更新某个位置的值&#xff0c;经过调查发现&#xff0c;其实现方式是基于硬件平台的汇编指令…

c++游戏小技巧3:Sleep(停顿) 与 gotoxy(0,0) (无闪清屏)

因为篇幅原因&#xff0c;这一次我们讲两个小方法 目录 1.gotoxy 1.无闪清屏 2.移动到指定地点 2.Sleep 1.与gotoxy一起用 2.文字游戏必备 1.gotoxy 大家写游戏清屏用什么&#xff1f;&#xff1f;&#xff1f; 是不是一般都是 #include<bits/stdc.h> #includ…

【C语言】基础

在b站上看郝斌老师网课记的笔记 C语言的基本单位是函数&#xff0c;C语言是面向过程的高级语言。 文件后缀.c 规范写代码&#xff1a; 让别人看懂&#xff0c;不容易出错&#xff0c; 开头格式 /* 写程序时间&#xff1a; 功能&#xff1a; 目的&#xff1a; */ 结尾格式&am…

React18并发模式

前言 React18版本的发布标志着并发模式的正式应用&#xff0c;实际上自React16引入Fiber架构后&#xff0c;之后的版本工作之一就是为了后续并发模式的引入做铺垫。在具体说明并发模式之前首先需要明确并发的含义&#xff0c;这里会结合串行、并行概念对比并举例说明&#xff…

阿里P8架构师让我简历写精通AlibabaSentinel,结果收到P7的offer

有些程序员可能不知道阿里的职级是怎么划分的&#xff0c;下面就给大家介绍一下&#xff1a; ​ 从图上可以看出来&#xff0c;P7是技术专家&#xff0c;薪资在30W-50W&#xff0c;但是股票给到2400股&#xff0c;在大环境不好的情况下&#xff0c;还能给到这么高的薪水着实不错…

BIOS升级后的华硕P8P67 LE 主板支持i5 3570与之前G860对比性能质的飞跃,还能再战3年。(#^.^#)

升级前的配置&#xff1a; 升级后配置&#xff1a; 主板BIOS固件升级在华硕官网查找对应型号下载到U盘里面然后进入BIOS刷就可以。记住U盘&#xff0c;开始我放在第二个硬盘里面&#xff0c;读取不到。后方U盘就读到了。