转录本counts,FPKM,TPM相互转化

FPKM: Fragments Per Kilobase of exon model per Million mapped fragments(每千个碱基的转录每百万映射读取的fragments)

FPKM:Fragments per Kilobase Million,FPKM意义与RPKM极为相近。二者区别仅在于,Fragment 与 Read。RPKM的诞生是针对早期的SE测序,FPKM则是在PE测序上对RPKM的校正。只要明确​Reads 和 Fragments的区别,RPKM和FPKM的概念便易于区分。Reads即是指下机后fastq数据中的每一条Reads,Fragments则是指每一段用于测序的核酸片段,在SE中,一个Fragments只测一条Reads,所以,Reads数与Fragments数目相等;在PE中,一个Fragments测两端,会得到2条Reads,但由于后期质量或比对的过滤,有可能一个Fragments的2条Reads最后只有一条进入最后的表达量分析。总之,对某一对Reads而言,这2条Reads只能算一个Fragments,所以,Fragment的最终数目是Reads的1到2倍之间。

TPM:Transcripts Per Kilobase of exon model per Million mapped reads (每千个碱基的转录每百万映射读取的Transcripts)

1.  counts 转 FPKM

计算FPKM的三要素:原始counts矩阵,样本总reads数,基因长度。

# expr: counts 表达矩阵, 行:转录本,列:样本
# transcript_len$length 转录本长度
expr1 = expr/transcript_len$length 

fpkm = t(t(expr1)/colSums(expr)) * 10^9

2. counts 转 TPM

# expr: counts 表达矩阵
# transcript_len$length 转录本长度

expr1 = expr/transcript_len$length
fpkm = t(t(expr1)/colSums(expr)) * 10^9

tpm <- t(t(fpkm)/colSums(fpkm))*10^6

## 函数法
Counts2TPM <- function(counts, effLen){
  rate <- log(counts) - log(effLen)
  denom <- log(sum(exp(rate)))
  exp(rate - denom + log(1e6))}

tpm <- Counts2TPM(expr,transcript_len$length)

3. FPKM转TPM

tpm = t(t(fpkm)/colSums(fpkm))*10^6

## 函数法
# FPKM数据转为TPM数据
FPKM2TPM <- function(fpkm){
  exp(log(fpkm) - log(sum(fpkm)) + log(1e6))}

tpm <- apply(fpkm,2,FPKM2TPM)

limma,edgeR, DESeq2进行差异表达分析,要用原始counts矩阵。

FPKM可以用limma去运行,不过数值比较大的话要先进行log2转化。

EasyExcel是阿里巴巴开源的一个基于Java的Excel操作库,它提供了一种简单易用的方式来读取、写入以及处理Excel文件。关于合并单元格的问题,虽然EasyExcel本身主要是为了读写数据,而不是直接支持复杂的格式化功能,如合并单元格,但在实际操作中你可以通过一些间接的方式实现这个需求。 当你需要在写入数据时合并单元格,可以先将数据整理成易于处理的形式,例如,在Java中,你可以预先把需要合并的行和列的信息存储在一个List<Map<String, Object>>这样的数据结构中。然后,利用第三方库如Apache POI或者JExcelApi,它们提供了丰富的单元格操作API,包括合并单元格。你在写入EasyExcel的数据模型之前,可以使用这些库来调整数据格式,然后再转换回EasyExcel能接受的格式。 以下是一个简化示例: ```java // 假设data是一个List<Map<String, Object>>,其中包含了你需要合并的单元格信息 for (Map<String, Object> rowData : data) { // EasyExcel的数据写入逻辑 List<Row> rows = ...; // 从EasyExcel的model生成 for (Row row : rows) { Cell cell = row.createCell("合并列"); if (rowData.get("合并条件") != null) { // 判断是否满足合并条件 cell.setCellType(CellType.STRING); cell.setCellValue(rowData.get("合并内容")); // 使用POI或JExcelApi API 合并单元格 // cell.mergeCell(startRow, startCol, endRow, endCol); // 这部分取决于具体使用的库 } else { // 没有合并条件的单元格正常写入 row.addCell(cell); } } } ``` 请注意,这只是一个基本的思路,具体的合并单元格操作可能会因所选库的不同而略有差异。在实际应用中,你可能还需要处理异常和兼容性问题。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值